Sfoglia il codice sorgente

Merge branch 'feature/first_java' into develop

2643616413 6 giorni fa
parent
commit
1841eacc52
39 ha cambiato i file con 2292 aggiunte e 0 eliminazioni
  1. 8 0
      .idea/.gitignore
  2. 9 0
      .idea/AI-tagging.iml
  3. 6 0
      .idea/misc.xml
  4. 8 0
      .idea/modules.xml
  5. 6 0
      .idea/vcs.xml
  6. BIN
      server/.gitignore
  7. 37 0
      server/pom.xml
  8. 179 0
      server/yusp-tagging-core/pom.xml
  9. 47 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/RedisConfig.java
  10. 46 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/TabAppController.java
  11. 27 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/TestController.java
  12. 16 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TabAppCreateDTO.java
  13. 82 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabApp.java
  14. 373 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabLog.java
  15. 103 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabTagCategory.java
  16. 189 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabTagInfo.java
  17. 35 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/TabAppMapper.java
  18. 15 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/TabAppService.java
  19. 12 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/Test.java
  20. 95 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/TabAppServiceImpl.java
  21. 15 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/TestImplService.java
  22. 49 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/util/DataUtil.java
  23. BIN
      server/yusp-tagging-core/src/main/resources/cert/pwd_private.key
  24. BIN
      server/yusp-tagging-core/src/main/resources/cert/pwd_public.key
  25. 14 0
      server/yusp-tagging-core/src/main/resources/mapper/DetailCrRuleMapper.xml
  26. 69 0
      server/yusp-tagging-core/src/main/resources/mapper/DetailFillTaskInsMapper.xml
  27. 86 0
      server/yusp-tagging-core/src/main/resources/mapper/TabAppMapper.xml
  28. 99 0
      server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties
  29. 99 0
      server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg_en.properties
  30. 99 0
      server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg_zh.properties
  31. BIN
      server/yusp-tagging-core/src/main/resources/template/detail_col_template.xlsx
  32. 246 0
      server/yusp-tagging-starter/pom.xml
  33. 16 0
      server/yusp-tagging-starter/src/main/java/cn/com/yusys/yusp/detail/App.java
  34. 51 0
      server/yusp-tagging-starter/src/main/resources/application.yml
  35. 25 0
      server/yusp-tagging-starter/src/main/resources/bootstrap.yml
  36. 8 0
      server/yusp-tagging-starter/src/main/scripts/deploy.sh
  37. 17 0
      server/yusp-tagging-starter/src/main/scripts/shutdown.sh
  38. 1 0
      server/yusp-tagging-starter/src/main/scripts/startup.cmd
  39. 105 0
      server/yusp-tagging-starter/src/main/scripts/startup.sh

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 9 - 0
.idea/AI-tagging.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 6 - 0
.idea/misc.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/AI-tagging.iml" filepath="$PROJECT_DIR$/.idea/AI-tagging.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

BIN
server/.gitignore


+ 37 - 0
server/pom.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>cn.com.yusys.yusp</groupId>
+    <parent>
+        <artifactId>yusp-dependencies</artifactId>
+        <groupId>cn.com.yusys.yusp</groupId>
+        <version>V3.3.2.20220606.RELEASE</version>
+    </parent>
+    <artifactId>server</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <properties>
+        <!-- 文件拷贝时的编码 -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <!-- 编译时的编码 -->
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
+        <java.version>1.8</java.version>
+        <yusp.flow.version>V3.3.2.20220606.RELEASE</yusp.flow.version>
+        <yusp.file.version>V3.3.2.20220606.RELEASE</yusp.file.version>
+        <ojdbc8.version>19.3.0.0</ojdbc8.version>
+        <dynamic.datasource.version>3.4.1</dynamic.datasource.version>
+    </properties>
+    <!-- 模块 -->
+    <modules>
+        <module>yusp-tagging-core</module>
+        <module>yusp-tagging-starter</module>
+    </modules>
+    <name>server</name>
+
+
+</project>

+ 179 - 0
server/yusp-tagging-core/pom.xml

@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>cn.com.yusys.yusp</groupId>
+    <parent>
+        <artifactId>server</artifactId>
+        <groupId>cn.com.yusys.yusp</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>yusp-tagging-core</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <dependencies>
+
+
+        <dependency>
+            <groupId>cn.com.yusys.yusp.common</groupId>
+            <artifactId>yusp-commons-starter-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>cn.com.yusys.yusp.common</groupId>
+            <artifactId>yusp-commons-starter-mybatisplus</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.session</groupId>
+            <artifactId>spring-session-data-redis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.poi</groupId>
+                    <artifactId>poi-ooxml-schemas</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>5.3.33</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.17.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+
+<!--         2026.02.06新增-->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.20</version> <!-- 版本号可根据需要调整 -->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.30</version> <!-- 至少 1.18.16+ -->
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.3.4</version> <!-- 明确使用 3.4.x,支持 Java 8 -->
+            <exclusions>
+                <!-- 强制排除其可能引入的 HikariCP 4.x -->
+                <exclusion>
+                    <groupId>com.zaxxer</groupId>
+                    <artifactId>HikariCP</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>3.4.5</version> <!-- 最后一个支持 Java 8 的版本 -->
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>com.zaxxer</groupId>
+                <artifactId>HikariCP</artifactId>
+                <version>3.4.5</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+</project>

+ 47 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/RedisConfig.java

@@ -0,0 +1,47 @@
+package cn.com.yusys.yusp.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * @模块 : 标题
+ * @作者 : PrimaryKeyEnoch
+ * @时间 : 2021/11/29 18 : 11
+ * @描述 : 简述
+ */
+
+
+public class RedisConfig {
+
+    @Bean
+    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
+
+        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<Object,Object>();
+        redisTemplate.setConnectionFactory(factory);
+        // 定义jackson2JsonRedisSerializer对象 这里使用jackson进行序列化
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper objectMapper = new ObjectMapper();
+        // 指定要序列化的域,包括public private等
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        // 指定序列化的类型,类必须是非final修饰的才可以
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+        // key 序列化方式用string
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        //value 方式用json存储
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+        // hash存储方式
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+}

+ 46 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/TabAppController.java

@@ -0,0 +1,46 @@
+package cn.com.yusys.yusp.controller;
+
+import cn.com.yusys.yusp.domain.dto.TabAppCreateDTO;
+import cn.com.yusys.yusp.domain.entity.TabApp;
+import cn.com.yusys.yusp.service.TabAppService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/tab-app")
+public class TabAppController {
+
+    @Autowired
+    private TabAppService tabAppService;
+
+    @GetMapping("/list")
+    public Page<TabApp> listApps(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "10") int size) {
+        return tabAppService.listApps(page, size);
+    }
+
+    @PostMapping("/add")
+    public TabApp addApp(@Validated @RequestBody TabAppCreateDTO dto) {
+        return tabAppService.addApp(dto);
+    }
+
+    @GetMapping("/query")
+    public List<TabApp> queryByName(@RequestParam String appName) {
+        return tabAppService.queryByName(appName);
+    }
+
+    @PutMapping("/reset-secret/{id}")
+    public String resetSecret(@PathVariable String id) {
+        return tabAppService.resetSecret(id);
+    }
+
+    @PutMapping("/disable/{id}")
+    public void disableApp(@PathVariable String id) {
+        tabAppService.disableApp(id);
+    }
+}

+ 27 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/TestController.java

@@ -0,0 +1,27 @@
+package cn.com.yusys.yusp.controller;
+
+
+import cn.com.yusys.yusp.service.impl.TestImplService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 触发器管理
+ * @Author wangshuai
+ * @创建时间: 2024-03-18 16:05:08
+ * -------------------------------------------------------------
+ * @Copyright (c) 宇信科技-版权所有
+ */
+@RestController
+@RequestMapping("/api/test")
+public class TestController {
+    @Autowired
+    private TestImplService test;
+
+    @GetMapping("/")
+    public String test(){
+        return "test1";
+    }
+}

+ 16 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TabAppCreateDTO.java

@@ -0,0 +1,16 @@
+package cn.com.yusys.yusp.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("新增应用请求DTO")
+public class TabAppCreateDTO {
+
+    @NotBlank(message = "应用名称不能为空")
+    @ApiModelProperty(value = "应用名称", required = true)
+    private String appName;
+}

+ 82 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabApp.java

@@ -0,0 +1,82 @@
+package cn.com.yusys.yusp.domain.entity;
+
+import lombok.Data;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+/**
+ * 应用信息实体
+ * @TableName tab_app
+ */
+@Data
+public class TabApp implements Serializable {
+
+    /**
+     * 主键ID(UUID生成)
+     */
+    @NotBlank(message = "ID不能为空")
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "主键ID", required = true)
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String id;
+
+    /**
+     * 应用名称
+     */
+    @NotBlank(message = "应用名称不能为空")
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "应用名称", required = true)
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String appName;
+
+    /**
+     * 应用ID(YY+日期+序列号格式)
+     */
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "应用ID(非主键)")
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String appId;
+
+    /**
+     * 应用密钥
+     */
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "应用密钥")
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String appSecret;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 创建人姓名
+     */
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "创建人姓名")
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String createrNm;
+
+    /**
+     * 创建人ID
+     */
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "创建人ID")
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String createrId;
+
+    /**
+     * 状态:0启用;1禁用
+     */
+    @Size(max = 100, message = "编码长度不能超过100")
+    @ApiModelProperty(value = "状态:0启用;1禁用", example = "0")
+    @Length(max = 100, message = "编码长度不能超过100")
+    private String state;
+}

+ 373 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabLog.java

@@ -0,0 +1,373 @@
+package cn.com.yusys.yusp.domain.entity;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+
+import java.io.Serializable;
+
+import java.util.Date;
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* 
+* @TableName tab_log
+*/
+public class TabLog implements Serializable {
+
+    /**
+    * 
+    */
+    @NotBlank(message="[]不能为空")
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String id;
+    /**
+    * 应用ID
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("应用ID")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String appId;
+    /**
+    * 调用时间
+    */
+    @ApiModelProperty("调用时间")
+    private Date insertTime;
+    /**
+    * 业务属性,贷款编号
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("业务属性,贷款编号")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String businessAttr;
+    /**
+    * tab_tag_category的主键
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("tab_tag_category的主键")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String category;
+    /**
+    * 输入短语
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("输入短语")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String phrase;
+    /**
+    * 附件名称
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("附件名称")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String attachment;
+    /**
+    * 附件路径
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("附件路径")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String attachmentUrl;
+    /**
+    * 打标结果,JSON
+[{
+label:xxx,
+label_code:xxx,
+desc:xxx
+passr: true/false
+}]
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("打标结果,JSON [{label:xxx, label_code:xxx, desc:xxx passr: true/false }]")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String result;
+    /**
+    * 反馈人ID
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("反馈人ID")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String feedbackUserId;
+    /**
+    * 反馈人名字
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("反馈人名字")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String feedbackUserNm;
+    /**
+    * 反馈时间
+    */
+    @ApiModelProperty("反馈时间")
+    private Date feedbackTime;
+    /**
+    * 反馈,agree/reject
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("反馈,agree/reject")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String feedback;
+    /**
+    * JSON
+[
+{
+ label:xxx,
+ label_code:xxx,
+ desc:xxx
+ passr: true/false
+}
+]
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("JSON {label:xxx, label_code:xxx, desc:xxx passr: true/false}]")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String feedbackResult;
+    /**
+    * 0:打标执行中;1:打标完成; 2:客户经理已经确认
+    */
+    @ApiModelProperty("0:打标执行中;1:打标完成; 2:客户经理已经确认")
+    private Integer state;
+
+    /**
+    * 
+    */
+    private void setId(String id){
+    this.id = id;
+    }
+
+    /**
+    * 应用ID
+    */
+    private void setAppId(String appId){
+    this.appId = appId;
+    }
+
+    /**
+    * 调用时间
+    */
+    private void setInsertTime(Date insertTime){
+    this.insertTime = insertTime;
+    }
+
+    /**
+    * 业务属性,贷款编号
+    */
+    private void setBusinessAttr(String businessAttr){
+    this.businessAttr = businessAttr;
+    }
+
+    /**
+    * tab_tag_category的主键
+    */
+    private void setCategory(String category){
+    this.category = category;
+    }
+
+    /**
+    * 输入短语
+    */
+    private void setPhrase(String phrase){
+    this.phrase = phrase;
+    }
+
+    /**
+    * 附件名称
+    */
+    private void setAttachment(String attachment){
+    this.attachment = attachment;
+    }
+
+    /**
+    * 附件路径
+    */
+    private void setAttachmentUrl(String attachmentUrl){
+    this.attachmentUrl = attachmentUrl;
+    }
+
+    /**
+    * 打标结果,JSON
+[{
+label:xxx,
+label_code:xxx,
+desc:xxx
+passr: true/false
+}]
+    */
+    private void setResult(String result){
+    this.result = result;
+    }
+
+    /**
+    * 反馈人ID
+    */
+    private void setFeedbackUserId(String feedbackUserId){
+    this.feedbackUserId = feedbackUserId;
+    }
+
+    /**
+    * 反馈人名字
+    */
+    private void setFeedbackUserNm(String feedbackUserNm){
+    this.feedbackUserNm = feedbackUserNm;
+    }
+
+    /**
+    * 反馈时间
+    */
+    private void setFeedbackTime(Date feedbackTime){
+    this.feedbackTime = feedbackTime;
+    }
+
+    /**
+    * 反馈,agree/reject
+    */
+    private void setFeedback(String feedback){
+    this.feedback = feedback;
+    }
+
+    /**
+    * JSON
+[
+{
+ label:xxx,
+ label_code:xxx,
+ desc:xxx
+ passr: true/false
+}
+]
+    */
+    private void setFeedbackResult(String feedbackResult){
+    this.feedbackResult = feedbackResult;
+    }
+
+    /**
+    * 0:打标执行中;1:打标完成; 2:客户经理已经确认
+    */
+    private void setState(Integer state){
+    this.state = state;
+    }
+
+
+    /**
+    * 
+    */
+    private String getId(){
+    return this.id;
+    }
+
+    /**
+    * 应用ID
+    */
+    private String getAppId(){
+    return this.appId;
+    }
+
+    /**
+    * 调用时间
+    */
+    private Date getInsertTime(){
+    return this.insertTime;
+    }
+
+    /**
+    * 业务属性,贷款编号
+    */
+    private String getBusinessAttr(){
+    return this.businessAttr;
+    }
+
+    /**
+    * tab_tag_category的主键
+    */
+    private String getCategory(){
+    return this.category;
+    }
+
+    /**
+    * 输入短语
+    */
+    private String getPhrase(){
+    return this.phrase;
+    }
+
+    /**
+    * 附件名称
+    */
+    private String getAttachment(){
+    return this.attachment;
+    }
+
+    /**
+    * 附件路径
+    */
+    private String getAttachmentUrl(){
+    return this.attachmentUrl;
+    }
+
+    /**
+    * 打标结果,JSON
+[{
+label:xxx,
+label_code:xxx,
+desc:xxx
+passr: true/false
+}]
+    */
+    private String getResult(){
+    return this.result;
+    }
+
+    /**
+    * 反馈人ID
+    */
+    private String getFeedbackUserId(){
+    return this.feedbackUserId;
+    }
+
+    /**
+    * 反馈人名字
+    */
+    private String getFeedbackUserNm(){
+    return this.feedbackUserNm;
+    }
+
+    /**
+    * 反馈时间
+    */
+    private Date getFeedbackTime(){
+    return this.feedbackTime;
+    }
+
+    /**
+    * 反馈,agree/reject
+    */
+    private String getFeedback(){
+    return this.feedback;
+    }
+
+    /**
+    * JSON
+[
+{
+ label:xxx,
+ label_code:xxx,
+ desc:xxx
+ passr: true/false
+}
+]
+    */
+    private String getFeedbackResult(){
+    return this.feedbackResult;
+    }
+
+    /**
+    * 0:打标执行中;1:打标完成; 2:客户经理已经确认
+    */
+    private Integer getState(){
+    return this.state;
+    }
+
+}

+ 103 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabTagCategory.java

@@ -0,0 +1,103 @@
+package cn.com.yusys.yusp.domain.entity;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* 
+* @TableName tab_tag_category
+*/
+public class TabTagCategory implements Serializable {
+
+    /**
+    * 
+    */
+    @NotBlank(message="[]不能为空")
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String id;
+    /**
+    * 类别代码
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("类别代码")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String categoryCode;
+    /**
+    * 类别名称
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("类别名称")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String categoryNm;
+    /**
+    * 0启用;1停用
+    */
+    @ApiModelProperty("0启用;1停用")
+    private Integer state;
+
+    /**
+    * 
+    */
+    private void setId(String id){
+    this.id = id;
+    }
+
+    /**
+    * 类别代码
+    */
+    private void setCategoryCode(String categoryCode){
+    this.categoryCode = categoryCode;
+    }
+
+    /**
+    * 类别名称
+    */
+    private void setCategoryNm(String categoryNm){
+    this.categoryNm = categoryNm;
+    }
+
+    /**
+    * 0启用;1停用
+    */
+    private void setState(Integer state){
+    this.state = state;
+    }
+
+
+    /**
+    * 
+    */
+    private String getId(){
+    return this.id;
+    }
+
+    /**
+    * 类别代码
+    */
+    private String getCategoryCode(){
+    return this.categoryCode;
+    }
+
+    /**
+    * 类别名称
+    */
+    private String getCategoryNm(){
+    return this.categoryNm;
+    }
+
+    /**
+    * 0启用;1停用
+    */
+    private Integer getState(){
+    return this.state;
+    }
+
+}

+ 189 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/TabTagInfo.java

@@ -0,0 +1,189 @@
+package cn.com.yusys.yusp.domain.entity;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import javax.validation.constraints.NotNull;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* 
+* @TableName tab_tag_info
+*/
+public class TabTagInfo implements Serializable {
+
+    /**
+    * 
+    */
+    @NotBlank(message="[]不能为空")
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String id;
+    /**
+    * 所属大类
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("所属大类")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String categoryId;
+    /**
+    * 标签名称
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("标签名称")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String tagNm;
+    /**
+    * 标签代码
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("标签代码")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String tagCode;
+    /**
+    * 标签备注
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("标签备注")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String tagRemark;
+    /**
+    * 父级ID
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("父级ID")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String parentId;
+    /**
+    * 标签规则
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("标签规则")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String reg;
+    /**
+    * 标签提示词
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("标签提示词")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String prompt;
+
+    /**
+    * 
+    */
+    private void setId(String id){
+    this.id = id;
+    }
+
+    /**
+    * 所属大类
+    */
+    private void setCategoryId(String categoryId){
+    this.categoryId = categoryId;
+    }
+
+    /**
+    * 标签名称
+    */
+    private void setTagNm(String tagNm){
+    this.tagNm = tagNm;
+    }
+
+    /**
+    * 标签代码
+    */
+    private void setTagCode(String tagCode){
+    this.tagCode = tagCode;
+    }
+
+    /**
+    * 标签备注
+    */
+    private void setTagRemark(String tagRemark){
+    this.tagRemark = tagRemark;
+    }
+
+    /**
+    * 父级ID
+    */
+    private void setParentId(String parentId){
+    this.parentId = parentId;
+    }
+
+    /**
+    * 标签规则
+    */
+    private void setReg(String reg){
+    this.reg = reg;
+    }
+
+    /**
+    * 标签提示词
+    */
+    private void setPrompt(String prompt){
+    this.prompt = prompt;
+    }
+
+
+    /**
+    * 
+    */
+    private String getId(){
+    return this.id;
+    }
+
+    /**
+    * 所属大类
+    */
+    private String getCategoryId(){
+    return this.categoryId;
+    }
+
+    /**
+    * 标签名称
+    */
+    private String getTagNm(){
+    return this.tagNm;
+    }
+
+    /**
+    * 标签代码
+    */
+    private String getTagCode(){
+    return this.tagCode;
+    }
+
+    /**
+    * 标签备注
+    */
+    private String getTagRemark(){
+    return this.tagRemark;
+    }
+
+    /**
+    * 父级ID
+    */
+    private String getParentId(){
+    return this.parentId;
+    }
+
+    /**
+    * 标签规则
+    */
+    private String getReg(){
+    return this.reg;
+    }
+
+    /**
+    * 标签提示词
+    */
+    private String getPrompt(){
+    return this.prompt;
+    }
+
+}

+ 35 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/TabAppMapper.java

@@ -0,0 +1,35 @@
+package cn.com.yusys.yusp.mapper;
+
+import cn.com.yusys.yusp.domain.entity.TabApp;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface TabAppMapper {
+
+    // 分页查询(偏移量 + 限制)
+    List<TabApp> selectPageApps(@Param("offset") int offset, @Param("limit") int limit);
+
+    // 按应用名称查重
+    int selectCountByName(@Param("appName") String appName);
+
+    // 新增
+    void insertApp(TabApp app);
+
+    // 按 ID 查询
+    TabApp selectById(@Param("id") String id);
+
+    // 按应用名称查询(仅三字段)
+    List<TabApp> selectByName(@Param("appName") String appName);
+
+    // 重置密钥
+    void updateAppSecret(@Param("id") String id, @Param("appSecret") String appSecret);
+
+    // 禁用应用
+    void disableApp(@Param("id") String id);
+
+    // 全表计数(分页总数)
+    long selectCountAll();
+}

+ 15 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/TabAppService.java

@@ -0,0 +1,15 @@
+package cn.com.yusys.yusp.service;
+
+import cn.com.yusys.yusp.domain.entity.TabApp;
+import cn.com.yusys.yusp.domain.dto.TabAppCreateDTO;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+public interface TabAppService {
+    Page<TabApp> listApps(int page, int size);
+    TabApp addApp(TabAppCreateDTO dto);
+    List<TabApp> queryByName(String appName);
+    String resetSecret(String id);
+    void disableApp(String id);
+}

+ 12 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/Test.java

@@ -0,0 +1,12 @@
+package cn.com.yusys.yusp.service;
+
+/**
+ * 触发器管理
+ * @Author wangshuai
+ * @创建时间: 2024-03-18 16:05:08
+ * -------------------------------------------------------------
+ * @Copyright (c) 宇信科技-版权所有
+ */
+public interface Test{
+
+}

+ 95 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/TabAppServiceImpl.java

@@ -0,0 +1,95 @@
+package cn.com.yusys.yusp.service.impl;
+
+import cn.com.yusys.yusp.domain.dto.TabAppCreateDTO;
+import cn.com.yusys.yusp.domain.entity.TabApp;
+import cn.com.yusys.yusp.mapper.TabAppMapper;
+import cn.com.yusys.yusp.service.TabAppService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+@Service
+public class TabAppServiceImpl implements TabAppService {
+
+    @Autowired
+    private TabAppMapper tabAppMapper;
+
+    @Override
+    public Page<TabApp> listApps(int page, int size) {
+        int offset = (page - 1) * size;
+        List<TabApp> records = tabAppMapper.selectPageApps(offset, size);
+        long total = tabAppMapper.selectCountAll();
+        Page<TabApp> pageObj = new Page<>(page, size, total);
+        pageObj.setRecords(records);
+        return pageObj;
+    }
+
+    @Override
+    public TabApp addApp(TabAppCreateDTO dto) {
+        String appName = dto.getAppName();
+
+        // 校验唯一性
+        if (tabAppMapper.selectCountByName(appName) > 0) {
+            throw new RuntimeException("应用名称已存在");
+        }
+
+        String id = java.util.UUID.randomUUID().toString();
+        String appId = "YY" +
+                new SimpleDateFormat("yyyyMMdd").format(new Date()) +
+                "001" +
+                String.format("%06d", new Random().nextInt(1000000));
+        String appSecret = generateRandomString(25);
+
+        TabApp app = new TabApp();
+        app.setId(id);
+        app.setAppName(appName);
+        app.setAppId(appId);
+        app.setAppSecret(appSecret);
+        app.setCreateTime(new Date());
+        app.setState("0");
+
+        tabAppMapper.insertApp(app);
+        return app;
+    }
+
+    @Override
+    public List<TabApp> queryByName(String appName) {
+        return tabAppMapper.selectByName(appName);
+    }
+
+    @Override
+    public String resetSecret(String id) {
+        TabApp app = tabAppMapper.selectById(id);
+        if (app == null) {
+            throw new RuntimeException("应用不存在");
+        }
+
+        String newSecret = generateRandomString(25);
+        tabAppMapper.updateAppSecret(id, newSecret);
+        return newSecret;
+    }
+
+    @Override
+    public void disableApp(String id) {
+        TabApp app = tabAppMapper.selectById(id);
+        if (app == null) {
+            throw new RuntimeException("应用不存在");
+        }
+        tabAppMapper.disableApp(id);
+    }
+
+    private String generateRandomString(int length) {
+        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+        StringBuilder sb = new StringBuilder();
+        Random random = new Random();
+        for (int i = 0; i < length; i++) {
+            sb.append(chars.charAt(random.nextInt(chars.length())));
+        }
+        return sb.toString();
+    }
+}

+ 15 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/TestImplService.java

@@ -0,0 +1,15 @@
+package cn.com.yusys.yusp.service.impl;
+
+import org.springframework.stereotype.Service;
+
+/**
+ * 触发器管理
+ * @Author wangshuai
+ * @创建时间: 2024-03-18 16:05:08
+ * -------------------------------------------------------------
+ * @Copyright (c) 宇信科技-版权所有
+ */
+@Service
+public class TestImplService {
+
+}

+ 49 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/util/DataUtil.java

@@ -0,0 +1,49 @@
+package cn.com.yusys.yusp.util;
+
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Pattern;
+
+public class DataUtil {
+
+
+    public static  String getDecimalFormatStr(String num) {
+        StringBuilder sb = new StringBuilder("");
+        Pattern pattern = Pattern.compile("[0-9]*");
+        if (num != null && !"".equals(num)) {
+            if (pattern.matcher(num).matches()) { //如果输入的是一个正整数
+                int n = Integer.valueOf(num);
+                if (n < 1) {
+                    return sb.toString();
+                }
+                sb.append("0.");
+                for (int i = 0; i < n; i++) {
+                    sb.append("0");
+                }
+            }
+        } else {//对于整型,num就是空字符串
+            sb.append("#");
+        }
+        return sb.toString();
+    }
+
+    public static String listToStringForSqlInClause(List<String> list) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+        for (int i = 0; i < list.size(); i++) {
+            sb.append("'").append(list.get(i)).append("'");
+            if (i < list.size() - 1) {
+                sb.append(",");
+            }
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
+    public static String DateToString(Date date) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(date);
+    }
+}

BIN
server/yusp-tagging-core/src/main/resources/cert/pwd_private.key


BIN
server/yusp-tagging-core/src/main/resources/cert/pwd_public.key


+ 14 - 0
server/yusp-tagging-core/src/main/resources/mapper/DetailCrRuleMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.yusys.yusp.detail.dao.DetailCrRuleMapper">
+    <update id="updateDetailCrRuleSts">
+        update detail_cr_rule set rule_sts=#{ruleSts} where
+        busi_no=#{busiNo} and rule_id in
+        <foreach open="(" collection="ruleIdList" item="ruleId" separator="," close=")" index="index">
+            <if test="index%999==998">
+                ) or rule_id in (
+            </if>
+            #{ruleId}
+        </foreach>
+    </update>
+</mapper>

+ 69 - 0
server/yusp-tagging-core/src/main/resources/mapper/DetailFillTaskInsMapper.xml

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.yusys.yusp.detail.dao.DetailFillTaskInsMapper">
+    <select id="selectAuthOrgList" parameterType="string" resultType="cn.com.yusys.yusp.client.domain.vo.BioneIssuedOrgInfoVo">
+        select
+               T0.busi_no,T0.org_NO,
+               T0.org_name,
+               g.org_name as up_org_name,
+               T0.up_org_no,
+               T0.org_level,
+               T0.org_sts,
+               T0.namespace,
+               T0.finance_org_no
+        from admin_sm_user_issued_org_rel r  left join bione_issued_org_info T0 on r.org_no = T0.org_no and r.busi_no = T0.busi_no
+                 LEFT JOIN bione_issued_org_info g ON g.org_no = T0.up_org_no and g.busi_no = T0.busi_no
+            where T0.ORG_STS =#{orgSts,jdbcType=VARCHAR}
+            and T0.busi_no =#{busiNo,jdbcType=VARCHAR}
+    </select>
+
+    <update id="updateInitTaskInsCount">
+        update ${busiNo}_fill_task_ins fill
+        set fill.init_task_ins_count =
+        (
+        select count(1) from ${busiNo}_fill_task_child_ins ins
+        where ins.task_ins_id = fill.task_ins_id
+        and ins.task_sts = '1'
+        )
+        <where>
+            fill.task_ins_id in (
+            <foreach collection="list" separator="," item="id">
+                #{id}
+            </foreach>
+            )
+        </where>
+    </update>
+    <update id="updateUnFillTaskInsCount">
+        update ${busiNo}_fill_task_ins fill
+        set fill.un_fill_task_ins_count =
+        (
+        select count(1) from ${busiNo}_fill_task_child_ins ins
+        where ins.task_ins_id = fill.task_ins_id
+        and ins.task_sts in ('2','3', '6')
+        )
+        <where>
+            fill.task_ins_id in (
+            <foreach collection="list" separator="," item="id">
+                #{id}
+            </foreach>
+            )
+        </where>
+    </update>
+
+    <update id="updateSubmitInsCount">
+        update ${busiNo}_fill_task_ins fill
+        set fill.submit_task_ins_count =
+        (
+        select count(1) from ${busiNo}_fill_task_child_ins ins
+        where ins.task_ins_id = fill.task_ins_id
+        and ins.task_sts = '9'
+        )
+        <where>
+            fill.task_ins_id in (
+            <foreach collection="list" separator="," item="id">
+                #{id}
+            </foreach>
+            )
+        </where>
+    </update>
+</mapper>

+ 86 - 0
server/yusp-tagging-core/src/main/resources/mapper/TabAppMapper.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="cn.com.yusys.yusp.mapper.TabAppMapper">
+
+    <!-- 1. 分页查询 -->
+    <select id="selectPageApps" parameterType="map" resultType="cn.com.yusys.yusp.domain.entity.TabApp">
+        SELECT
+            id,
+            app_name,
+            app_id,
+            app_secret,
+            create_time,
+            creater_nm,
+            creater_id,
+            state
+        FROM tab_app
+        ORDER BY create_time DESC
+            LIMIT #{offset}, #{limit}
+    </select>
+
+    <!-- 2. 按应用名称查重(用于新增前校验) -->
+    <select id="selectCountByName" parameterType="string" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM tab_app
+        WHERE app_name = #{appName}
+    </select>
+
+    <!-- 3. 新增应用(插入全部字段) -->
+    <insert id="insertApp" parameterType="cn.com.yusys.yusp.domain.entity.TabApp">
+        INSERT INTO tab_app (
+            id,
+            app_name,
+            app_id,
+            app_secret,
+            create_time,
+            creater_nm,
+            creater_id,
+            state
+        ) VALUES (
+                     #{id},
+                     #{appName},
+                     #{appId},
+                     #{appSecret},
+                     #{createTime},
+                     #{createrNm},
+                     #{createrId},
+                     #{state}
+                 )
+    </insert>
+
+    <!-- 4. 根据 ID 查询完整对象(用于 reset/disable) -->
+    <select id="selectById" parameterType="string" resultType="cn.com.yusys.yusp.domain.entity.TabApp">
+        SELECT *
+        FROM tab_app
+        WHERE id = #{id}
+    </select>
+
+    <!-- 5. 按应用名称查询(返回 app_name, app_id, app_secret) -->
+    <select id="selectByName" parameterType="string" resultType="cn.com.yusys.yusp.domain.entity.TabApp">
+        SELECT app_name, app_id, app_secret
+        FROM tab_app
+        WHERE app_name = #{appName}
+    </select>
+
+    <!-- 6. 重置密钥:仅更新 app_secret -->
+    <update id="updateAppSecret" parameterType="map">
+        UPDATE tab_app
+        SET app_secret = #{appSecret}
+        WHERE id = #{id}
+    </update>
+
+    <!-- 7. 禁用应用:更新 state = '1' -->
+    <update id="disableApp" parameterType="string">
+        UPDATE tab_app
+        SET state = '1'
+        WHERE id = #{id}
+    </update>
+
+    <!-- 8. 全表计数(用于分页总数) -->
+    <select id="selectCountAll" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM tab_app
+    </select>
+
+</mapper>

+ 99 - 0
server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties

@@ -0,0 +1,99 @@
+SUCCESS=\u64CD\u4F5C\u6210\u529F
+RESTART_TASK_COMPLETION=\u5B58\u5728\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\uFF0C\u8BF7\u7B49\u5F85\u8FD0\u884C\u7ED3\u675F\u540E\u91CD\u65B0\u542F\u52A8
+MISSING_OR_EMPTY_PARAMS=\u8BF7\u6C42\u53C2\u6570\u7F3A\u5931\u6216\u4E3A\u7A7A
+MODULE_CODE_REQUIRED=\u6A21\u5757\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A
+CODE_ITEMS_REQUIRED=\u7801\u503C\u4EE3\u7801\u9879\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+REPORT_ID_REQUIRED=\u53C2\u6570\u62A5\u8868ID\u4E0D\u5141\u8BB8\u4E3A\u7A7A
+DELETE_FAILED_EXCEPTION=\u5220\u9664\u5931\u8D25,\u5F02\u5E38\u4FE1\u606F\u4E3A:{0}
+TASK_RUNNING_CANNOT_DELETE=\u5220\u9664\u5931\u8D25,\u6240\u9009\u4EFB\u52A1\u4ECD\u5728\u5F15\u64CE\u961F\u5217\u8FD0\u884C\u4E2D,\u8BF7\u7A0D\u540E\u91CD\u8BD5
+OPERATION_FAILED=\u7CFB\u7EDF\u5F02\u5E38
+OPERATION_FAILED_PARAM=\u7CFB\u7EDF\u5F02\u5E38:{0}
+UNLOCKED_RULES_EXIST=\u5B58\u5728\u672A\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u5220\u9664\u5931\u8D25
+UNLOCKED_RULES_EXIST_CANNOT_IMPORT=\u5B58\u5728\u672A\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u65E0\u6CD5\u5BFC\u5165
+QUEUED_TASK_REQUIRED=\u53EA\u80FD\u9009\u62E9\u6392\u961F\u4E2D\u7684\u4EFB\u52A1
+TASK_CONFIG_NOT_EXIST=\u5F53\u524D\u4EFB\u52A1\u914D\u7F6E\u4E0D\u5B58\u5728
+MANUAL_DISPATCH_NOT_ALLOWED=\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u624B\u52A8\u4E0B\u53D1
+DEADLINE_CANNOT_BE_PAST=\u4EFB\u52A1\u622A\u6B62\u65F6\u95F4\u4E0D\u80FD\u5C0F\u4E8E\u5F53\u524D\u65E5\u671F
+SELECT_TASK_TO_START=\u8BF7\u9009\u62E9\u8981\u5F00\u542F\u7684\u4EFB\u52A1
+NO_SUBTASKS_EXIST=\u5F53\u524D\u6240\u9009\u4EFB\u52A1\uFF0C\u4E0D\u5B58\u5728\u5B50\u4EFB\u52A1
+SELECT_TASK_TO_RECOVER=\u8BF7\u9009\u62E9\u5F85\u5F00\u542F\u6216\u586B\u62A5\u4E2D\u7684\u4EFB\u52A1\u8FDB\u884C\u56DE\u6536
+FORCE_COMPLETE_NOT_ALLOWED=\u5F53\u524D\u72B6\u6001\u4E0D\u5141\u8BB8\u5F3A\u5236\u5B8C\u6210
+NO_REISSUE_TASK=\u5F53\u524D\u4E0D\u5B58\u5728\u53EF\u8865\u53D1\u4EFB\u52A1\uFF0C\u60A8\u53EF\u901A\u8FC7\u4E0B\u53D1\u6765\u53D1\u8D77\u4EFB\u52A1
+NO_DISABLED_SUBTASKS=\u5F53\u524D\u6240\u9009\u4EFB\u52A1\uFF0C\u4E0D\u5B58\u5728\u672A\u5F00\u542F\u7684\u5B50\u4EFB\u52A1
+FORCE_UNLOCK_COMPLETED_TASK_ONLY=\u53EA\u80FD\u5F3A\u5236\u89E3\u9501\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1
+NO_NEW_OR_UNLOCKED_RULES_IN_EXCEL=\u5F53\u524D\u5BFC\u5165\u7684excel\u4E2D\u65E0\u65B0\u589E\u548C\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u5BFC\u5165\u4E3A\u7A7A
+REQUESTER_DEVELOPER_TESTER_INFO_REQUIRED=\u63D0\u51FA\u4EBA\u3001\u63D0\u51FA\u65F6\u95F4\u3001\u5F00\u53D1\u4EBA\u3001\u5F00\u53D1\u65F6\u95F4\u3001\u6D4B\u8BD5\u4EBA\u3001\u6D4B\u8BD5\u65F6\u95F4\u5747\u4E0D\u53EF\u4E3A\u7A7A
+NO_CHANGES_IN_IMPORTED_RULES=\u5F53\u524D\u5BFC\u5165\u7684excel\u4E2D\u7684\u89C4\u5219\u65E0\u53D8\u5316\uFF0C\u65E0\u9700\u5BFC\u5165
+UPLOAD_FILE_CANNOT_BE_EMPTY=\u4E0A\u4F20\u6587\u4EF6\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\u540E\u518D\u4E0A\u4F20
+IMMEDIATE_RUN_TASK_EXCEPTION=\u7ACB\u5373\u8FD0\u884C\u4E00\u4E2A\u4EFB\u52A1\u65F6\u5F02\u5E38
+USER_NO_ORG_OR_LINE_PERMISSION=\u5F53\u524D\u7528\u6237\u65E0\u673A\u6784\u6216\u8005\u6761\u7EBF\u7684\u6743\u9650
+DATA_DICT_REQUIRED=\u8BF7\u914D\u7F6E\u6570\u636E\u5B57\u5178
+SINGLE_CHECK_FAILED=\u5355\u6761\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5F15\u64CE\u72B6\u6001
+PENDING_TASK_EXISTS=\u6240\u9009\u4EFB\u52A1\u5B58\u5728\u8FDB\u884C\u4E2D\u7684\u4EFB\u52A1\uFF0C\u8BF7\u7A0D\u540E\u542F\u52A8
+DISABLED_DATA_OPERATION_ONLY=\u53EA\u80FD\u64CD\u4F5C\u505C\u7528\u7684\u6570\u636E
+DICTIONARY_ITEM_REQUIRED=\u5B57\u5178\u9879\u4E0D\u80FD\u4E3A\u7A7A
+DICTIONARY_CODE_EXISTS=\u5B57\u5178\u4EE3\u7801:{0}\u5DF2\u5B58\u5728
+DICTIONARY_ITEM_DUPLICATE_NOT_ALLOWED=\u5B57\u5178\u9879\u4E0D\u80FD\u91CD\u590D
+LOGIN_TIMEOUT=\u767B\u5F55\u8D85\u65F6
+FILE_GEN_DIR_CREATE_FAIL=\u6587\u4EF6\u751F\u6210\u76EE\u5F55\u521B\u5EFA\u5931\u8D25
+EXPORT_FAIL=\u5BFC\u51FA\u5931\u8D25
+TEMPLATE_FILE_NOT_EXIST=\u6A21\u7248\u6587\u4EF6\u4E0D\u5B58\u5728
+RULE_ID=\u89C4\u5219ID
+CHK_TABLE=\u68C0\u6838\u8868\u540D
+CHK_FIELD=\u68C0\u6838\u5B57\u6BB5\u540D\u79F0
+RULE_NAME=\u89C4\u5219\u540D\u79F0
+FULL_CHK=\u5168\u8868\u6027\u6821\u9A8C\u89C4\u5219\u7C7B\u578B
+RULE_EXPR=\u89C4\u5219\u8868\u8FBE\u5F0F
+EXPR_TYPE=\u8868\u8FBE\u5F0F\u7C7B\u578B
+IS_ENABLE=\u662F\u5426\u542F\u7528
+FORCE_SUB=\u662F\u5426\u80FD\u5F3A\u5236\u63D0\u4EA4
+RULE_DESC=\u89C4\u5219\u53D1\u6587\u63CF\u8FF0
+STRONG_CHK=\u662F\u5426\u5F3A\u6821\u9A8C
+THRESHOLD=\u9608\u503C
+WEIGHT=\u6743\u91CD
+REMARK=\u5907\u6CE8
+ONLY_CMT=\u662F\u5426\u53EA\u5907\u6CE8
+PROPOSER=\u63D0\u51FA\u4EBA
+PROP_TIME=\u63D0\u51FA\u65F6\u95F4
+DEVELOPER=\u5F00\u53D1\u4EBA
+DEV_TIME=\u5F00\u53D1\u65F6\u95F4
+TESTER=\u6D4B\u8BD5\u4EBA
+TEST_TIME=\u6D4B\u8BD5\u65F6\u95F4
+RULE_MAINT=\u89C4\u5219\u7EF4\u62A4
+RULE_IMP_TMPL=\u89C4\u5219\u7EF4\u62A4\u5BFC\u5165\u6A21\u677F
+CODE_MAINT=\u7801\u503C\u7EF4\u62A4
+CODE_TYPE=\u4EE3\u7801\u7C7B\u578B
+CODE_TYPE_NAME=\u4EE3\u7801\u7C7B\u578B\u540D\u79F0
+CODE_ITEM=\u4EE3\u7801\u9879
+CODE_ITEM_NAME=\u4EE3\u7801\u9879\u540D\u79F0
+PARENT_ITEM=\u4E0A\u7EA7\u4EE3\u7801\u9879
+CODE_LEVEL=\u4EE3\u7801\u7EA7\u522B
+ITEM_SEQ=\u4EE3\u7801\u9879\u5E8F\u53F7
+IS_BOTTOM=\u662F\u5426\u6700\u5E95\u5C42\u4EE3\u7801
+RULE_MOD_REC=\u89C4\u5219\u4FEE\u6539\u8BB0\u5F55
+OPER_TYPE=\u64CD\u4F5C\u7C7B\u578B
+REPORT_ID=\u76D1\u7BA1ID
+UPDATE_FIELD=\u4FEE\u6539\u5B57\u6BB5
+OLD_VALUE=\u4FEE\u6539\u524D
+NEW_VALUE=\u4FEE\u6539\u540E
+CODE_IMP_TEMPLATE=\u7801\u503C\u5BFC\u5165\u6A21\u677F
+REPORT_GROUP_CODE_EXISTS=\u586B\u62A5\u7EC4\u4EE3\u7801\u5DF2\u5B58\u5728\uFF0C\u8BF7\u4FEE\u6539\u540E\u518D\u64CD\u4F5C
+CRON_EXPRESSION_INVALID=cron\u8868\u8FBE\u5F0F\u65E0\u6548,\u65E0\u6CD5\u65B0\u589E
+TRIGGER_NAME_USED=\u89E6\u53D1\u5668\u540D\u79F0\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u65B0\u589E
+CRON_EXPRESSION_INVALID_EDIT=cron\u8868\u8FBE\u5F0F\u65E0\u6548, \u65E0\u6CD5\u7F16\u8F91
+CRON_EXPRESSION_INVALID_MINUTE_UNIT=cron\u8868\u8FBE\u5F0F\u65E0\u6548, \u8BF7\u786E\u4FDD\u6700\u5C0F\u5355\u4F4D\u6309\u5929
+TRIGGER_ALREADY_USED_CANNOT_EDIT=\u89E6\u53D1\u5668\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u4FEE\u6539
+TRIGGER_NAME_USED_CANNOT_EDIT=\u89E6\u53D1\u5668\u540D\u79F0\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u4FEE\u6539
+ASSOCIATED_TASK_EXISTS_CANNOT_DISABLE=\u5B58\u5728\u5DF2\u5173\u8054\u4EFB\u52A1\uFF0C\u65E0\u6CD5\u505C\u7528
+TRIGGER_IN_USE_CANNOT_DELETE=\u5B58\u5728\u6B63\u5728\u4F7F\u7528\u7684\u89E6\u53D1\u5668\uFF0C\u65E0\u6CD5\u5220\u9664
+PLEASE_SELECT_TRIGGER=\u8BF7\u9009\u62E9\u89E6\u53D1\u5668\uFF01
+TRIGGER_ALREADY_USED_CANNOT_DELETE=\u89E6\u53D1\u5668\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u5220\u9664
+FIELD_ENGLISH_NAME_EXISTS=\u5B57\u6BB5\u82F1\u6587\u540D\u5DF2\u5B58\u5728
+ADD_FAILED_SELECT_DATASOURCE=\u65B0\u589E\u5931\u8D25,\u8BF7\u9009\u62E9\u6570\u636E\u6E90
+TASKS_EXIST_PLEASE_UNLINK_BEFORE_DELETING=\u5B58\u5728\u5DF2\u5173\u8054\u7684\u586B\u62A5\u4EFB\u52A1\uFF0C\u8BF7\u53D6\u6D88\u5173\u8054\u540E\u5220\u9664
+TASK_EXISTS_CANNOT_DISABLE=\u5B58\u5728\u5173\u8054\u7684\u542F\u7528\u72B6\u6001\u586B\u62A5\u4EFB\u52A1\uFF0C\u6682\u4E0D\u5141\u8BB8\u505C\u7528
+ONLY_APPLY_TO_AUDITING_TASKS=\u53EA\u80FD\u7533\u8BF7\u89E3\u9501\u5BA1\u6838\u4E2D\u7684\u4EFB\u52A1
+REQUEST_PARAMETER_CANNOT_BE_EMPTY=\u8BF7\u6C42\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A
+EXTENSION_FIELD_CANNOT_BE_EMPTY=\u6269\u5C55\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A
+SUPPLEMENTAL_TABLE_CONFIG_NOT_EXIST=\u8865\u5F55\u8868\u914D\u7F6E\u4E0D\u5B58\u5728,\u8BF7\u786E\u8BA4\u540E\u518D\u64CD\u4F5C
+DATA_SOURCE_INFO_NOT_EXIST=\u5F53\u524D\u8868\u6570\u636E\u6E90\u4FE1\u606F\u4E0D\u5B58\u5728

+ 99 - 0
server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg_en.properties

@@ -0,0 +1,99 @@
+SUCCESS=SUCCESS
+RESTART_TASK_COMPLETION=Running task exists, please wait until completion and restart
+MISSING_OR_EMPTY_PARAMS=Missing or empty request parameters
+MODULE_CODE_REQUIRED=Module code cannot be empty
+CODE_ITEMS_REQUIRED=Code items list cannot be empty
+REPORT_ID_REQUIRED=Report ID cannot be empty
+DELETE_FAILED_EXCEPTION=Deletion failed, exception message:{0}
+TASK_RUNNING_CANNOT_DELETE=Deletion failed, the selected task is still running in the engine queue. Please try again later.
+OPERATION_FAILED=Operation failed
+OPERATION_FAILED_PARAM=Operation failed:{0}
+UNLOCKED_RULES_EXIST=There are unlocked rules, deletion failed
+UNLOCKED_RULES_EXIST_CANNOT_IMPORT=Unlocked rules exist, import failed
+QUEUED_TASK_REQUIRED=Only queued tasks can be selected
+TASK_CONFIG_NOT_EXIST=Current task configuration does not exist
+MANUAL_DISPATCH_NOT_ALLOWED=Current task cannot be manually dispatched
+DEADLINE_CANNOT_BE_PAST=Task deadline cannot be earlier than the current date
+SELECT_TASK_TO_START=Please select the task to start
+NO_SUBTASKS_EXIST=The selected task has no subtasks
+SELECT_TASK_TO_RECOVER=Please select a task that is pending start or in progress to recover
+FORCE_COMPLETE_NOT_ALLOWED=Current status does not allow force completion
+NO_REISSUE_TASK=No reissue task available. You can initiate a task through dispatch
+NO_DISABLED_SUBTASKS=The selected task has no disabled subtasks
+FORCE_UNLOCK_COMPLETED_TASK_ONLY=Only completed tasks can be force-unlocked
+NO_NEW_OR_UNLOCKED_RULES_IN_EXCEL=No new or unlocked rules in the imported Excel file, the import is empty
+REQUESTER_DEVELOPER_TESTER_INFO_REQUIRED=Requester, request time, developer, development time, tester, and testing time cannot be empty
+NO_CHANGES_IN_IMPORTED_RULES=There are no changes in the rules from the imported Excel file, no need to import
+UPLOAD_FILE_CANNOT_BE_EMPTY=The uploaded file cannot be empty. Please fill in the content before uploading
+IMMEDIATE_RUN_TASK_EXCEPTION=An exception occurred while running a task immediately
+USER_NO_ORG_OR_LINE_PERMISSION=The current user has no organization or line permission
+DATA_DICT_REQUIRED=Please configure the data dictionary
+SINGLE_CHECK_FAILED=Single check failed, please check the engine status
+PENDING_TASK_EXISTS=There is an ongoing task in the selected tasks. Please start later
+DISABLED_DATA_OPERATION_ONLY=Only disabled data can be operated
+DICTIONARY_ITEM_REQUIRED=Dictionary item cannot be empty
+DICTIONARY_CODE_EXISTS=Dictionary code {0} already exists
+DICTIONARY_ITEM_DUPLICATE_NOT_ALLOWED=Dictionary item cannot be duplicated
+LOGIN_TIMEOUT=Login timeout
+FILE_GEN_DIR_CREATE_FAIL=Failed to create the file generation directory
+EXPORT_FAIL=Export failed
+TEMPLATE_FILE_NOT_EXIST=Template file does not exist
+RULE_ID=rule id
+CHK_TABLE=check table name
+CHK_FIELD=check field name
+RULE_NAME=rule name
+FULL_CHK=Full Table Check Rule Type
+RULE_EXPR=Rule Expression
+EXPR_TYPE=Expression Type
+IS_ENABLE=Is Enabled
+FORCE_SUB=Can Force Submit
+RULE_DESC=Rule Description
+STRONG_CHK=Is Strong Check
+THRESHOLD=Threshold
+WEIGHT=Weight
+REMARK=Remark
+ONLY_CMT=Is Only Comment
+PROPOSER=Proposer
+PROP_TIME=Proposal Time
+DEVELOPER=Developer
+DEV_TIME=Development Time
+TESTER=Tester
+TEST_TIME=Test Time
+RULE_MAINT=Rule Maintenance
+RULE_IMP_TMPL=Rule Maintenance Import Template
+CODE_MAINT=Code Value Maintenance
+CODE_TYPE=Code Type
+CODE_TYPE_NAME=Code Type Name
+CODE_ITEM=Code Item
+CODE_ITEM_NAME=Code Item Name
+PARENT_ITEM=Parent Code Item
+CODE_LEVEL=Code Level
+ITEM_SEQ=Item Sequence
+IS_BOTTOM=Is Bottom Level
+RULE_MOD_REC=Rule Modification Record
+OPER_TYPE=Operation Type
+REPORT_ID=Report ID
+UPDATE_FIELD=Update Field
+OLD_VALUE=Old Value
+NEW_VALUE=New Value
+CODE_IMP_TEMPLATE=Code Import Template
+REPORT_GROUP_CODE_EXISTS=Report group code already exists, please modify and try again
+CRON_EXPRESSION_INVALID=CRON expression is invalid, cannot add new
+TRIGGER_NAME_USED=Trigger name already used, cannot add new
+CRON_EXPRESSION_INVALID_EDIT=CRON expression is invalid, cannot edit
+CRON_EXPRESSION_INVALID_MINUTE_UNIT=CRON expression is invalid, please ensure the minimum unit is by day
+TRIGGER_ALREADY_USED_CANNOT_EDIT=Trigger is already in use, cannot be modified
+TRIGGER_NAME_USED_CANNOT_EDIT=Trigger name already used, cannot be modified
+ASSOCIATED_TASK_EXISTS_CANNOT_DISABLE=Associated task exists, cannot disable
+TRIGGER_IN_USE_CANNOT_DELETE=There is a trigger in use, cannot delete
+PLEASE_SELECT_TRIGGER=Please select a trigger!
+TRIGGER_ALREADY_USED_CANNOT_DELETE=Trigger is already in use, cannot delete
+FIELD_ENGLISH_NAME_EXISTS=Field English name already exists
+ADD_FAILED_SELECT_DATASOURCE=Add failed, please select data source
+TASKS_EXIST_PLEASE_UNLINK_BEFORE_DELETING=Associated reporting tasks exist, please unlink before deleting
+TASK_EXISTS_CANNOT_DISABLE=Associated enabled reporting tasks exist, temporarily not allowed to disable
+ONLY_APPLY_TO_AUDITING_TASKS=Can only apply to tasks under audit
+REQUEST_PARAMETER_CANNOT_BE_EMPTY=Request parameter cannot be empty
+EXTENSION_FIELD_CANNOT_BE_EMPTY=Extension field cannot be empty
+SUPPLEMENTAL_TABLE_CONFIG_NOT_EXIST=Supplemental table configuration does not exist, please confirm and operate again
+DATA_SOURCE_INFO_NOT_EXIST=Current table data source information does not exist

+ 99 - 0
server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg_zh.properties

@@ -0,0 +1,99 @@
+SUCCESS=\u64CD\u4F5C\u6210\u529F
+RESTART_TASK_COMPLETION=\u5B58\u5728\u6B63\u5728\u8FD0\u884C\u7684\u4EFB\u52A1\uFF0C\u8BF7\u7B49\u5F85\u8FD0\u884C\u7ED3\u675F\u540E\u91CD\u65B0\u542F\u52A8
+MISSING_OR_EMPTY_PARAMS=\u8BF7\u6C42\u53C2\u6570\u7F3A\u5931\u6216\u4E3A\u7A7A
+MODULE_CODE_REQUIRED=\u6A21\u5757\u7F16\u53F7\u4E0D\u80FD\u4E3A\u7A7A
+CODE_ITEMS_REQUIRED=\u7801\u503C\u4EE3\u7801\u9879\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A
+REPORT_ID_REQUIRED=\u53C2\u6570\u62A5\u8868ID\u4E0D\u5141\u8BB8\u4E3A\u7A7A
+DELETE_FAILED_EXCEPTION=\u5220\u9664\u5931\u8D25,\u5F02\u5E38\u4FE1\u606F\u4E3A:{0}
+TASK_RUNNING_CANNOT_DELETE=\u5220\u9664\u5931\u8D25,\u6240\u9009\u4EFB\u52A1\u4ECD\u5728\u5F15\u64CE\u961F\u5217\u8FD0\u884C\u4E2D,\u8BF7\u7A0D\u540E\u91CD\u8BD5
+OPERATION_FAILED=\u7CFB\u7EDF\u5F02\u5E38
+OPERATION_FAILED_PARAM=\u7CFB\u7EDF\u5F02\u5E38:{0}
+UNLOCKED_RULES_EXIST=\u5B58\u5728\u672A\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u5220\u9664\u5931\u8D25
+UNLOCKED_RULES_EXIST_CANNOT_IMPORT=\u5B58\u5728\u672A\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u65E0\u6CD5\u5BFC\u5165
+QUEUED_TASK_REQUIRED=\u53EA\u80FD\u9009\u62E9\u6392\u961F\u4E2D\u7684\u4EFB\u52A1
+TASK_CONFIG_NOT_EXIST=\u5F53\u524D\u4EFB\u52A1\u914D\u7F6E\u4E0D\u5B58\u5728
+MANUAL_DISPATCH_NOT_ALLOWED=\u5F53\u524D\u4EFB\u52A1\u4E0D\u80FD\u624B\u52A8\u4E0B\u53D1
+DEADLINE_CANNOT_BE_PAST=\u4EFB\u52A1\u622A\u6B62\u65F6\u95F4\u4E0D\u80FD\u5C0F\u4E8E\u5F53\u524D\u65E5\u671F
+SELECT_TASK_TO_START=\u8BF7\u9009\u62E9\u8981\u5F00\u542F\u7684\u4EFB\u52A1
+NO_SUBTASKS_EXIST=\u5F53\u524D\u6240\u9009\u4EFB\u52A1\uFF0C\u4E0D\u5B58\u5728\u5B50\u4EFB\u52A1
+SELECT_TASK_TO_RECOVER=\u8BF7\u9009\u62E9\u5F85\u5F00\u542F\u6216\u586B\u62A5\u4E2D\u7684\u4EFB\u52A1\u8FDB\u884C\u56DE\u6536
+FORCE_COMPLETE_NOT_ALLOWED=\u5F53\u524D\u72B6\u6001\u4E0D\u5141\u8BB8\u5F3A\u5236\u5B8C\u6210
+NO_REISSUE_TASK=\u5F53\u524D\u4E0D\u5B58\u5728\u53EF\u8865\u53D1\u4EFB\u52A1\uFF0C\u60A8\u53EF\u901A\u8FC7\u4E0B\u53D1\u6765\u53D1\u8D77\u4EFB\u52A1
+NO_DISABLED_SUBTASKS=\u5F53\u524D\u6240\u9009\u4EFB\u52A1\uFF0C\u4E0D\u5B58\u5728\u672A\u5F00\u542F\u7684\u5B50\u4EFB\u52A1
+FORCE_UNLOCK_COMPLETED_TASK_ONLY=\u53EA\u80FD\u5F3A\u5236\u89E3\u9501\u5DF2\u5B8C\u6210\u7684\u4EFB\u52A1
+NO_NEW_OR_UNLOCKED_RULES_IN_EXCEL=\u5F53\u524D\u5BFC\u5165\u7684excel\u4E2D\u65E0\u65B0\u589E\u548C\u89E3\u9501\u7684\u89C4\u5219\uFF0C\u5BFC\u5165\u4E3A\u7A7A
+REQUESTER_DEVELOPER_TESTER_INFO_REQUIRED=\u63D0\u51FA\u4EBA\u3001\u63D0\u51FA\u65F6\u95F4\u3001\u5F00\u53D1\u4EBA\u3001\u5F00\u53D1\u65F6\u95F4\u3001\u6D4B\u8BD5\u4EBA\u3001\u6D4B\u8BD5\u65F6\u95F4\u5747\u4E0D\u53EF\u4E3A\u7A7A
+NO_CHANGES_IN_IMPORTED_RULES=\u5F53\u524D\u5BFC\u5165\u7684excel\u4E2D\u7684\u89C4\u5219\u65E0\u53D8\u5316\uFF0C\u65E0\u9700\u5BFC\u5165
+UPLOAD_FILE_CANNOT_BE_EMPTY=\u4E0A\u4F20\u6587\u4EF6\u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u586B\u5199\u540E\u518D\u4E0A\u4F20
+IMMEDIATE_RUN_TASK_EXCEPTION=\u7ACB\u5373\u8FD0\u884C\u4E00\u4E2A\u4EFB\u52A1\u65F6\u5F02\u5E38
+USER_NO_ORG_OR_LINE_PERMISSION=\u5F53\u524D\u7528\u6237\u65E0\u673A\u6784\u6216\u8005\u6761\u7EBF\u7684\u6743\u9650
+DATA_DICT_REQUIRED=\u8BF7\u914D\u7F6E\u6570\u636E\u5B57\u5178
+SINGLE_CHECK_FAILED=\u5355\u6761\u68C0\u67E5\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u5F15\u64CE\u72B6\u6001
+PENDING_TASK_EXISTS=\u6240\u9009\u4EFB\u52A1\u5B58\u5728\u8FDB\u884C\u4E2D\u7684\u4EFB\u52A1\uFF0C\u8BF7\u7A0D\u540E\u542F\u52A8
+DISABLED_DATA_OPERATION_ONLY=\u53EA\u80FD\u64CD\u4F5C\u505C\u7528\u7684\u6570\u636E
+DICTIONARY_ITEM_REQUIRED=\u5B57\u5178\u9879\u4E0D\u80FD\u4E3A\u7A7A
+DICTIONARY_CODE_EXISTS=\u5B57\u5178\u4EE3\u7801:{0}\u5DF2\u5B58\u5728
+DICTIONARY_ITEM_DUPLICATE_NOT_ALLOWED=\u5B57\u5178\u9879\u4E0D\u80FD\u91CD\u590D
+LOGIN_TIMEOUT=\u767B\u5F55\u8D85\u65F6
+FILE_GEN_DIR_CREATE_FAIL=\u6587\u4EF6\u751F\u6210\u76EE\u5F55\u521B\u5EFA\u5931\u8D25
+EXPORT_FAIL=\u5BFC\u51FA\u5931\u8D25
+TEMPLATE_FILE_NOT_EXIST=\u6A21\u7248\u6587\u4EF6\u4E0D\u5B58\u5728
+RULE_ID=\u89C4\u5219ID
+CHK_TABLE=\u68C0\u6838\u8868\u540D
+CHK_FIELD=\u68C0\u6838\u5B57\u6BB5\u540D\u79F0
+RULE_NAME=\u89C4\u5219\u540D\u79F0
+FULL_CHK=\u5168\u8868\u6027\u6821\u9A8C\u89C4\u5219\u7C7B\u578B
+RULE_EXPR=\u89C4\u5219\u8868\u8FBE\u5F0F
+EXPR_TYPE=\u8868\u8FBE\u5F0F\u7C7B\u578B
+IS_ENABLE=\u662F\u5426\u542F\u7528
+FORCE_SUB=\u662F\u5426\u80FD\u5F3A\u5236\u63D0\u4EA4
+RULE_DESC=\u89C4\u5219\u53D1\u6587\u63CF\u8FF0
+STRONG_CHK=\u662F\u5426\u5F3A\u6821\u9A8C
+THRESHOLD=\u9608\u503C
+WEIGHT=\u6743\u91CD
+REMARK=\u5907\u6CE8
+ONLY_CMT=\u662F\u5426\u53EA\u5907\u6CE8
+PROPOSER=\u63D0\u51FA\u4EBA
+PROP_TIME=\u63D0\u51FA\u65F6\u95F4
+DEVELOPER=\u5F00\u53D1\u4EBA
+DEV_TIME=\u5F00\u53D1\u65F6\u95F4
+TESTER=\u6D4B\u8BD5\u4EBA
+TEST_TIME=\u6D4B\u8BD5\u65F6\u95F4
+RULE_MAINT=\u89C4\u5219\u7EF4\u62A4
+RULE_IMP_TMPL=\u89C4\u5219\u7EF4\u62A4\u5BFC\u5165\u6A21\u677F
+CODE_MAINT=\u7801\u503C\u7EF4\u62A4
+CODE_TYPE=\u4EE3\u7801\u7C7B\u578B
+CODE_TYPE_NAME=\u4EE3\u7801\u7C7B\u578B\u540D\u79F0
+CODE_ITEM=\u4EE3\u7801\u9879
+CODE_ITEM_NAME=\u4EE3\u7801\u9879\u540D\u79F0
+PARENT_ITEM=\u4E0A\u7EA7\u4EE3\u7801\u9879
+CODE_LEVEL=\u4EE3\u7801\u7EA7\u522B
+ITEM_SEQ=\u4EE3\u7801\u9879\u5E8F\u53F7
+IS_BOTTOM=\u662F\u5426\u6700\u5E95\u5C42\u4EE3\u7801
+RULE_MOD_REC=\u89C4\u5219\u4FEE\u6539\u8BB0\u5F55
+OPER_TYPE=\u64CD\u4F5C\u7C7B\u578B
+REPORT_ID=\u76D1\u7BA1ID
+UPDATE_FIELD=\u4FEE\u6539\u5B57\u6BB5
+OLD_VALUE=\u4FEE\u6539\u524D
+NEW_VALUE=\u4FEE\u6539\u540E
+CODE_IMP_TEMPLATE=\u7801\u503C\u5BFC\u5165\u6A21\u677F
+REPORT_GROUP_CODE_EXISTS=\u586B\u62A5\u7EC4\u4EE3\u7801\u5DF2\u5B58\u5728\uFF0C\u8BF7\u4FEE\u6539\u540E\u518D\u64CD\u4F5C
+CRON_EXPRESSION_INVALID=cron\u8868\u8FBE\u5F0F\u65E0\u6548,\u65E0\u6CD5\u65B0\u589E
+TRIGGER_NAME_USED=\u89E6\u53D1\u5668\u540D\u79F0\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u65B0\u589E
+CRON_EXPRESSION_INVALID_EDIT=cron\u8868\u8FBE\u5F0F\u65E0\u6548, \u65E0\u6CD5\u7F16\u8F91
+CRON_EXPRESSION_INVALID_MINUTE_UNIT=cron\u8868\u8FBE\u5F0F\u65E0\u6548, \u8BF7\u786E\u4FDD\u6700\u5C0F\u5355\u4F4D\u6309\u5929
+TRIGGER_ALREADY_USED_CANNOT_EDIT=\u89E6\u53D1\u5668\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u4FEE\u6539
+TRIGGER_NAME_USED_CANNOT_EDIT=\u89E6\u53D1\u5668\u540D\u79F0\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u4FEE\u6539
+ASSOCIATED_TASK_EXISTS_CANNOT_DISABLE=\u5B58\u5728\u5DF2\u5173\u8054\u4EFB\u52A1\uFF0C\u65E0\u6CD5\u505C\u7528
+TRIGGER_IN_USE_CANNOT_DELETE=\u5B58\u5728\u6B63\u5728\u4F7F\u7528\u7684\u89E6\u53D1\u5668\uFF0C\u65E0\u6CD5\u5220\u9664
+PLEASE_SELECT_TRIGGER=\u8BF7\u9009\u62E9\u89E6\u53D1\u5668\uFF01
+TRIGGER_ALREADY_USED_CANNOT_DELETE=\u89E6\u53D1\u5668\u5DF2\u88AB\u4F7F\u7528\uFF0C\u65E0\u6CD5\u5220\u9664
+FIELD_ENGLISH_NAME_EXISTS=\u5B57\u6BB5\u82F1\u6587\u540D\u5DF2\u5B58\u5728
+ADD_FAILED_SELECT_DATASOURCE=\u65B0\u589E\u5931\u8D25,\u8BF7\u9009\u62E9\u6570\u636E\u6E90
+TASKS_EXIST_PLEASE_UNLINK_BEFORE_DELETING=\u5B58\u5728\u5DF2\u5173\u8054\u7684\u586B\u62A5\u4EFB\u52A1\uFF0C\u8BF7\u53D6\u6D88\u5173\u8054\u540E\u5220\u9664
+TASK_EXISTS_CANNOT_DISABLE=\u5B58\u5728\u5173\u8054\u7684\u542F\u7528\u72B6\u6001\u586B\u62A5\u4EFB\u52A1\uFF0C\u6682\u4E0D\u5141\u8BB8\u505C\u7528
+ONLY_APPLY_TO_AUDITING_TASKS=\u53EA\u80FD\u7533\u8BF7\u89E3\u9501\u5BA1\u6838\u4E2D\u7684\u4EFB\u52A1
+REQUEST_PARAMETER_CANNOT_BE_EMPTY=\u8BF7\u6C42\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A7A
+EXTENSION_FIELD_CANNOT_BE_EMPTY=\u6269\u5C55\u5B57\u6BB5\u4E0D\u80FD\u4E3A\u7A7A
+SUPPLEMENTAL_TABLE_CONFIG_NOT_EXIST=\u8865\u5F55\u8868\u914D\u7F6E\u4E0D\u5B58\u5728,\u8BF7\u786E\u8BA4\u540E\u518D\u64CD\u4F5C
+DATA_SOURCE_INFO_NOT_EXIST=\u5F53\u524D\u8868\u6570\u636E\u6E90\u4FE1\u606F\u4E0D\u5B58\u5728

BIN
server/yusp-tagging-core/src/main/resources/template/detail_col_template.xlsx


+ 246 - 0
server/yusp-tagging-starter/pom.xml

@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>cn.com.yusys.yusp</groupId>
+    <parent>
+        <artifactId>server</artifactId>
+        <groupId>cn.com.yusys.yusp</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>yusp-tagging-starter</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <!-- 依赖 core 模块 -->
+        <dependency>
+            <groupId>cn.com.yusys.yusp</groupId>
+            <artifactId>yusp-tagging-core</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2.1.2.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+            <version>2.1.2.RELEASE</version>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+            <version>1.26</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okio</groupId>
+            <artifactId>okio</artifactId>
+            <version>3.4.0</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>kotlin-stdlib</artifactId>
+                    <groupId>org.jetbrains.kotlin</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.10.0</version>
+        </dependency>
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webflux</artifactId>
+            <version>5.2.20.RELEASE</version>
+        </dependency>
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-messaging</artifactId>
+            <version>5.2.22.RELEASE</version>
+        </dependency>
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>5.2.20.RELEASE</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-expression</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-context</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--漏洞升级-->
+        <!--        <dependency>
+                    <groupId>org.springframework.security</groupId>
+                    <artifactId>spring-security-crypto</artifactId>
+                    <version>6.1.5</version>
+                </dependency>-->
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-codec-http</artifactId>
+            <version>4.1.108.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.15.3</version>
+        </dependency>
+        <!--漏洞升级-->
+        <!--        <dependency>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-core</artifactId>
+                    <version>5.2.24.RELEASE</version>
+                </dependency>-->
+        <!--        <dependency>
+                    <groupId>org.springframework</groupId>
+                    <artifactId>spring-beans</artifactId>
+                    <version>5.2.24.RELEASE</version>
+                </dependency>-->
+        <!-- MySQL JDBC Driver -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.33</version> <!-- 使用最新稳定版本 -->
+        </dependency>
+
+        <!-- HikariCP -->
+        <dependency>
+            <groupId>com.zaxxer</groupId>
+            <artifactId>HikariCP</artifactId>
+            <version>3.4.5</version> <!-- 使用最新稳定版本 -->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <version>3.8.4</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>logback-classic</artifactId>
+                    <groupId>ch.qos.logback</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>logback-core</artifactId>
+                    <groupId>ch.qos.logback</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <version>9.0.86</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.santuario</groupId>
+            <artifactId>xmlsec</artifactId>
+            <version>2.2.6</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>woodstox-core</artifactId>
+                    <groupId>com.fasterxml.woodstox</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-cbor</artifactId>
+            <version>2.17.0-rc1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.codehaus.jettison</groupId>
+            <artifactId>jettison</artifactId>
+            <version>1.5.4</version>
+        </dependency>
+        <!--漏洞升级-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>5.2.25.RELEASE</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>spring-beans</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>spring-expression</artifactId>
+                    <groupId>org.springframework</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-expression</artifactId>
+            <version>5.2.25.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis</groupId>
+            <artifactId>mybatis-spring</artifactId>
+            <version>2.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-tx</artifactId>
+            <version>5.3.33</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>yusp-app-detail</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <executable>true</executable>
+<!--                    <fork>true</fork>-->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>apollo</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <properties>
+                <profile.active>apollo</profile.active>
+            </properties>
+            <dependencies>
+            </dependencies>
+        </profile>
+    </profiles>
+
+</project>

+ 16 - 0
server/yusp-tagging-starter/src/main/java/cn/com/yusys/yusp/detail/App.java

@@ -0,0 +1,16 @@
+package cn.com.yusys.yusp.detail;
+
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@EnableDiscoveryClient
+@SpringBootApplication(scanBasePackages = {"cn.com.yusys.yusp"})
+@MapperScan("cn.com.yusys.yusp.mapper")
+public class App {
+    public static void main(String[] args) {
+        SpringApplication.run(App.class, args);
+    }
+}

+ 51 - 0
server/yusp-tagging-starter/src/main/resources/application.yml

@@ -0,0 +1,51 @@
+spring:
+  cache:
+    type: redis #缓存类型
+  main:
+    allow-bean-definition-overriding: true
+  redis:
+    database: 0 #Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
+    host: 10.192.72.13 #Redis地址
+    port: 36379 #Redis端口
+    password: 123456 #Redis密码
+    timeout: 10000 #Redis连接超时时间
+    lettuce:
+      shutdown-timeout: 60000ms #关闭超时时间
+      pool:
+        max-active: 20 #连接池最大连接数(使用负值表示没有限制) 默认 8
+        max-wait: 10000ms #连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
+        min-idle: 1 #连接池中的最小空闲连接 默认 0
+        max-idle: 20 #连接池中的最大空闲连接 默认 8
+  application:
+    jackson:
+      date-format: yyyy-MM-dd HH:mm:ss #日期格式
+      serialization:
+        INDENT_OUTPUT: true #是否格式化输出
+      default-property-inclusion: non_null #null不进行序列化
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver #mysql数据库连接驱动
+    type: com.zaxxer.hikari.HikariDataSource #数据库连接池类型
+    url: jdbc:mysql://10.192.72.13:6780/fjnx?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&allowMultiQueries=true&useSSL=false #数据库地址
+    username: root #数据库用户名
+    password: 123456 #数据库密码(密文)
+    hikari:
+      minimum-idle: 1 #空闲时最小连接数
+      maximum-pool-size: 20 #连接池大小
+      connection-test-query: select 1 #连接池验证
+
+license:
+  licenseContext: <?xml version="1.0" encoding="UTF-8"?><license build-time="Fri
+    Aug 29 11:31:39 CST 2025" validate-code="FB0E39C4C5C48D85129A6FE17A9ED278">  <element
+    name="contract_code">YTEC-2024-3620-B</element>  <element name="customer_name">平台产品部研发项目-2025年</element>  <element
+    name="license_code">0000028324</element>  <element name="product_code">0000001122</element>  <element
+    name="product_name_zh-cn">宇信科技基于微服务框架统一开发平台</element>  <element name="product_name_en-us">YUSP</element>  <element
+    name="version_major">1</element>  <element name="version_sub">0</element>  <element
+    name="version_publish">1</element>  <element name="complie_date">2018-03-20</element>  <element
+    name="license_type">内部试用许可证</element>  <element name="license_start_time">2025-08-29</element>  <element
+    name="license_end_time">2026-02-20</element></license> #License 配置信息
+  licenseModel: TRIAL #License 配置信息
+management:
+  endpoints:
+    web:
+      exposure:
+        include: info,health,env,configprops,mappings,threaddump,metrics #管理节点

+ 25 - 0
server/yusp-tagging-starter/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+spring:
+  application:
+    name: tag-server
+  cloud:
+    nacos:
+      discovery:
+        server-addr: 10.192.72.13:38848
+        namespace: ai-tagging
+      config:
+        server-addr: 10.192.72.13:38848
+        namespace: ai-tagging
+        file-extension: yaml
+        username: nacos
+        password: nacos
+        group: DEFAULT_GROUP
+        extension-configs[0]:
+          data-id: tag-server.yaml
+          refresh: true
+        extension-configs[1]:
+          data-id: application-license.yml
+          refresh: true #配置扩展属性动态刷新
+
+
+server:
+  port: 8080

+ 8 - 0
server/yusp-tagging-starter/src/main/scripts/deploy.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+SERVICE_NAME=frs-yusp-bfd-starter
+SERVICE_VERSION=2.1.2-SNAPSHOT
+unzip -o $HOME/app/SERVICE_NAME-SERVICE_VERSION.zip -d $HOME/app/$SERVICE_NAME
+cd $HOME/app/$SERVICE_NAME/scripts
+./shutdown.sh
+./startup.sh
+

+ 17 - 0
server/yusp-tagging-starter/src/main/scripts/shutdown.sh

@@ -0,0 +1,17 @@
+#!/bin/bash
+SERVICE_NAME=frs-yusp-bfd-starter
+export APP_NAME=$SERVICE_NAME
+if [[ -z "$JAVA_HOME" && -d /usr/java/latest/ ]]; then
+    export JAVA_HOME=/usr/java/latest/
+fi
+
+cd  dirname $0 /..
+
+if [[ ! -f $SERVICE_NAME".war" && -d current ]]; then
+    cd current
+fi
+
+if [[ -f $SERVICE_NAME".war" ]]; then
+  chmod a+x $SERVICE_NAME".war"
+  ./$SERVICE_NAME".war" stop
+fi

+ 1 - 0
server/yusp-tagging-starter/src/main/scripts/startup.cmd

@@ -0,0 +1 @@
+java -jar -Dfile.encoding=UTF-8 ../frs-yusp-bfd-starter.jar

+ 105 - 0
server/yusp-tagging-starter/src/main/scripts/startup.sh

@@ -0,0 +1,105 @@
+#!/bin/bash
+SERVICE_NAME=frs-yusp-bfd-starter
+## Adjust log dir if necessary
+LOG_DIR=../logs
+## Adjust server port if necessary
+SERVER_PORT=8080
+## set app name
+export APP_NAME=$SERVICE_NAME
+
+## You must Adjust for apollo !!!!!!!!!!!!!!!!!
+#是否启用apollo
+APOLLO_ENABLED=true
+APOLLO_APPID=yusp-gateway
+APOLLO_ENV=DEV
+APOLLO_DEVMETA=http://localhost:9001
+NAMESPACES=application.yml
+
+## Adjust memory settings if necessary
+#export JAVA_OPTS="-Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8"
+#export JAVA_OPTS="-Xms6144m -Xmx6144m -Xss256k -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:NewSize=4096m -XX:MaxNewSize=4096m -XX:SurvivorRatio=8"
+
+## Only uncomment the following when you are using server jvm
+#export JAVA_OPTS="$JAVA_OPTS -server -XX:-ReduceInitialCardMarks"
+
+export JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:MaxTenuringThreshold=9 -XX:+UseConcMarkSweepGC -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:+CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Djava.security.egd=file:/dev/./urandom"
+export JAVA_OPTS="$JAVA_OPTS -Dserver.port=$SERVER_PORT -Dlogging.file=$LOG_DIR/$SERVICE_NAME.log -Xloggc:$LOG_DIR/heap_trace.txt -XX:HeapDumpPath=$LOG_DIR/HeapDumpOnOutOfMemoryError/"
+if [ $APOLLO_ENABLED ]; then
+    export JAVA_OPTS="$JAVA_OPTS -Dapp.id=$APOLLO_APPID -Denv=$APOLLO_ENV -Dapollo.meta=$APOLLO_DEVMETA -Dapollo.bootstrap.enabled=true -Dapollo.bootstrap.namespaces=$NAMESPACES"
+else
+    export JAVA_OPTS="$JAVA_OPTS -Dapollo.bootstrap.enabled=false"
+fi
+
+PATH_TO_JAR=$SERVICE_NAME".jar"
+SERVER_URL="http://localhost:$SERVER_PORT"
+
+function checkPidAlive {
+    return 0;
+}
+
+cd  dirname $0 /..
+
+for i in  ls *$SERVICE_NAME-*.jar 2>/dev/null
+do
+    if [[ ! $i == *"-sources.jar" ]]
+    then
+        PATH_TO_JAR=$i
+        break
+    fi
+done
+
+if [[ ! -f PATH_TO_JAR && -d current ]]; then
+    cd current
+    for i in  ls *$SERVICE_NAME-*.jar 2>/dev/null
+    do
+        if [[ ! $i == *"-sources.jar" ]]
+        then
+            PATH_TO_JAR=$i
+            break
+        fi
+    done
+fi
+
+if [[ -f $SERVICE_NAME".jar" ]]; then
+  rm -rf $SERVICE_NAME".jar"
+fi
+
+printf "$(date) ==== Starting ==== \n"
+
+ln $PATH_TO_JAR $SERVICE_NAME".jar"
+chmod a+x $SERVICE_NAME".jar"
+./$SERVICE_NAME".jar" start
+
+rc=$?;
+
+if [[ $rc != 0 ]];
+then
+    echo "$(date) Failed to start $SERVICE_NAME.jar, return code: $rc"
+    exit $rc;
+fi
+
+declare -i counter=0
+declare -i max_counter=48 # 48*5=240s
+declare -i total_time=0
+
+printf "Waiting for server startup"
+until [[ (( counter -ge max_counter )) || "$(curl -X GET --silent --connect-timeout 1 --max-time 2 --head $SERVER_URL | grep "HTTP/1.1 200")" != "" ]];
+do
+    printf "."
+    counter+=1
+    sleep 5
+
+    checkPidAlive
+done
+
+total_time=counter*5
+
+if [[ (( counter -ge max_counter )) ]];
+then
+    printf "\n$(date) Server failed to start in $total_time seconds!\n"
+    exit 1;
+fi
+
+printf "\n$(date) Server started in $total_time seconds!\n"
+
+exit 0;