1
0

10 کامیت‌ها 67dd33f339 ... 1716a72786

نویسنده SHA1 پیام تاریخ
  2643616413 1716a72786 合并接口 4 روز پیش
  jiayongqiang 67dd33f339 Merge branch 'master' of http://git.yangzhiqiang.tech/jiayq/ai-tagging 4 روز پیش
  jiayongqiang f0a2317abf agent接口开发完成 4 روز پیش
  2507040827 28ffc90dfb 修改打标趋势 5 روز پیش
  2507040827 3aea9a4c88 标签体系详情功能开发 5 روز پیش
  jianggs 53a2b4aca3 Merge branch 'master' of http://git.yangzhiqiang.tech/jiayq/ai-tagging 5 روز پیش
  jianggs 069cfd5861 前端基础框架更新 5 روز پیش
  jianggs c8c58ca20c 接口联调 5 روز پیش
  2507040827 a06ed92ddb Merge remote-tracking branch 'origin/master' 5 روز پیش
  2507040827 3df18336fd 智能打标结果相关功能-增加下载功能,和打标未确认 5 روز پیش
100فایلهای تغییر یافته به همراه2164 افزوده شده و 4485 حذف شده
  1. 2 2
      agent/config.ini
  2. 1 104
      agent/pdm.lock
  3. 0 2
      agent/pyproject.toml
  4. 0 77
      agent/readme.md
  5. 0 1
      agent/src/agent/Untitled-1.json
  6. 0 1
      agent/src/agent/agent.py
  7. 21 60
      agent/src/agent/api_outter.py
  8. 0 9
      agent/src/agent/core/dao.py
  9. 35 0
      agent/tests/api_tagging_test.py
  10. 0 53
      agent/tests/generate_excel.py
  11. 0 1911
      agent/tests/test_data.txt
  12. 0 22
      agent/tests/test_feedback.py
  13. 1 1
      agent/tests/test_generate_reg.py
  14. 1 86
      agent/tests/test_inner_api.py
  15. 14 0
      agent/tests/test_outter_api.py
  16. 0 4
      agent/tests/test_query.py
  17. 2 13
      agent/tests/test_reg.py
  18. 0 14
      agent/tests/test_tagging.py
  19. 0 25
      agent/tests/test_tagging_batch.py
  20. BIN
      agent/服务接口定义.xlsx
  21. 11 0
      server/pom.xml
  22. 36 8
      server/yusp-tagging-core/pom.xml
  23. 33 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/annotation/RequireRole.java
  24. 34 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/aop/ApiLogAspect.java
  25. 13 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/condition/AuthEnabledCondition.java
  26. 190 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/AuthInterceptor.java
  27. 0 15
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/DataDictionary.java
  28. 31 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/FastApiConfig.java
  29. 40 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/config/WebMvcConfig.java
  30. 2 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagAppController.java
  31. 13 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagCategoryController.java
  32. 13 59
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoController.java
  33. 0 107
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoVersionController.java
  34. 22 68
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagLogController.java
  35. 153 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagUserController.java
  36. 105 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/FastApiController.java
  37. 26 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/LoginRequestDto.java
  38. 0 114
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoDto.java
  39. 0 114
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagInfoVersionDto.java
  40. 20 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/TagSumDto.java
  41. 35 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingFeedbackRequestDto.java
  42. 23 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingQueryRequestDto.java
  43. 32 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingRequestDto.java
  44. 95 20
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoEntity.java
  45. 0 232
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoVersionEntity.java
  46. 0 25
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagLogEntity.java
  47. 57 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagUser.java
  48. 5 5
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoQueryVo.java
  49. 0 210
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoVersionQueryVo.java
  50. 2 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/DataOverviewVo.java
  51. 0 58
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/ExportDataVo.java
  52. 41 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/LoginResponseVo.java
  53. 0 74
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/TagNodeVo.java
  54. 0 35
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/VersionRollbackVo.java
  55. 36 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingQueryResponseVo.java
  56. 16 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingResponseVo.java
  57. 6 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagCategoryMapper.java
  58. 0 7
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagInfoDao.java
  59. 0 17
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagInfoVersionDao.java
  60. 2 1
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagLogDao.java
  61. 23 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagUserMapper.java
  62. 3 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagCategoryService.java
  63. 0 19
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagInfoService.java
  64. 0 25
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagInfoVersionService.java
  65. 0 2
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AitagTagLogService.java
  66. 46 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/AuthService.java
  67. 31 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/FastApiService.java
  68. 29 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagCategoryServiceImpl.java
  69. 2 202
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoServiceImpl.java
  70. 0 81
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoVersionServiceImpl.java
  71. 52 60
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagLogServiceImpl.java
  72. 118 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AuthServiceImpl.java
  73. 199 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/FastApiServiceImpl.java
  74. 81 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/util/AuthContextUtil.java
  75. 126 0
      server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/util/JwtUtil.java
  76. 12 0
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagCategoryMapper.xml
  77. 3 60
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoMapper.xml
  78. 0 21
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoVersionMapper.xml
  79. 3 5
      server/yusp-tagging-core/src/main/resources/mapper/AitagTagLogMapper.xml
  80. 10 0
      server/yusp-tagging-core/src/main/resources/mapper/AitagUserMapper.xml
  81. 1 2
      server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties
  82. 0 7
      server/yusp-tagging-starter/pom.xml
  83. 21 6
      server/yusp-tagging-starter/src/main/java/cn/com/yusys/yusp/detail/App.java
  84. 15 1
      server/yusp-tagging-starter/src/main/resources/application.yml
  85. 5 6
      web/.editorconfig
  86. 0 8
      web/.env
  87. 0 15
      web/.env.development
  88. 37 2
      web/.env.production
  89. 22 0
      web/.env.staging
  90. 5 17
      web/.eslintignore
  91. 106 140
      web/.eslintrc.js
  92. 27 20
      web/.gitignore
  93. 3 10
      web/.npmrc
  94. 7 4
      web/.postcssrc.js
  95. 0 21
      web/.prettierignore
  96. 0 43
      web/.prettierrc.js
  97. 0 16
      web/.stylelintignore
  98. 5 0
      web/.travis.yml
  99. 0 132
      web/.xy-tsd.js
  100. 3 4
      web/.yarnrc

+ 2 - 2
agent/config.ini

@@ -6,9 +6,9 @@ password = 123456
 database = fjnx
 
 [llm]
-model = Qwen3-4B-Instruct
+model = qwen3-vl-32b-instruct
 temperature = 0.2
-base_url = http://10.192.72.12:8003/v1
+base_url = http://172.16.40.16:20001/compatible-mode/v1
 api_key = 
 
 [embedding]

+ 1 - 104
agent/pdm.lock

@@ -5,7 +5,7 @@
 groups = ["default"]
 strategy = ["inherit_metadata"]
 lock_version = "4.5.0"
-content_hash = "sha256:44f4afdfba6d7e4aa629c25c88506687ab6bdaf85333b4a5331cbb7dc551617e"
+content_hash = "sha256:456f199d9527d2770f35dba560e5b05b51f845d481d5433946ddd0326bf3b9b5"
 
 [[metadata.targets]]
 requires_python = "==3.10.*"
@@ -194,18 +194,6 @@ files = [
 ]
 
 [[package]]
-name = "et-xmlfile"
-version = "2.0.0"
-requires_python = ">=3.8"
-summary = "An implementation of lxml.xmlfile for the standard library"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-files = [
-    {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"},
-    {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"},
-]
-
-[[package]]
 name = "exceptiongroup"
 version = "1.3.1"
 requires_python = ">=3.7"
@@ -541,21 +529,6 @@ files = [
 ]
 
 [[package]]
-name = "openpyxl"
-version = "3.1.5"
-requires_python = ">=3.8"
-summary = "A Python library to read/write Excel 2010 xlsx/xlsm files"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-dependencies = [
-    "et-xmlfile",
-]
-files = [
-    {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"},
-    {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"},
-]
-
-[[package]]
 name = "orjson"
 version = "3.11.7"
 requires_python = ">=3.10"
@@ -611,32 +584,6 @@ files = [
 ]
 
 [[package]]
-name = "pandas"
-version = "2.3.3"
-requires_python = ">=3.9"
-summary = "Powerful data structures for data analysis, time series, and statistics"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-dependencies = [
-    "numpy>=1.22.4; python_version < \"3.11\"",
-    "numpy>=1.23.2; python_version == \"3.11\"",
-    "numpy>=1.26.0; python_version >= \"3.12\"",
-    "python-dateutil>=2.8.2",
-    "pytz>=2020.1",
-    "tzdata>=2022.7",
-]
-files = [
-    {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"},
-    {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"},
-    {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"},
-    {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"},
-    {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"},
-    {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"},
-    {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"},
-    {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"},
-]
-
-[[package]]
 name = "pydantic"
 version = "2.12.5"
 requires_python = ">=3.9"
@@ -702,21 +649,6 @@ files = [
 ]
 
 [[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-summary = "Extensions to the standard Python datetime module"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-dependencies = [
-    "six>=1.5",
-]
-files = [
-    {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
-    {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[[package]]
 name = "python-multipart"
 version = "0.0.22"
 requires_python = ">=3.10"
@@ -729,17 +661,6 @@ files = [
 ]
 
 [[package]]
-name = "pytz"
-version = "2025.2"
-summary = "World timezone definitions, modern and historical"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-files = [
-    {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
-    {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
-]
-
-[[package]]
 name = "pyyaml"
 version = "6.0.3"
 requires_python = ">=3.8"
@@ -821,18 +742,6 @@ files = [
 ]
 
 [[package]]
-name = "six"
-version = "1.17.0"
-requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-summary = "Python 2 and 3 compatibility utilities"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-files = [
-    {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
-    {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
-]
-
-[[package]]
 name = "sniffio"
 version = "1.3.1"
 requires_python = ">=3.7"
@@ -937,18 +846,6 @@ files = [
 ]
 
 [[package]]
-name = "tzdata"
-version = "2025.3"
-requires_python = ">=2"
-summary = "Provider of IANA time zone data"
-groups = ["default"]
-marker = "python_version == \"3.10\""
-files = [
-    {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"},
-    {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"},
-]
-
-[[package]]
 name = "urllib3"
 version = "2.6.3"
 requires_python = ">=3.9"

+ 0 - 2
agent/pyproject.toml

@@ -17,8 +17,6 @@ dependencies = [
     "elasticsearch==8.9.0",
     "numpy>=2.2.6",
     "asyncer>=0.0.17",
-    "pandas>=2.3.3",
-    "openpyxl>=3.1.5",
 ]
 requires-python = ">=3.10"
 readme = "README.md"

+ 0 - 77
agent/readme.md

@@ -1,78 +1 @@
 # AI-TAGGING
-
-## 1. 对管理端接口
-
-### 1.1 同步标签接口
-- URL:/api/aitag/admin/v1/synchronize_tag
-- METHOD: post
-- Content-Type: application/json
-- BODY:{"tag_ids": [xx,xx]}
-  
-### 1.2 同步删除标签接口
-- URL: /api/aitag/admin/v1/delete_tag
-- METHOD:post
-- Content-Type: application/json
-- Body:{"tag_ids": ["2","3"]}
-
-### 1.3 生成正则表达式接口
-
-## 2. 对下游系统接口
-
-### 2.1 智能打标接口
-- URL: /api/aitag/v1/tagging
-- METHOD:POST
-- Content-Type:application/json
-- Body:{"business_attr": "test_attr","phrase": "职业:水产养殖人员 投向:海水养殖 用途:个人经营"}
-
-### 2.2 查询接口
-- URL:/api/aitag/v1/query
-- METHOD:GET
-- params:
-  - business_attr:d372684dbae64b3dadd33b631480d946 # 申请编号
-- response:
-```
-{
-    "code":200,
-    "message":"AI Query Endpoint",
-    "data":{
-        "id":"016e96f4b76e4d1097421e9e055db48e",
-        "app_id":null,
-        "insert_time":"2026-02-26T18:23:32","business_attr":"d372684dbae64b3dadd33b631480d946",
-        "phrase":"职业:水产养殖人员 投向:海水养殖 用途:个人经营",
-        "attachment":null,"attachment_url":null,
-        "result":"[{\"id\": \"20260200001\", \"tag_code\": \"011\", \"tag_name\": \"海水养殖\", \"desc\": \"贷款用途明确为‘个人经营’,且投向为‘海水养殖’,直接对应标签定义中‘在海水环境中进行人工养殖’的核心语义。尽管未使用‘海水养殖’等术语,但‘投向:海水养殖’已明确表达在
-        海水环境中开展养殖活动,符合‘通过人工干预方式培育水生生物’的生产本质。该信息足以支撑在本笔贷款层面命中‘海水养殖’标签,且无任何符合排除情形(如捕捞、服务支持等)的描述。\", \"passr\": true}]",
-        "feedback_user_id":null,
-        "feedback_user_nm":null,
-        "feedback_time":null,
-        "feedback":null,
-        "feedback_result":null,
-        "state":1,
-        "consuming_time":null,
-        "category_code":null,
-        "contract_no":null,
-        "reg_result":"['20260200001']",
-        "feedback_user_org":null,
-        "feedback_user_endpoint":null,
-        "is_delete":0
-        }
-}
-```
-
-### 2.3 反馈接口
-- URL: /api/aitag/v1/feedback
-- METHOD:GET
-- BODY:
-```
-{
-    "user_id": "12345",
-    "user_nm": "张三",
-    "feedback": "agree",
-    "contract_no": "HT-2024-001",
-    "user_org": "XX公司",
-    "user_endpoint": "XX网点",
-    "business_attr": "99c1c7bc976c45d0912e914a602d547f"
-}
-```
-
-

+ 0 - 1
agent/src/agent/Untitled-1.json

@@ -1 +0,0 @@
-[{"id": "20260200002", "tag_code": "012", "tag_name": "海洋捕捞", "desc": "贷款投向为‘海水捕捞’,用途为‘渔业’,明确指向在海洋自然水域中通过直接采捕方式获取天然海洋生物资源的生产性经济活动,符合标签定义中‘在海洋水域中直接捕获野生生物’的核心语义要素。尽管未出现‘捕捞’等动词,但‘海水捕捞’作为投向明确表达了以获取海产经济价值为目的的直接采捕行为,且‘渔业’作为用途进一步佐证了其生产性经济活动属性。结合‘海水’与‘捕捞’的语义组合,可合理推断其作业环境为海洋自然水域,行为本质为直接采获野生生物,符合标签判定要点。不存在人工培育、苗种投放、养殖管理等排除情形,因此支持命中。", "passr": true}]

+ 0 - 1
agent/src/agent/agent.py

@@ -80,7 +80,6 @@ async def reflect_check(context: str, labels: list):
         3.不以企业整体行业属性替代对贷款具体内容的判断
         4.所有判断应服务于产业打标的可用性与可解释性
     """
-    print(prompt)
     response = await agent.ainvoke({
         "messages": [{"role":"system","content": prompt}]
     },context = {})

+ 21 - 60
agent/src/agent/api_outter.py

@@ -30,7 +30,7 @@ class TaggingRequest(BaseModel):
     business_attr: str = Field(..., description="业务属性")
     phrase: str = Field(..., description="需要打标签的文本")
 
-async def execute_reg(id:str,phrase: str)-> list:
+def execute_reg(phrase: str)-> list:
     sql = f"""select 
                     tti.id,
                     tti.reg
@@ -40,46 +40,26 @@ async def execute_reg(id:str,phrase: str)-> list:
                     """    
     labels = dao.query(sql)
     # 循环调用reg匹配phrase,匹配成功则返回标签id
-    result = []
-    try:
-        for label in labels:
-            reg = label[1]
-            logging.info(f"Executing regex for label_id {label[0]}")
-            if reg is not None:
-                pattern = re.compile(reg, re.VERBOSE)
-                if pattern.match(phrase):
-                    result.append(label[0])
-            else:
-                result.append(label[0])
-    except Exception as e:
-        logging.error(f"Regex execution failed: {e}")
-    logging.info(f"Regex filtering candidates: {result}")
-    dao.execute(
-            """UPDATE aitag_tag_log SET reg_result = %s WHERE id = %s""",
-            (str(result), id)
-        )
-    logging.info(f"Updated reg_result for log_id {id}")
-    return result
+    # result = []
+    # for label in labels:
+    #     reg = label[1]
+    #     if reg is not None and re.search(reg, phrase):
+    #         result.append(label[0])
+    return [ l[0] for l in labels]
 
 def vector_similarity_search(phrase: str, ids:list)-> list:
     # 这里应该调用向量数据库进行相似度检索,返回相关标签id列表
     query = get_embeddings([phrase])[0]
     results = hybrid_search(ids, query, top_k=TOP_K)
-    # return [{"id": r["_id"], "score": r["_score"], "tag_prompt": r["_source"]["tag_prompt"],"tag_name": r["_source"]["tag_name"],"tag_code": r["_source"]["tag_code"]} for r in results]
-    return [{"id": r["_id"], "tag_remark":r["_source"]["tag_remark"], "tag_prompt": r["_source"]["tag_prompt"],"tag_name": r["_source"]["tag_name"],"tag_code": r["_source"]["tag_code"]} for r in results]
+    return [{"id": r["_id"], "score": r["_score"], "tag_prompt": r["_source"]["tag_prompt"],"tag_name": r["_source"]["tag_name"],"tag_code": r["_source"]["tag_code"]} for r in results]
 
 def init_tag_log(request: TaggingRequest):
-    id = uuid.uuid4().hex
-    # 保证business_attr的唯一性,如果已经存在相同business_attr且状态为0(处理中)的记录,则将is_delete设为1(已删除),然后插入新记录
-    dao.execute(
-        """UPDATE aitag_tag_log SET is_delete = 1 WHERE business_attr = %s""",
-        (request.business_attr,)
-    )
-    dao.execute(
-        """INSERT INTO aitag_tag_log (id,app_id, insert_time, business_attr, phrase, state) VALUES (%s, %s, %s, %s, %s, %s)""",
-        (id,request.app_id, datetime.now(), request.business_attr, request.phrase, 0)
-    )
-    return id
+     id = uuid.uuid4().hex
+     dao.execute(
+            """INSERT INTO aitag_tag_log (id,app_id, insert_time, business_attr, phrase, state) VALUES (%s, %s, %s, %s, %s, %s)""",
+            (id,request.app_id, datetime.now(), request.business_attr, request.phrase, 0)
+        )
+     return id
 
 def update_tag_log(id:str, result:str):
     dao.execute(
@@ -90,7 +70,7 @@ def update_tag_log(id:str, result:str):
 async def run_ai_pipeline(log_id: str, phrase: str):
     try:
         # step1: 正则过滤
-        result = await execute_reg(log_id,phrase)
+        result = execute_reg(phrase)
         logging.info(f"[{log_id}] Regex filtering result: {result}")
 
         # step2: 向量检索
@@ -106,7 +86,8 @@ async def run_ai_pipeline(log_id: str, phrase: str):
             logging.info(f"[{log_id}] LLM result: {result}")
 
         # step4: 更新数据库
-        update_tag_log(log_id, str(result))
+        if result:
+            update_tag_log(log_id, str(result))
             
     except Exception as e:
         logging.error(f"[{log_id}] Pipeline failed: {e}")
@@ -129,30 +110,10 @@ async def ai_tagging(request: TaggingRequest,background_tasks: BackgroundTasks):
     }
 
 @router.get("/query")
-def query(business_attr: str):
-    # 查询指定business_attr对应的标签信息
-    sql = """SELECT * FROM aitag_tag_log WHERE business_attr = %s and is_delete = 0"""
-    result = dao.query_dict(sql, (business_attr,))
-    print(result)
-    return {"code": 200, "message": "AI Query Endpoint", "data": result[0] if result else None}
-
-class FeedbackRequest(BaseModel):
-    user_id: str = Field(..., description="用户ID")
-    user_nm: Optional[str] = Field(None, description="用户名称")
-    feedback: str = Field(..., description="用户反馈,必填,agree/reject")
-    feedback_result: Optional[str] = Field(None, description="反馈的标签结果")
-    contract_no: str = Field(..., description="合同编号")
-    user_org: Optional[str] = Field(None, description="用户所属机构")
-    user_endpoint: Optional[str] = Field(None, description="用户所属网点")
-    business_attr: str = Field(..., description="业务属性")
+def query():
+    return {"message": "AI Query Endpoint"}
 
 @router.post("/feedback")
-def ai_feedback(feedback_request: FeedbackRequest):
-    logging.info(f"Received feedback request: {feedback_request}")
-    # 这里将用户的反馈信息保存到数据库中aitag_tag_log,供后续分析和模型优化使用
-    dao.execute(
-        """update aitag_tag_log set feedback = %s, feedback_result = %s, feedback_time = %s, feedback_user_id = %s, feedback_user_nm = %s, contract_no = %s, feedback_user_org = %s, feedback_user_endpoint = %s, state = %s where business_attr = %s""",   
-        (feedback_request.feedback, feedback_request.feedback_result, datetime.now(), feedback_request.user_id, feedback_request.user_nm, feedback_request.contract_no, feedback_request.user_org, feedback_request.user_endpoint, 2, feedback_request.business_attr)
-    )
-    return {"code": 200, "message": "Feedback received successfully"}
+def ai_feedback():
+    return {"message": "AI Feedback Endpoint"}
 

+ 0 - 9
agent/src/agent/core/dao.py

@@ -34,15 +34,6 @@ def query(sql, params=None):
             cursor.execute(sql, params)
             result = cursor.fetchall()
             return result
-
-def query_dict(sql, params=None):
-    with pool.connection() as conn:
-        with conn.cursor() as cursor:
-            cursor.execute(sql, params)
-            result = cursor.fetchall()
-
-            columns = [desc[0] for desc in cursor.description]
-            return [dict(zip(columns, row)) for row in result]
    
 
 def execute(sql, params=None):

+ 35 - 0
agent/tests/api_tagging_test.py

@@ -0,0 +1,35 @@
+import requests
+from agent.core.sm3_sign import generate
+
+APP_ID = "test_app"
+APP_SECRET = "test_secret"
+
+def test_tagging_endpoint():
+    with open("test/data/输入-1.docx", "rb") as f:
+        timestamp = 1234567890
+        url = "http://localhost:8080/aitag/v1/tagging/"
+        sign = generate(APP_SECRET.encode('utf-8'), {
+            'app_id': 'test_app',
+            'timestamp': timestamp,
+            'business_attr': 'test_attr',   
+            'category': 'test_category',
+            'phrase': '测试短语'
+        })
+
+        data = {
+            'app_id': 'test_app',
+            'timestamp': timestamp,
+            'sign': sign,
+            'business_attr': 'test_attr',   
+            'category': 'test_category',
+            'phrase': '测试短语'
+        }
+        response = requests.post(url, data=data, files={'attachment': ("输入-1.docx", f)})
+        assert response.status_code == 200
+        json_response = response.json()
+        assert json_response['code'] == 200
+        assert json_response['message'] == "AI Tagging successful"
+        print("Test passed!")
+
+if __name__ == "__main__":
+    test_tagging_endpoint()

+ 0 - 53
agent/tests/generate_excel.py

@@ -1,53 +0,0 @@
-import pandas as pd
-
-# 定义完整的表格数据:28 行 x 18 列 (A to R)
-# 每一行是一个包含 18 个元素的列表
-rows = [
-    # 第1行
-    ["交易名称", "申请进度查询", "", "", "", "", "", "", "服务名称", "个人贷款申请信息查询服务", "", "", "", "", "是否文件", "X", "", ""],
-    # 第2行
-    ["原交易代码", "", "", "", "", "", "", "", "服务代码", "G2003000152", "", "服务场景", "01-申请进度查询", "是否分页", "Y", "", "", ""],
-    # 第3行
-    ["交易描述", "借管各业务阶段申请进度列表查询", "", "", "", "", "", "", "发布日期:", "", "", "更新日期:", "", "", "", "", "", ""],
-    # 第4行
-    ["原始接口", "", "", "", "", "", "", "", "FJMXKBSD", "", "", "", "", "", "", "", "", ""],
-    # 第5行(表头)
-    ["英文名称", "ESB定义名", "中文名称", "数据类型", "长度", "是否必输", "字典名称", "备注", "", "英文名称", "数据类型", "长度", "中文名称", "是否必输", "字典名称", "备注", "", ""],
-    
-    # 输入字段开始(第6行起)
-    ["QUERY_TYPE", "查询类型", "查询类型", "string", "5", "Y", "", "1 客户号\n2 借管业务流水号\n3 合同编号", "", "QUERY_TYPE", "string", "5", "查询类型", "Y", "", "1 客户号\n2 借管业务流水号\n3 合同编号", "", ""],
-    ["BUSI_TYPE", "业务类型", "业务类型", "string", "1", "Y", "", "1 贷款申请\n2 出账申请\n3 展期申请", "", "BUSI_TYPE", "string", "1", "业务类型", "Y", "", "1 贷款申请\n2 出账申请\n3 展期申请", "", ""],
-    ["CUST_NO", "客户号", "客户号", "string", "40", "N", "", "查询类型为1时必输", "", "CUST_NO", "string", "40", "客户号", "N", "", "查询类型为1时必输", "", ""],
-    ["INSTU_CDE", "所属法人行社", "所属法人行社", "string", "20", "N", "", "查询类型为1时必输", "", "INSTU_CDE", "string", "20", "所属法人行社", "N", "", "查询类型为1时必输", "", ""],
-    ["PRO_ID", "产品编号", "产品编号", "string", "40", "N", "", "查询类型为1时选填", "", "PRO_ID", "string", "40", "产品编号", "N", "", "查询类型为1时选填", "", ""],
-    ["IQP_SEQNO", "借管业务流水号", "借管业务流水号", "string", "40", "N", "", "查询类型为2是必输", "", "BUSS_SEQ_NO", "string", "40", "借管业务流水号", "N", "", "查询类型为2是必输", "", ""],
-    ["CONT_NO", "合同编号", "合同编号", "string", "40", "N", "", "查询类型为3是必输,业务类型为1时无须查询", "", "CONT_NO", "string", "40", "合同编号", "N", "", "查询类型为3是必输", "", ""],
-    ["APPROVE_STATUS", "申请状态", "申请状态", "string", "5", "N", "CD0399", "", "", "APPROVE_STATUS", "string", "5", "申请状态", "N", "CD0399", "", "", ""],
-    
-    # 空行(第14行)
-    ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""],
-    
-    # 输出字段开始
-    ["APP_PRO_LIST", "申请进度列表", "申请进度列表", "array", "", "", "", "start", "", "APP_PRO_LIST", "array", "", "申请进度列表", "", "", "start", "", ""],
-    ["CONT_NO", "", "合同编号", "string", "40", "N", "", "", "", "CONT_NO", "string", "40", "合同编号", "N", "", "", "", ""],
-    ["INSTU_CDE", "", "所属法人行社", "string", "20", "", "", "", "", "INSTU_CDE", "string", "20", "所属法人行社", "", "", "", "", ""],
-    ["IQP_SEQNO", "", "借管业务流水号", "string", "40", "", "", "", "", "BUSS_SEQ_NO", "string", "40", "借管业务流水号", "", "", "", "", ""],
-    ["APPROVE_STATUS", "", "申请状态", "string", "5", "", "CD0399", "", "", "APPROVE_STATUS", "string", "5", "申请状态", "", "CD0399", "", "", ""],
-    ["CUR_TYPE", "", "币种", "string", "10", "", "CD0020", "", "", "CCY", "string", "10", "币种", "", "CD0020", "", "", ""],
-    ["APF_AMT", "", "申请金额", "double", "18.2", "", "", "", "", "APF_AMT", "string", "18.2", "申请金额", "", "", "", "", ""],
-    ["APPLY_DATE", "", "申请时间", "string", "25", "", "", "yyyy-MM-dd hh:mm:ss", "", "APPLY_DATE", "string", "25", "申请时间", "", "", "yyyy-MM-dd hh:mm:ss", "", ""],
-    ["APR_PASS_DATE", "", "审批通过时间", "string", "25", "", "", "yyyy-MM-dd hh:mm:ss", "", "APR_PASS_DATE", "string", "25", "审批通过时间", "", "", "yyyy-MM-dd hh:mm:ss", "", ""],
-    ["LOAN_PURP", "", "借款用途", "string", "256", "", "", "填款申请时返回", "", "LOAN_PURP", "string", "256", "借款用途", "", "", "填款申请时返回", "", ""],
-    ["INCOMING_CODE", "", "渠道系统编号", "string", "40", "N", "", "ECS系统编号", "", "CHANNEL_SYS_ID", "string", "40", "渠道系统编号", "N", "", "ECS系统编号", "", ""],
-    ["INCOMING_SERNO", "", "渠道业务流水号", "string", "40", "N", "", "", "", "CHANNEL_SEQ_NO", "string", "40", "渠道业务流水号", "N", "", "", "", ""],
-    ["APP_PRO_LIST", "", "申请进度列表", "array", "", "", "", "end", "", "APP_PRO_LIST", "array", "", "申请进度列表", "", "", "end", "", ""],
-]
-
-# 转为 DataFrame
-df = pd.DataFrame(rows)
-
-# 保存到 Excel
-output_file = "服务接口定义.xlsx"
-df.to_excel(output_file, index=False, header=False)
-
-print(f"✅ Excel 文件已生成:{output_file}")

+ 0 - 1911
agent/tests/test_data.txt

@@ -1,1911 +0,0 @@
-销售人员 服装零售 经营周转
-销售人员 其他农业 个人消费
-农业生产服务人员 仁果类和核果类水果种植 种植果树
-农、林、牧、渔业生产及辅助人员 农业 农业
-农作物生产人员 蔬菜种植 农业
-中小学教育教师 成人小学教育 家庭综合消费
-农、林、牧、渔业生产及辅助人员 林木育种 农、林、牧、渔专业及辅助性活动
-销售人员 其他房地产业 购房
-社会生产服务和生活服务人员 果品、蔬菜零售 个人经营
-农作物生产人员 小麦种植 种植小麦
-工程技术人员 零售业 零售业
-自由职业者 茶叶种植 个人经营
-木制品制造人员 木质装饰材料零售 个人经营
-中等职业教育教师 中等职业学校教育 转贷
-畜牧制品加工人员 肉制品及副产品加工 肉类食品加工
-其他批发与零售服务人员 便利店零售 经营便利店
-农作物生产人员 普通货物道路运输 借新还旧
-行政业务办理人员 其他未列明服务业 个人消费
-建筑工程技术人员 其他建筑安装 借新还旧
-其他修理及制作服务人员 五金零售 用于归还黄恩贵名下贷款
-中等职业教育教师 住宅装饰和装修 个人消费
-行政事务处理人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-其他农、林、牧、渔业生产及辅助人员 餐饮配送服务 餐饮业
-销售人员 肉、禽、蛋、奶及水产品批发 经营冷冻食品等
-销售人员 肉、禽、蛋、奶及水产品批发 经营冷冻食品等
-销售人员 肉、禽、蛋、奶及水产品批发 经营冷冻食品
-其他租赁和商务服务人员 建筑工程机械与设备经营租赁 购挖掘机配件
-木制品制造人员 金属制品修理 流动资金
-木制品制造人员 金属制品修理 流动资金
-其他社会生产和生活服务人员 其他房屋建筑业 购建材
-销售人员 其他室内装饰材料零售 经营建材
-农作物生产人员 精制茶加工 经营茶叶加工厂
-不便分类的其他从业人员 木片加工 购木材
-其他批发与零售服务人员 建材批发 购砂石
-水产养殖人员 海水养殖 渔排养殖
-作物种子(苗)繁育生产人员 花卉种植 种植
-房屋建筑施工人员 其他未列明建筑业 经营搅拌场
-建筑工程技术人员 花卉种植 种植花木
-行政执法和仲裁人员 其他农业 个人消费
-销售人员 陶瓷、石材装饰材料零售 进货等
-其他修理及制作服务人员 其他未列明日用产品修理业
-水产养殖人员 海水养殖 个人经营
-销售人员 机动车燃油零售 个人经营
-农作物生产人员 小麦种植 经营周转
-畜禽饲养人员 果品、蔬菜零售 个人消费
-农作物生产人员 柑橘类种植 种果
-销售人员 其他室内装饰材料零售 销售建材等
-中小学教育教师 其他综合零售 个人消费资金
-其他农业生产人员 茶叶种植 续贷盘转
-销售人员 家具零售 归还郑群贷款、信用卡本金
-餐饮服务人员 正餐服务 个人经营
-销售人员 其他居民服务业 借新还旧
-贸易经济代理人员 五金产品批发 购卫浴等
-银行服务人员 其他居民服务业 个人消费
-销售人员 纺织品、针织品及原料批发 个人经营
-检察官 零售业 零售业
-作物种子(苗)繁育生产人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-其他社会生产和生活服务人员 米、面制品及食用油批发 批发业
-餐饮服务人员 其他未列明餐饮业 个人经营
-农业生产人员 森林经营和管护 林业
-农作物生产人员 食用菌种植 种植香菇
-销售人员 化妆品及卫生用品零售 经营网络销售购买化妆品
-销售人员 住宅装饰和装修 经营建材
-建筑装饰人员 其他房屋建筑业 承包工程
-销售人员 文具用品零售 采购玩具
-住宿服务人员 造纸和纸制品业 造纸和纸制品业
-企事业单位负责人 五金产品批发 个人经营
-水产养殖人员 海水养殖 养殖鲍鱼
-行政事务处理人员 其他未列明服务业 家庭综合消费
-社会生产服务和生活服务人员 其他农牧产品批发 个人经营
-其他农林牧渔生产辅助人员 茶叶种植 种茶
-农作物生产人员 粘土及其他土砂石开采 经营沙石场
-行政事务处理人员 其他居民服务业 消费
-销售人员 机动车燃油零售 购成品油
-土木工程建筑施工人员 其他土木工程建筑施工 采购五金
-销售人员 服装零售 经营服装流动资金需要
-销售人员 肉制品及副产品加工 购肉制品等
-销售人员 日用家电零售 经营家用电器店购电器
-其他社会生产和生活服务人员 住宅装饰和装修 装修房屋
-银行专业人员 其他居民服务业 个人消费
-银行专业人员 其他居民服务业 个人消费
-销售人员 蔬菜种植 种植(转贷)
-其他农业生产人员 森林经营和管护 林业经营
-其他农、林、牧、渔业生产及辅助人员 羊的饲养 经营周转
-其他农、林、牧、渔业生产及辅助人员 羊的饲养 经营周转
-销售人员 小吃服务 经营小吃店
-作物种子(苗)繁育生产人员 民宿服务 个人经营
-通用基础件装配制造人员 水泥制造 经营煤炭调运
-销售人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-农作物生产人员 葡萄种植 种植葡萄(红色老区)
-农作物生产人员 稻谷种植 经营农产品(借新还旧)
-农、林、牧、渔业生产及辅助人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-保险专业人员 住宅装饰和装修 个人消费
-银行服务人员 稻谷种植 装修
-银行服务人员 稻谷种植 装修
-办事人员和有关人员 其他未列明服务业 个人消费
-销售人员 肉、禽、蛋、奶及水产品批发 批发业
-销售人员 汽车及零配件批发 个人经营
-其他房地产服务人员 其他未列明建筑业 购挖机
-作物种子(苗)繁育生产人员 其他房地产业 购一手房
-农作物生产人员 花卉种植 种植花木
-销售人员 正餐服务 购油、食品等
-农作物生产人员 其他清洁服务 经营家政服务周转金
-国家行政机关负责人 住宅装饰和装修 消费
-销售人员 通信设备零售 经营手机店购买手机
-农作物生产人员 柑橘类种植 种果
-其他办事人员 农业 农业
-未知 种子种苗培育活动 农、林、牧、渔专业及辅助性活动
-销售人员 摩托车及零配件零售 经营电动车
-其他 坚果种植 个人经营
-科学研究人员 软件和信息技术服务业 软件和信息技术服务业
-农、林、牧、渔业生产及辅助人员 其他农业 个人经营
-道路运输服务人员 普通货物道路运输 借新还旧
-畜禽饲养人员 鸭的饲养 个人经营
-专业技术人员 其他室内装饰材料零售 调货
-健身和娱乐场所服务人员 休闲观光活动 借新还旧
-社会生产服务和生活服务人员 快餐服务 借新还旧
-销售人员 渔业产品批发 经营水产批发
-水产养殖人员 网吧活动 经营网咖
-农作物生产人员 食用菌种植 个人经营
-其他居民服务人员 其他未列明服务业 无还本续贷
-其他纺织品、服装和皮革、毛皮制品加工制作人员 卫生洁具零售 经营卫浴建材
-农、林、牧、渔业生产及辅助人员 零售业 零售业
-其他健康服务人员 村卫生室 经营周转
-办事人员和有关人员 国家机构 国家机构
-未知 汽车零配件零售 汽车配件批发经营
-销售人员 其他居民服务业 个人消费
-销售人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-行政业务办理人员 百货零售 消费
-保卫人员 其他农业 个人消费
-其他农业生产人员 小吃服务 经营小吃
-广播、电视、电影和影视录音制作人员 其他农业专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-销售人员 酒、饮料及茶叶零售 经营茶庄
-广播、电视、电影和影视录音制作人员 其他文化艺术业 经营周转
-水产捕捞及有关人员 海水捕捞 个人经营
-销售人员 酒、饮料及茶叶零售 进货
-销售人员 五金零售 经营建材经营部
-水产养殖人员 海水养殖 个人经营
-其他农业生产人员 其他中药材种植 种仙草
-销售人员 便利店零售 个人经营贷款资金周转需要
-销售人员 其他综合零售 购船舶配件及渔需用品等
-其他办事人员 普通高中教育 无还本续贷
-租赁业务人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-餐饮服务人员 小吃服务 经营小吃
-餐饮服务人员 正餐服务 小吃店
-餐饮服务人员 快餐服务 借新还旧(归还普惠卡)
-餐饮服务人员 内陆养殖 经营养殖场
-农业生产服务人员 机动车燃油零售 汽车修理
-银行专业人员 其他未列明服务业 家庭综合消费(好享贷)
-销售人员 其他综合零售 经营电商,购买日用品
-采购人员 其他土木工程建筑施工 个人经营
-销售人员 农业 农业
-农、林、牧、渔业生产及辅助人员 住宅房屋建筑 建房转贷
-企事业单位负责人 农业 农业
-农作物生产人员 柑橘类种植 个人经营
-废料和碎屑加工处理人员 金属废料和碎屑加工处理 废品回收经营
-农业生产人员 薯类种植 种植槟榔芋
-销售人员 通信设备零售 购水泥钢筋等
-销售人员 五金产品批发 危房翻建
-采购人员 钟表、眼镜零售 个人经营
-农作物生产人员 农产品初加工活动 食用菌初加工
-不便分类的其他从业人员 酒、饮料及茶叶批发 批发业
-销售人员 五金零售 经营电子设备
-销售人员 建材批发 个人经营
-销售人员 五金产品批发 五金产品的批发、零售
-社会生产服务和生活服务人员 首饰、工艺品及收藏品批发 无还本续贷
-销售人员 百货零售 百货零售超市经营周转
-农业生产服务人员 森林经营和管护 林业
-其他农业生产人员 普通货物道路运输 借新还旧
-农业生产人员 鬃毛加工、制刷及清扫工具制造 其他制造业
-其他农、林、牧、渔业生产及辅助人员 棉花种植 无还本续贷
-销售人员 鸡的饲养 个人经营
-销售人员 影视节目制作 视频剪辑
-批发与零售服务人员 果品、蔬菜零售 零售业
-农作物生产人员 香蕉等亚热带水果种植 种植百香果
-专业技术人员 教育 教育
-农、林、牧、渔业生产及辅助人员 住宅装饰和装修 装修
-农、林、牧、渔业生产及辅助人员 其他土木工程建筑施工 土木工程建筑业
-销售人员 再生物资回收与批发 个人经营
-酒、饮料及精制茶制造人员 精制茶加工 茶叶加工
-销售人员 其他土木工程建筑施工 经营电梯安装
-农作物生产人员 柑橘类种植 种果
-销售人员 服装零售 个人经营
-餐饮服务人员 快餐服务 经营连锁餐饮
-销售人员 小吃服务 个人经营
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 居民服务业 居民服务业
-建筑装饰人员 住宅装饰和装修 购房(二手房)
-建筑装饰人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-行政业务办理人员 零售业 购家具等
-其他信息传输、软件和信息技术服务人员 其他互联网服务 进货
-销售人员 通信设备零售 个人经营
-销售人员 营养和保健品批发 个人经营
-其他社会生产和生活服务人员 零售业 零售业
-粮油加工人员 其他综合零售 个人经营
-农业生产服务人员 种子批发 经营农产品
-社会生产服务和生活服务人员 五金零售
-营造林人员 海水养殖 个人消费
-农作物生产人员 小麦种植 经营种植
-社会生产服务和生活服务人员 服装零售 服装店
-销售人员 便利店零售 经营茶叶
-畜禽饲养人员 茶叶种植 个人经营
-销售人员 其他食品批发 经营周转
-群众文化活动服务人员 其他综合零售 综合消费
-销售人员 五金零售 经营五金店资金需要
-水产养殖人员 海水捕捞 养殖鲍鱼
-信息通信网络运行管理人员 通信设备零售 经营电子产品
-销售人员 建材批发 经营建材
-办事人员和有关人员 其他未列明服务业 个人消费
-农作物生产人员 食用菌种植 种菇
-销售人员 烟草制品零售 经营便利店
-鞋帽制作人员 其他制鞋业 个人消费
-其他农、林、牧、渔业生产及辅助人员 其他一般旅馆 经营毛竹林管理
-销售人员 首饰、工艺品及收藏品批发 购工艺品
-销售人员 首饰、工艺品及收藏品批发 购工艺品
-水产养殖人员 五金零售 五金店经营
-水产捕捞及有关人员 海水捕捞
-其他文化、体育和娱乐服务人员 其他室内娱乐活动 经营周转
-餐饮服务人员 小吃服务 经营小吃
-其他专业技术人员 零售业 零售业
-销售人员 棉花种植 经营家政
-销售人员 其他日用品零售 购水果
-农作物生产人员 稻谷种植 农业
-水产养殖人员 海水养殖 鲍鱼养殖
-餐饮服务人员 正餐服务 开店周转金
-其他批发与零售服务人员 茶叶种植 借新还旧
-其他纸及纸制品生产加工人员 加工纸制造 购买家具
-其他农、林、牧、渔业生产及辅助人员 正餐服务 经营餐饮
-软件和信息技术服务人员 住宅装饰和装修 房屋装修
-销售人员 木质装饰材料零售 零售业
-农作物生产人员 住宅房屋建筑 购房
-采购人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-建筑工程技术人员 房屋建筑业 房屋建筑业
-批发与零售服务人员 其他日用杂品制造 其他制造业
-销售人员 计算机、软件及辅助设备批发 经营周转
-不便分类的其他从业人员 农产品初加工活动 农、林、牧、渔专业及辅助性活动
-其他办事人员 道路运输业 道路运输业
-作物种子(苗)繁育生产人员 日用家电批发 个人经营
-农、林、牧、渔业生产及辅助人员 其他农业 种养
-会计专业人员 家庭服务 购二手房
-电力、燃气及水供应服务人员 电力供应 电力、热力生产和供应业
-其他社会生产和生活服务人员 其他农业 个人消费
-农作物生产人员 稻谷种植 农业
-房屋建筑施工人员 住宅房屋建筑 购钢筋
-销售人员 百货零售 经营食杂店经营货款需要
-畜禽饲养人员 鸡的饲养 经营家禽养殖
-农作物生产人员 蔬菜种植 蔬菜种植
-销售人员 其他综合零售 进衣服
-其他农业生产人员 柑橘类种植 种植脐橙
-水产养殖人员 海水养殖 网箱养殖购饲料
-销售人员 五金产品批发 经营卫浴
-农、林、牧、渔业生产及辅助人员 酒、饮料及茶叶零售 个人经营
-销售人员 谷物、豆及薯类批发 经营农产品
-销售人员 服装零售 服装经营周转
-销售人员 鞋帽零售 个人经营
-其他农、林、牧、渔业生产及辅助人员 食用菌种植 个人经营
-作物种子(苗)繁育生产人员 中药零售 中药零售。
-销售人员 其他未列明制造业 无还本续贷
-销售人员 陶瓷、石材装饰材料零售 贩运瓷器
-水产捕捞及有关人员 海水捕捞 个人经营
-中小学教育教师 中等职业学校教育 个人消费
-销售人员 五金零售 个人经营
-采购人员 建材批发 瓷砖经营
-行政业务办理人员 其他农业 个人消费
-中小学教育教师 普通小学教育 个人消费
-销售人员 机动车燃油零售 购成品油
-其他批发与零售服务人员 快餐服务 经营快餐店、购买食材
-行政业务办理人员 其他综合零售 个人消费
-水产养殖人员 海水养殖 海产养殖
-采购人员 蔬菜种植 个人经营
-农作物生产人员 柑橘类种植 经营果园
-农作物生产人员 其他农业 个人经营
-其他农业生产人员 五金零售 经营五金店
-水产养殖人员 海水养殖 养殖
-社会生产服务和生活服务人员 纺织品及针织品零售 经营周转
-水产养殖人员 内陆养殖 个人养殖
-销售人员 百货零售 经营食杂店
-农、林、牧、渔业生产及辅助人员 坚果种植 个人经营
-水产养殖人员 海水养殖 无还本息续贷
-销售人员 住宅房屋建筑 购五金电缆等
-社会生产服务和生活服务人员 其他建筑安装 建筑安装业
-销售人员 渔业产品批发 批发业
-销售人员 渔业产品批发 个人经营
-销售人员 通信设备零售 购电子产品等
-销售人员 石油及制品批发 经营加油站购买成品油
-水产养殖人员 内陆养殖 无还本续贷(个人经营)
-作物种子(苗)繁育生产人员 建筑装饰和装修业 个人消费
-道路运输服务人员 普通货物道路运输 经营物流公司
-社会生产服务和生活服务人员 其他未列明批发业 归还陈钦山贷款
-办事人员和有关人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-农、林、牧、渔业生产及辅助人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-其他批发与零售服务人员 汽车新车零售 经营车行
-行政业务办理人员 其他未列明服务业 家庭综合消费
-销售人员 文具用品零售 购文具
-销售人员 便利店零售 食品店
-教学人员 农业 农业
-道路运输服务人员 其他综合零售 个人消费
-销售人员 烟草制品零售 经营卷烟销售
-不便分类的其他从业人员 其他未列明信息技术服务业 无还本续贷
-采矿、建筑专用设备制造人员 其他农业 个人消费
-销售人员 木质家具制造 经营工艺品生意
-销售人员 酒、饮料及茶叶零售 无还本续贷
-销售人员 服装零售 个人经营
-销售人员 文具用品零售 经营百货店购买玩具
-销售人员 果品、蔬菜零售 经营水果
-农、林、牧、渔业生产及辅助人员 海水养殖 个人经营
-其他文化、体育和娱乐服务人员 其他互联网服务 个人经营
-农、林、牧、渔业生产及辅助人员 海水养殖 养殖鲍鱼
-销售人员 通信设备零售 购销手机
-餐饮服务人员 正餐服务 购预包装食品等经营产品
-其他居民服务人员 其他未列明服务业 个人经营
-销售人员 电气安装 无还本续贷
-其他农业生产人员 其他农业 经营鞋厂
-水产养殖人员 海水养殖 鲍鱼养殖
-农、林、牧、渔业生产及辅助人员 海水捕捞 渔业
-销售人员 陶瓷、石材装饰材料零售 经营装饰材料
-建筑安装施工人员 公共建筑装饰和装修 个人消费
-土木工程建筑施工人员 建材批发 经营周转购买建材等
-畜禽饲养人员 鹅的饲养 养殖鹅周转金
-电力供应服务人员 其他未列明国家机构 个人消费
-销售人员 汽车零配件零售 购汽车配件
-农作物生产人员 稻谷种植 无还本续贷
-道路运输服务人员 其他农业 个人消费
-中小学教育教师 住宅装饰和装修 房屋装修
-土木工程建筑施工人员 工矿工程建筑 承包水电站工程
-健身和娱乐场所服务人员 商业综合体管理服务 个人生产经营
-行政事务处理人员 其他未列明服务业 家庭综合消费
-农作物生产人员 茶叶种植 个人经营
-其他居民服务人员 酒、饮料及茶叶零售 零售业
-其他农林牧渔生产辅助人员 海水养殖 鲍鱼养殖
-其他农林牧渔生产辅助人员 海水养殖 鲍鱼养殖
-其他农林牧渔生产辅助人员 海水养殖 鲍鱼养殖
-技术辅助服务人员 零售业 零售业
-销售人员 文具用品零售 房屋装修
-作物种子(苗)繁育生产人员 其他未列明服务业 个人消费
-行政业务办理人员 临床检验服务 房屋装修及购买家具家电
-销售人员 果品、蔬菜批发 经营水果店购买水果
-制糖人员 其他综合零售 购货物
-采购人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 建材批发 批发业
-销售人员 建筑幕墙装饰和装修 建材零售
-餐饮服务人员 小吃服务 个人经营
-行政业务办理人员 其他农业 个人消费
-行政业务办理人员 住宅装饰和装修 购买家具
-其他农业生产人员 其他房地产业 购房
-作物种子(苗)繁育生产人员 其他土木工程建筑施工 工程
-农作物生产人员 豆类种植 归还普惠卡
-其他建筑施工人员 住宅装饰和装修 个人经营
-销售人员 汽车修理与维护 机动车维修店
-销售人员 纺织品及针织品零售 个人经营
-销售人员 批发业 批发业
-农、林、牧、渔业生产及辅助人员 其他农业 个人消费
-销售人员 便利店零售 便利店经营周转
-道路运输服务人员 其他农业 个人消费
-水产品加工人员 其他未列明制造业 其他制造业
-木材加工人员 其他居民服务业 个人消费
-农、林、牧、渔业生产及辅助人员 稻谷种植 个人经营
-其他批发与零售服务人员 五金零售 购买五金材料
-其他社会生产和生活服务人员 建筑工程机械与设备经营租赁 经营周转
-其他农业生产人员 五金零售 五金经营部经营周转
-水产养殖人员 海水养殖 个人经营
-农作物生产人员 稻谷种植 经营木工行业
-服装裁剪和洗染织补人员 旅行社及相关服务 商务服务业
-木材加工人员 胶合板制造 经营木材
-社会生产服务和生活服务人员 服装零售 经营服装店
-销售人员 五金产品批发 经营周转
-销售人员 纺织品、针织品及原料批发 经营周转
-行政业务办理人员 超级市场零售 个人消费
-粮油加工人员 其他农业 个人消费
-水产捕捞及有关人员 海水捕捞 水产捕捞
-水产捕捞及有关人员 海水养殖 个人经营
-行政业务办理人员 其他中药材种植 个人经营
-软件和信息技术服务人员 其他农业 个人消费
-其他批发与零售服务人员 建材批发 用于归还信用卡
-农、林、牧、渔业生产及辅助人员 茶叶种植 农、林、牧、渔专业及辅助性活动
-农作物生产人员 酒、饮料及茶叶零售 零售业
-销售人员 服装批发 个人经营
-中国共产党机关负责人 其他居民服务业 个人消费
-行政事务处理人员 其他综合零售 购服装
-销售人员 酒、饮料及茶叶零售 经营茶叶店
-其他农业生产人员 其他道路货物运输 经营汽车
-销售人员 文具用品批发 购文具及苗木等
-销售人员 日用家电零售 家电进货
-自由职业者 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-行政业务办理人员 花卉种植 购装修材料等
-水产养殖人员 内陆养殖 养殖
-销售人员 电气设备批发 购买控制板等经营所需的货品
-销售人员 肉、禽、蛋、奶及水产品零售 经营猪肉摊
-生产制造及有关人员 装卸搬运 经营周转
-农作物生产人员 其他房地产业 购房
-物业管理服务人员 住宅房屋建筑 个人消费
-办事人员和有关人员 住宅装饰和装修 房屋装修
-五金制品制作装配人员 金属门窗制造 个人经营
-农、林、牧、渔业生产及辅助人员 其他水果种植 种植黄金百香果
-销售人员 果品、蔬菜批发 个人经营
-水产养殖人员 海水养殖 养鱼
-农、林、牧、渔业生产及辅助人员 海水捕捞 渔业
-农作物生产人员 稻谷种植 购二手房
-销售人员 石油及制品批发 经营加油站购买成品油
-其他批发与零售服务人员 其他未列明制造业 购建材等
-其他办事人员 国家机构 国家机构
-林木种苗繁育人员 果品、蔬菜零售 经营水果店
-皮革、毛皮及其制品制造人员 塑料零件及其他塑料制品制造 购包装材料等
-餐饮服务人员 小吃服务 无还本续贷
-水产养殖人员 海水养殖 黄鱼养殖
-木材采运人员 木材采运 个人经营资金
-其他办事人员 人民法院 个人消费
-农作物生产人员 其他农业 个人经营
-农、林、牧、渔业生产及辅助人员 服饰制造 纺织服装、服饰业
-销售人员 五金零售 零售业
-文教用品制作人员 其他未列明服务业 个人经营
-文教用品制作人员 其他文教办公用品制造 房屋建设等
-不便分类的其他从业人员 建材批发 个人经营
-销售人员 卫生洁具零售 经营建材
-其他农、林、牧、渔业生产及辅助人员 内陆养殖 养虾
-销售人员 其他农牧产品批发 生产经营周转
-环境卫生服务人员 卫生 卫生
-采购人员 机动车燃油零售 经营周转
-其他批发与零售服务人员 服装批发 经营服装店,购买服装
-建筑安装施工人员 住宅房屋建筑 经营装修
-餐饮服务人员 外卖送餐服务 经营外卖
-其他金融服务人员 其他农业 个人消费
-农副林特产品初加工人员 酒、饮料及茶叶零售 采购食品、酒等
-采购人员 其他综合零售 经营石材
-农、林、牧、渔业生产及辅助人员 海水捕捞 渔业
-社会生产服务和生活服务人员 其他文化用品零售 续贷
-销售人员 卫生洁具零售 卫浴店经营周转
-餐饮服务人员 餐饮业 餐饮业
-农业生产人员 柑橘类种植 种植及家庭综合支出
-农作物生产人员 茶叶种植 个人经营
-生产制造及有关人员 五金产品批发 个人经营
-作物种子(苗)繁育生产人员 茶叶种植 个人经营
-餐饮服务人员 其他综合零售 个人经营
-销售人员 家具零售 购买木材
-其他生产制造及有关人员 陶瓷、石材装饰材料零售 个人经营
-销售人员 百货零售 个人经营
-生活照料服务人员 零售业 零售业
-农作物生产人员 牛的饲养 养牛生产
-邮政和快递服务人员 快递服务 归还贷款
-其他农业生产人员 其他水果种植 种植百香果
-农业生产服务人员 仁果类和核果类水果种植 种养殖
-水产养殖人员 海水养殖 鲍鱼养殖
-销售人员 肉、禽、蛋、奶及水产品零售 经营海鲜摊
-其他农业生产人员 其他农业 借新还旧
-水产养殖人员 海水养殖 养殖鲍鱼
-其他农、林、牧、渔业生产及辅助人员 其他农业 个人消费
-其他批发与零售服务人员 建筑用石加工 归还洪江淮贷款
-企事业单位负责人 精制茶加工 茶叶加工
-企事业单位负责人 农产品初加工活动 茶叶加工
-销售人员 其他综合零售 零售业
-销售人员 汽车新车零售 个人经营
-农作物生产人员 花卉种植 个人经营
-其他批发与零售服务人员 食用菌种植 食用菌种植
-社会生产服务和生活服务人员 建筑幕墙装饰和装修 扩大经营
-销售人员 市场管理服务 购白酒、农贸市场日常维护、支付工资等
-销售人员 化妆品及卫生用品零售 进行农村裸房整治
-社会生产服务和生活服务人员 其他未列明批发业 采购原材料
-其他批发与零售服务人员 厨具卫具及日用杂品批发 无还本续贷及购电器。
-其他批发与零售服务人员 厨具卫具及日用杂品批发 经营电器
-中小学教育教师 家具零售 购家具
-行政业务办理人员 家具零售 个人消费
-销售人员 鞋帽零售 鞋帽零售
-农、林、牧、渔业生产及辅助人员 其他农牧产品批发 购农产品
-农作物生产人员 家具零售 家具零售
-其他农业生产人员 柑橘类种植 农场经营周转
-软件和信息技术服务人员 其他农业 个人消费
-销售人员 鞋帽零售 经营周转
-医疗卫生技术人员 农业专业及辅助性活动 个人消费
-农作物生产人员 烟草种植 种烟
-陶瓷制品制造人员 建材批发 周转性贷款
-其他社会生产和生活服务人员 其他未列明信息技术服务业 个人经营
-其他批发与零售服务人员 互联网零售 经营电商购买日用品
-农、林、牧、渔业生产及辅助人员 其他日用杂品制造 其他制造业
-销售人员 建材批发 经营建材
-采购人员 其他农业 个人消费
-营造林人员 纺织品及针织品零售 电商资金周转
-其他文化、体育和娱乐服务人员 其他居民服务业 购设计设备等
-农作物生产人员 建材批发 经营建材
-其他交通运输、仓储和邮政业服务人员 货物运输代理 个人消费
-皮革、毛皮及其制品制造人员 毛皮服装加工 经营周转
-农作物生产人员 柑橘类种植 无还本续贷(种植水果)
-其他金属制品制造人员 其他室内装饰材料零售 无还本续贷
-农、林、牧、渔业生产及辅助人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-其他农业生产人员 其他农业 生产经营
-事业单位负责人 住宅装饰和装修 综合消费
-其他农业生产人员 鸡的饲养 养鸡
-其他社会生产和生活服务人员 歌舞厅娱乐活动 经营室内娱乐
-生活照料服务人员 其他未列明建筑业 个人经营
-其他批发与零售服务人员 摩托车及零配件批发 购买摩托车配件
-水产养殖人员 海水养殖 养殖海带
-广播、电视、电影和影视录音制作人员 其他广告服务 广告制作
-哲学研究人员 其他农业 个人消费
-中小学教育教师 零售业 零售业
-森林经营和管护人员 森林经营和管护 个人经营
-期货服务人员 商务服务业 商务服务业
-土木工程建筑施工人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-销售人员 其他化工产品批发 购水泥
-餐饮服务人员 快餐服务 小炒店经营
-农、林、牧、渔业生产及辅助人员 建材批发 经营橱柜加工销售
-社会生产服务和生活服务人员 日用家电零售 个人经营性贷款,用于经营周转
-农、林、牧、渔业生产及辅助人员 城乡市容管理 个人消费
-水产捕捞及有关人员 海水捕捞 购渔船设备
-水产捕捞及有关人员 海水捕捞 购渔船设备
-农作物生产人员 其他农业 经营周转
-农、林、牧、渔业生产及辅助人员 其他房屋建筑业 农、林、牧、渔专业及辅助性活动
-批发与零售服务人员 海水养殖 养殖
-农作物生产人员 中草药种植 种植太子参、茶叶
-社会生产服务和生活服务人员 五金零售 购建材等
-销售人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 便利店零售 副食品店
-销售人员 百货零售 经营周转
-农作物生产人员 海水捕捞 捕捞生产
-农作物生产人员 蔬菜种植 个人经营
-农作物生产人员 渔业产品批发 个人生产经营
-畜禽种苗繁育人员 鸭的饲养 畜牧业
-事业单位负责人 住宅装饰和装修 综合消费
-销售人员 酒、饮料及茶叶零售 茶叶经营
-道路运输服务人员 其他公路客运 经营客运
-采购人员 建材批发 经营周转
-水产捕捞及有关人员 海水捕捞 个人经营
-农业生产服务人员 猪的饲养 个人经营
-销售人员 百货零售 食品店
-农、林、牧、渔业生产及辅助人员 道路运输业 道路运输业
-砖瓦石材等建筑材料制造人员 粘土砖瓦及建筑砌块制造 购煤土
-社会生产服务和生活服务人员 服装零售 经营服装店
-销售人员 稻谷种植 进货
-农、林、牧、渔业生产及辅助人员 小麦种植 经营种植
-销售人员 其他综合零售 个人经营
-农业生产服务人员 其他农牧产品批发 经营农副产品
-农作物生产人员 稻谷种植 续贷
-其他批发与零售服务人员 其他室内装饰材料零售 住房装修
-采购人员 医疗用品及器材零售 电商经营
-其他批发与零售服务人员 便利店零售 经营医疗投资日常资金需要
-其他农业生产人员 其他建筑安装 厨柜安装经营
-农、林、牧、渔业生产及辅助人员 其他食品批发 无还本续贷
-销售人员 其他未列明服务业 家庭综合消费
-其他新闻出版、文化专业人员 其他娱乐业 综合消费
-专业化设计服务人员 住宅装饰和装修 购买建材
-其他文化、体育和娱乐服务人员 教育辅助服务 用于偿还黄阳生贷款
-销售人员 服装零售 周转性贷款
-社会生产服务和生活服务人员 酒、饮料及茶叶零售 零售业
-销售人员 其他日用品零售 无还本续贷
-水产养殖人员 海水养殖 养鲍鱼
-餐饮服务人员 互联网零售 个人经营
-木材加工人员 单板加工 购木材
-其他批发与零售服务人员 灯具零售 经营家具城
-销售人员 果品、蔬菜零售 续贷
-销售人员 肉、禽、蛋、奶及水产品零售 风险化解续贷
-水产养殖人员 海水养殖 养殖鲍鱼
-美容美发和浴池服务人员 理发及美容服务 无还本续贷
-水产养殖人员 海水养殖 个人经营
-水产捕捞及有关人员 海水捕捞 个人经营
-农作物生产人员 香蕉等亚热带水果种植 购买化肥等
-行政事务处理人员 其他居民服务业 个人消费
-农作物生产人员 茶叶种植 个人经营
-农副产品加工人员 猪的饲养 借新还旧
-水产养殖人员 海水养殖 养殖鲍鱼
-其他农、林、牧、渔业生产及辅助人员 酒、饮料及茶叶零售 借新还旧
-销售人员 其他日用品零售 个人经营
-行政业务办理人员 其他农业 个人消费
-针织人员 其他针织或钩针编织服装制造 购涤纶丝
-道路运输服务人员 其他农业 个人消费
-中小学教育教师 普通初中教育 个人消费
-农、林、牧、渔业生产及辅助人员 居民服务业 居民服务业
-农作物生产人员 食用菌种植 种植香菇
-农、林、牧、渔业生产及辅助人员 其他食品批发 无还本续贷
-农、林、牧、渔业生产及辅助人员 零售业 零售业
-不便分类的其他从业人员 其他综合零售 个人消费
-生产制造及有关人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-畜禽饲养人员 鸡的饲养 经营种养殖周转
-其他房地产服务人员 其他住宿业 购出租房家居材料
-农作物生产人员 果品、蔬菜零售 个人经营
-农作物生产人员 小麦种植 种植小麦
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 零售业 零售业
-房屋建筑施工人员 住宅房屋建筑 个人经营
-房地产中介服务人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-环境治理服务人员 其他农业 个人消费
-水产养殖人员 海水养殖 养殖鲍鱼
-水产养殖人员 海水养殖 养殖鲍鱼
-水产养殖人员 海水养殖 养鱼
-销售人员 其他房地产业 购房
-农作物生产人员 其他中药材种植 个人经营
-销售人员 酒、饮料及茶叶批发 烟酒进货
-销售人员 住宅装饰和装修 个人消费
-销售人员 橡胶零件制造 无还本续贷
-行政业务办理人员 其他服务业 其他服务业
-销售人员 建材批发 购建筑材料
-群众文化活动服务人员 其他房地产业 购二手房
-广播电视传输服务人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-农、林、牧、渔业生产及辅助人员 林木育种 种绿化苗
-销售人员 肉、禽、蛋、奶及水产品零售 归还薛明好名下普惠金融卡
-森林经营和管护人员 森林经营和管护 林业
-销售人员 零售业 零售业
-其他批发与零售服务人员 非金属矿及制品批发 经营石材
-事业单位负责人 住宅装饰和装修 个人消费
-销售人员 建材批发 购买建筑材料
-销售人员 建材批发 购买建筑材料
-销售人员 建材批发 购买建筑材料
-塑料制品加工人员 住宅装饰和装修 住房装修
-农、林、牧、渔业生产及辅助人员 林业 林业
-销售人员 五金零售 经营五金店
-自由职业者 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-五金制品制作装配人员 其他金属制日用品制造 无还本续贷
-餐饮服务人员 小吃服务 个人经营
-水产养殖人员 海水养殖 养殖鲍鱼
-农、林、牧、渔业生产及辅助人员 零售业 零售业
-建筑装饰人员 住宅装饰和装修 个人经营
-农作物生产人员 茶叶种植 无还本续贷
-农作物生产人员 茶叶种植 茶叶种植
-销售人员 其他水果种植 果树
-其他批发与零售服务人员 便利店零售 无还本续贷(个人经营-便利店)
-社会生产服务和生活服务人员 陶瓷、石材装饰材料零售 个人经营
-农、林、牧、渔业生产及辅助人员 海水养殖 借新还旧(个人经营)
-木材加工人员 其他家具制造 购石材等
-餐饮服务人员 快餐服务 经营快餐
-其他房地产服务人员 陶瓷、石材装饰材料零售 进货
-农作物生产人员 茶叶种植 个人经营
-销售人员 珠宝首饰零售 经营玉器@JY4LD9QT0
-销售人员 工艺美术品及收藏品零售 经营周转金
-销售人员 陶瓷、石材装饰材料零售 购买建材等
-水产养殖人员 海水养殖 养殖鲍鱼
-采购人员 家具零售 经营建材
-办事人员和有关人员 正餐服务 餐饮业
-水产养殖人员 海水养殖 养殖八爪鱼
-银行专业人员 其他农业 个人消费
-作物种子(苗)繁育生产人员 其他居民服务业 个人消费
-销售人员 陶瓷、石材装饰材料零售 零售业
-农、林、牧、渔业生产及辅助人员 小吃服务 个人经营
-农、林、牧、渔业生产及辅助人员 农产品初加工活动 农、林、牧、渔专业及辅助性活动
-销售人员 家具零售 个人经营
-销售人员 建材批发 采购装饰材料
-幼儿教育教师 住宅装饰和装修 个人消费
-机械工程技术人员 其他农业 个人消费
-水产养殖人员 海水养殖 养鱼
-销售人员 百货零售 零售业
-农作物生产人员 稻谷种植 经营农产品(借新还旧)
-不便分类的其他从业人员 其他农业专业及辅助性活动 个人经营
-农业生产人员 其他制鞋业 个人经营周转
-水产捕捞及有关人员 海水捕捞 海洋捕捞(再贷款专项额度)
-其他专业技术人员 居民服务业 居民服务业
-行政业务办理人员 居民服务业 居民服务业
-农、林、牧、渔业生产及辅助人员 金属结构制造 金属制品业
-农、林、牧、渔业生产及辅助人员 雕塑工艺品制造 个人经营
-军人 零售业 零售业
-公共卫生辅助服务人员 其他居民服务业 家庭综合消费
-销售人员 陶瓷、石材装饰材料零售 经营石材
-道路运输服务人员 大型货物道路运输 无还本续贷经营货运
-销售人员 五金零售 购水暖配件等
-租赁业务人员 汽车租赁 经营二手车
-餐饮服务人员 其他房屋建筑业 购桃李春风住宅
-销售人员 服装零售 购买服装
-行政业务办理人员 其他居民服务业 个人消费
-其他办事人员和有关人员 国家机构 国家机构
-水上运输服务人员 海水养殖 养殖鲍鱼
-其他农、林、牧、渔业生产及辅助人员 其他居民服务业 个人消费
-道路运输服务人员 普通货物道路运输 货运经营
-销售人员 果品、蔬菜零售 水果购销(借新还旧)
-其他纺织品、服装和皮革、毛皮制品加工制作人员 其他家用纺织制成品制造 用于归还黄艺玲的贷款
-农、林、牧、渔业生产及辅助人员 麻类种植 借新还旧
-社会生产服务和生活服务人员 木质家具制造 无还本续贷(经营家具)
-专业技术人员 住宅装饰和装修 无还本续贷
-农业生产服务人员 五金产品批发 个人经营
-办事人员和有关人员 其他未列明国家机构 个人消费
-销售人员 其他非金属矿物制品制造 销售煤矸石等
-销售人员 其他非金属矿物制品制造 销售煤矸石等
-保险专业人员 其他未列明商务服务业 无还本续贷
-住宿服务人员 其他住宿业 无还本续贷
-水产养殖人员 海水养殖 养殖对虾
-作物种子(苗)繁育生产人员 建材批发 个人经营
-销售人员 住宅装饰和装修 归还本人普惠卡
-汽车摩托车修理技术服务人员 其他农业 个人经营
-销售人员 肉、禽、蛋、奶及水产品零售 经营周转
-销售人员 陶瓷、石材装饰材料零售 购建材
-其他农、林、牧、渔业生产及辅助人员 农业机械活动 购买农机
-其他农业生产人员 柑橘类种植 农业
-生活照料服务人员 住宅装饰和装修 装修房屋
-纺织品和服装剪裁缝纫人员 服饰制造 重组贷款
-砖瓦石材等建筑材料制造人员 其他非金属矿物制品制造 个人消费
-销售人员 正餐服务 个人经营
-其他批发与零售服务人员 肉、禽、蛋、奶及水产品批发 个人经营
-销售人员 珠宝首饰零售 经营珠宝店
-销售人员 珠宝首饰零售 经营珠宝店
-其他办事人员 住宅装饰和装修 续贷盘转(原普惠卡)
-销售人员 计算机、软件及辅助设备零售 购电子产品
-行政业务办理人员 其他居民服务业 购房
-农、林、牧、渔业生产及辅助人员 猪的饲养 养猪(转贷)
-餐饮服务人员 小吃服务 经营餐饮
-其他批发与零售服务人员 服装零售 经营服装
-农作物生产人员 稻谷种植 无还本续贷
-建筑工程技术人员 市政道路工程建筑 购房
-群众文化活动服务人员 其他农业 个人消费
-餐饮服务人员 其他饮料及冷饮服务 盘活不良
-其他农林牧渔生产辅助人员 酒、饮料及茶叶零售 借新还旧
-农业生产服务人员 其他综合零售 零售业
-销售人员 百货零售 购买原材料
-作物种子(苗)繁育生产人员 其他农业专业及辅助性活动 收购槟榔芋
-其他食品、饮料产品加工人员 鱼糜制品及水产品干腌制加工
-销售人员 便利店零售 无还本续贷
-餐饮服务人员 柑橘类种植 果树种植
-其他社会生产和生活服务人员 服装零售 经营服装店
-水产养殖人员 海水养殖 个人经营
-农作物生产人员 居民服务业 居民服务业
-农作物生产人员 其他中药材种植 个人经营
-其他修理及制作服务人员 住宅房屋建筑 借新还旧
-销售人员 五金零售 零售业
-农作物生产人员 小麦种植 种植小麦
-
-调味品及食品添加剂制作人员 其他调味品、发酵制品制造 红曲加工
-物业管理服务人员 居民服务业 居民服务业
-其他批发与零售服务人员 肉、禽、蛋、奶及水产品零售 个人经营
-销售人员 建材批发 经营建材店
-中小学教育教师 住宅装饰和装修 个人消费
-销售人员 建材批发 经营周转
-农作物生产人员 茶叶种植 个人经营
-电力、热力生产和供应人员 水力发电 归还贷记卡欠款
-美容美发和浴池服务人员 理发及美容服务 理发店经营
-销售人员 粮油零售 经营便利店,购买食品
-销售人员 机动车燃油零售 购买成品油
-水产养殖人员 海水养殖 个人经营
-销售人员 日用陶瓷制品制造 购陶瓷等
-销售人员 建材批发 购石材、烟酒等
-经济和金融专业人员 零售业 零售业
-销售人员 酒、饮料及茶叶零售 个人经营续贷
-餐饮服务人员 快餐服务 个人经营
-其他批发与零售服务人员 日用家电零售 个人经营
-销售人员 服装零售 购服装
-水产养殖人员 海水养殖 养殖鲍鱼
-社会生产服务和生活服务人员 住宅房屋建筑 垫付工程款
-社会生产服务和生活服务人员 住宅房屋建筑 垫付工程款
-销售人员 纺织品、针织品及原料批发 经营周转备用金
-销售人员 机动车燃油零售 经营挖掘机销售
-销售人员 其他房地产业 购二手房
-办事人员 服装零售 个人经营
-安全和消防人员 零售业 零售业
-其他社会生产和生活服务人员 其他未列明制造业 借新还旧
-农作物生产人员 稻谷种植 个人消费
-金属加工机械制造人员 环境保护专用设备制造 环卫设备生产与销售
-其他农、林、牧、渔业生产及辅助人员 其他综合零售 购房
-行政业务办理人员 日用家电零售 个人消费
-建筑工程技术人员 住宅装饰和装修 借新还旧贷款
-农作物生产人员 服装零售 经营服装辅料经营部
-道路运输服务人员 普通货物道路运输 无还本续贷
-销售人员 服装零售 经营周转
-水产养殖人员 海水养殖 鱼排养殖
-行政事务处理人员 其他家禽饲养 养殖(续贷)
-行政事务处理人员 其他家禽饲养 养殖(续贷)
-其他批发与零售服务人员 服装零售 经营服装
-行政事务处理人员 其他娱乐业 综合消费
-农业生产服务人员 柑橘类种植 种果
-农作物生产人员 其他房屋建筑业 借新还旧
-其他专业技术人员 其他农业 个人消费
-不便分类的其他从业人员 其他日用品零售 周转性贷款
-销售人员 烟草制品零售 个人经营
-农、林、牧、渔业生产及辅助人员 居民服务业 居民服务业
-不便分类的其他从业人员 餐饮业 餐饮业
-农、林、牧、渔业生产及辅助人员 海水捕捞 借新还旧
-其他批发与零售服务人员 其他居民服务业 经营蔬菜摊
-其他批发与零售服务人员 其他居民服务业 经营蔬菜摊
-美容美发和浴池服务人员 理发及美容服务 购化妆品
-美容美发和浴池服务人员 理发及美容服务 购化妆品
-农作物生产人员 蔬菜种植 个人经营
-销售人员 其他综合零售 手机店经营
-农作物生产人员 住宅装饰和装修 个人经营
-房屋建筑施工人员 其他土木工程建筑施工 足浴店周转
-汽车摩托车修理技术服务人员 汽车新车零售 公司经营流动资金
-其他办事人员 柑橘类种植 种果费用(购入化肥等物资)
-水产捕捞及有关人员 内陆捕捞 经营渔船(无还本续贷)
-销售人员 其他制鞋业 借新还旧
-行政事务处理人员 住宅装饰和装修 个人消费
-水产养殖人员 海水养殖 个人经营
-餐饮服务人员 正餐服务 归还到期贷款
-农作物生产人员 食用菌种植 种植木耳
-其他农、林、牧、渔业生产及辅助人员 海水养殖 个人经营
-销售人员 其他日用品零售 经营日杂店
-销售人员 服装零售 经营周转
-陶瓷制品制造人员 陈设艺术陶瓷制造 进货
-作物种子(苗)繁育生产人员 其他农业专业及辅助性活动 养殖
-邮政和快递服务人员 住宅房屋建筑 购一手房
-纺织品和服装剪裁缝纫人员 服饰制造 借新还旧
-软件和信息技术服务人员 应用软件开发 经营周转
-农、林、牧、渔业生产及辅助人员 羊的饲养 经营周转(养殖)
-汽车摩托车修理技术服务人员 摩托车修理与维护 经营汽车配件,购买配件
-其他农、林、牧、渔业生产及辅助人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 日用家电零售 生产经营周转
-销售人员 海水养殖 周转性贷款
-农作物生产人员 柑橘类种植 种植柑橘
-水产养殖人员 内陆养殖 养殖白对虾
-销售人员 肉、禽、蛋、奶及水产品零售
-销售人员 酒、饮料及茶叶零售 购烟酒
-办事人员和有关人员 学前教育 综合消费
-塑料制品加工人员 塑料零件及其他塑料制品制造 购塑料制品等
-农作物生产人员 其他农业 农场经营
-农作物生产人员 其他农业专业及辅助性活动 蔬菜收购
-水产养殖人员 海水捕捞 养殖鲍鱼
-其他农副产品加工人员 普通货物道路运输 个人经营
-农、林、牧、渔业生产及辅助人员 其他家禽饲养 畜牧业
-社会生产服务和生活服务人员 建材批发 建材店经营周转
-销售人员 便利店零售 生产经营周转
-生产制造及有关人员 住宅房屋建筑 建筑装饰、装修和其他建筑业
-销售人员 建材批发 个人经营
-住宿服务人员 快餐服务 购食材
-农作物生产人员 土木工程建筑业 土木工程建筑业
-农、林、牧、渔业生产及辅助人员 其他农业 借新还旧(归还普惠卡欠款)
-销售人员 肉、禽、蛋、奶及水产品零售 周转性贷款
-销售人员 酒、饮料及茶叶零售 经营茶叶店(无还本续贷)
-销售人员 建材批发 购建材等
-房屋建筑施工人员 含油果种植 个人经营
-行政业务办理人员 其他居民服务业 家庭综合消费(好享贷)
-销售人员 百货零售 经营便利店
-行政业务办理人员 社会事务管理机构 消费
-其他居民服务人员 摩托车及零配件零售 经营电动车车行
-生活照料服务人员 家庭服务 个人经营
-销售人员 建材批发 经营建材
-农作物生产人员 茶叶种植 个人经营
-电力工程技术人员 其他居民服务业 综合消费
-农、林、牧、渔业生产及辅助人员 内陆养殖 经营海鲜
-水产养殖人员 内陆养殖 个人经营
-其他专业技术人员 其他农业 个人消费
-水产养殖人员 内陆养殖 经营周转
-建筑装饰人员 住宅装饰和装修 个人经营
-农作物生产人员 食用菌种植 个人经营
-作物种子(苗)繁育生产人员 正餐服务 个人经营
-农、林、牧、渔业生产及辅助人员 花卉种植 农业
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 海水养殖 个人消费性贷款
-农作物生产人员 其他综合零售 零售业
-农作物生产人员 架线及设备工程建筑 无还本续贷
-销售人员 日用家电零售 借新还旧
-其他农业生产人员 猪的饲养 养猪
-建筑装饰人员 住宅装饰和装修 购建材
-销售人员 通信设备零售 购对讲机等
-酒、饮料及精制茶制造人员 茶叶种植 个人经营
-农作物生产人员 其他互联网平台 短视频创作
-电力供应服务人员 其他建筑安装 个人消费
-水泥、石灰、石膏及其制品制造人员 石灰石、石膏开采 个体经营
-水泥、石灰、石膏及其制品制造人员 石灰石、石膏开采 经营加工厂
-销售人员 五金零售 个人经营-永安市燕南罗暧莹五金经营部周转
-销售人员 住宅装饰和装修 住房装修
-餐饮服务人员 正餐服务 经营餐饮店
-餐饮服务人员 正餐服务 经营餐饮店
-餐饮服务人员 正餐服务 经营海鲜楼
-销售人员 酒、饮料及茶叶批发 个人经营
-其他金属制品制造人员 五金零售 购五金配件等
-其他批发与零售服务人员 烟草制品批发 经营食杂店周转
-农业生产人员 柑橘类种植 借新还旧
-农作物生产人员 柑橘类种植 水果种植
-其他农业生产人员 其他未列明餐饮业 购房
-采购人员 淀粉及淀粉制品制造 食品
-银行服务人员 住宅装饰和装修 房屋装修
-采购人员 汽车旧车零售 购二手车周转
-水产养殖人员 海水养殖 个人经营
-其他交通运输、仓储和邮政业服务人员 普通货物道路运输 周转性贷款
-商务咨询服务人员 其他农业 个人消费
-贸易经济代理人员 其他科技推广服务业 经营周转
-农副林特产品初加工人员 其他水果种植 个人经营
-住宿和餐饮服务人员 零售业 零售业
-其他办事人员 零售业 零售业
-销售人员 其他农牧产品批发 经营流动资金
-销售人员 鞋帽零售 经营周转
-餐饮服务人员 正餐服务 开小吃店
-其他农、林、牧、渔业生产及辅助人员 海水养殖 养殖鲍鱼
-其他农林牧渔生产辅助人员 其他农业 个人经营
-农作物生产人员 百货零售 日用品店经营转贷
-销售人员 厨具卫具及日用杂品批发 批发业
-其他房地产服务人员 住宅装饰和装修 无还本续贷
-销售人员 日用家电零售 制冷设备店经营
-销售人员 日用家电零售 制冷设备店经营
-行政业务办理人员 住宅房屋建筑 购二手房
-酒、饮料及精制茶制造人员 精制茶加工 经营茶叶
-五金制品制作装配人员 建筑幕墙装饰和装修 门窗
-水产养殖人员 海水养殖 个人经营
-农作物生产人员 柑橘类种植 个人经营
-销售人员 住宅装饰和装修 经营装潢公司
-电力、热力生产和供应人员 太阳能发电 进光伏板
-社会生产服务和生活服务人员 果品、蔬菜零售 综合消费
-道路运输服务人员 其他道路运输辅助活动 个人经营
-农、林、牧、渔业生产及辅助人员 烟草种植 种烟
-土木工程建筑施工人员 工矿工程建筑 工程周转
-建材工程技术人员 文具用品零售 进货
-其他批发与零售服务人员 其他园艺作物种植 借新还旧
-销售人员 酒、饮料及茶叶零售 经营食杂店
-行政业务办理人员 其他农业 个人消费
-中等职业教育教师 其他综合零售 综合消费
-水产养殖人员 海水养殖 水产养殖
-水产养殖人员 内陆养殖 养虾
-农、林、牧、渔业生产及辅助人员 五金零售 经营支出
-住宿服务人员 其他未列明卫生服务 个人经营
-其他办事人员 其他居民服务业 住房装修
-其他办事人员 其他居民服务业 住房装修
-房屋建筑施工人员 建筑用石加工 借新还旧
-其他批发与零售服务人员 便利店零售 经营超市
-农作物生产人员 建材批发 经营建材
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-农作物生产人员 林木育苗 借新还旧(种植苗木)
-农、林、牧、渔业生产及辅助人员 其他土木工程建筑施工 个人经营
-其他烟草及其制品加工人员 烟叶复烤 种植烟草
-房屋建筑施工人员 住宅装饰和装修 建筑装饰、装修和其他建筑业
-农业生产服务人员 其他居民服务业 个人经营
-其他农业生产人员 柑橘类种植 种植蜜柚
-餐饮服务人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-销售人员 肉、禽、蛋、奶及水产品零售 经营水产品零售
-其他批发与零售服务人员 其他综合零售 经营建材
-销售人员 肉、禽、蛋、奶及水产品零售 经营周转金
-销售人员 果品、蔬菜批发 购水果
-不便分类的其他从业人员 零售业 零售业
-农、林、牧、渔业生产及辅助人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-农、林、牧、渔业生产及辅助人员 居民服务业 居民服务业
-销售人员 鞋帽批发 用于归还李春侨贷款
-生活照料服务人员 其他土木工程建筑施工 承包工程垫资
-农作物生产人员 茶叶种植 经营茶叶
-销售人员 蔬菜加工 个人经营
-采购人员 超级市场零售 经营超市
-道路和水上运输工程技术人员 其他综合零售 个人消费
-农、林、牧、渔业生产及辅助人员 其他水果种植 种植
-销售人员 其他未列明批发业 建材购销
-销售人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 五金产品批发 个人经营
-作物种子(苗)繁育生产人员 茶叶种植 个人经营
-农业生产人员 零售业 零售业
-其他农、林、牧、渔业生产及辅助人员 海水养殖 养殖黄鱼
-其他社会生产和生活服务人员 花卉种植 种花
-居民服务人员 零售业 零售业
-行政业务办理人员 群众团体、社会团体和其他成员组织 群众团体、社会团体和其他成员组织
-销售人员 服装零售 进货款
-农作物生产人员 稻谷种植 种植
-其他农、林、牧、渔业生产及辅助人员 猪的饲养 养猪
-自由职业者 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-办事人员和有关人员 零售业 零售业
-中小学教育教师 其他居民服务业 家庭综合消费
-销售人员 卫生洁具零售 经营周转
-五金制品制作装配人员 其他农业 借新还旧
-中小学教育教师 其他娱乐业 综合消费
-采购人员 茶叶种植 个人经营
-销售人员 服装批发 个人经营
-水产养殖人员 海水捕捞 鲍鱼养殖
-水产养殖人员 海水养殖 养殖鲍鱼
-广播电视传输服务人员 互联网广告服务 农业
-信息传输、软件和信息技术服务人员 零售业 零售业
-销售人员 肉、禽、蛋、奶及水产品零售 水产品店经营
-销售人员 肉、禽、蛋、奶及水产品零售 购水产品
-销售人员 建材批发 购砂石等
-销售人员 建材批发 购砂石等
-销售人员 建材批发 购砂石等
-餐饮服务人员 正餐服务 归还普惠卡透支本金
-林木种苗繁育人员 林木育苗 种植绿化苗
-社会生产服务和生活服务人员 社会保障 社会保障
-其他批发与零售服务人员 住宅装饰和装修 住房装修
-银行专业人员 住宅装饰和装修 个人消费
-销售人员 化妆品及卫生用品零售 经营化妆品
-农作物生产人员 茶叶种植 个人经营
-销售人员 酒、饮料及茶叶零售 购买茶叶
-销售人员 其他农业专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-销售人员 酒、饮料及茶叶零售 借新还旧
-水产养殖人员 海水养殖 养殖海带
-其他批发与零售服务人员 便利店零售 零售业
-皮革、毛皮及其制品制造人员 橡胶鞋制造 采购各类鞋材
-教学人员 教育 教育
-销售人员 百货零售 经营食杂
-销售人员 其他未列明零售业 个人经营
-其他农业生产人员 柑橘类种植 农业
-销售人员 住宅装饰和装修 个人经营
-行政事务处理人员 社会事务管理机构 个人消费
-水产养殖人员 海水养殖 养殖鲍鱼
-采购人员 其他水果种植 购化肥
-其他农业生产人员 花卉种植 无还本续贷
-餐饮服务人员 快餐服务 经营烧烤店
-农作物生产人员 其他水果种植 种植水果
-农、林、牧、渔业生产及辅助人员 塑料板、管、型材制造 橡胶和塑料制品业
-其他批发与零售服务人员 百货零售 购买日用百货
-销售人员 香蕉等亚热带水果种植 种植水果
-销售人员 酒、饮料及茶叶批发 经营食品店购买食品
-社会生产服务和生活服务人员 建材批发 无还本续贷
-销售人员 其他居民服务业 经营普惠众诚网络有限公司
-其他农林牧渔生产辅助人员 柑橘类种植 种植生产费用
-农业生产服务人员 其他水果种植 购房
-餐饮服务人员 餐饮配送服务 个人经营
-其他生产制造及有关人员 其他居民服务业 周转性贷款
-销售人员 非金属矿及制品批发 个人经营
-销售人员 其他农业 个人消费
-销售人员 五金零售 五金材料批发
-其他批发与零售服务人员 百货零售 零售业
-农业生产服务人员 营养和保健品批发 经营流动资金
-批发与零售服务人员 农产品初加工活动 个人经营
-
-销售人员 住宅装饰和装修 住宅装修
-作物种子(苗)繁育生产人员 农业 农业
-水产养殖人员 海水养殖 购饲料(养殖青蟹)
-不便分类的其他从业人员 其他农业 个人消费
-其他办事人员 住宅装饰和装修 住房装修
-行政事务处理人员 住宅装饰和装修 个人消费
-水产捕捞及有关人员 海水捕捞 个人经营
-畜禽饲养人员 牛的饲养 购买肉牛
-租赁业务人员 互联网安全服务 无还本续贷
-社会生产服务和生活服务人员 果品、蔬菜零售 经营周转
-其他 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-水产捕捞及有关人员 沿海货物运输 经营沙船周转
-农作物生产人员 蔬菜种植 种植
-水产养殖人员 内陆养殖 个人经营
-纺织品和服装剪裁缝纫人员 其他房地产业 购住房
-其他专业技术人员 其他房屋建筑业 借新还旧
-其他专业技术人员 其他居民服务业 个人消费
-教学人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-销售人员 农业专业及辅助性活动 个人经营
-其他专业技术人员 其他未列明服务业 个人消费
-其他专业技术人员 其他未列明服务业 个人消费
-销售人员 汽车修理与维护 个人消费
-畜禽饲养人员 牛的饲养 养殖黄牛
-保险服务人员 住宅装饰和装修 个人消费
-销售人员 百货零售 周转性贷款
-软件和信息技术服务人员 其他农业 个人消费
-其他农、林、牧、渔业生产及辅助人员 其他居民服务业 个人经营
-住宿和餐饮服务人员 其他农业 个人经营
-销售人员 食品、饮料及烟草制品批发 个人经营
-销售人员 百货零售 零售业
-婚姻服务人员 婚姻服务 经营婚庆
-农作物生产人员 茶叶种植 个人经营
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 其他金融业 其他金融业
-美容美发和浴池服务人员 理发及美容服务 经营理发店
-生活照料服务人员 首饰、工艺品及收藏品批发 无还本续贷
-水产养殖人员 海水养殖 养殖黄鱼
-农作物生产人员 茶叶种植 个人经营
-销售人员 肉、禽、蛋、奶及水产品零售 经营水产品零售
-作物种子(苗)繁育生产人员 造林和更新 种桉树
-农业生产人员 海水养殖 虾池养殖
-销售人员 酒、饮料及茶叶批发 个人消费
-水产养殖人员 海水养殖 海蛏养殖、销售
-餐饮服务人员 正餐服务 经营餐饮店
-农作物生产人员 其他农业 农业
-农业生产人员 其他乳制品制造 购黄豆
-销售人员 陶瓷、石材装饰材料零售 购买瓷砖存货
-销售人员 建材批发 经营周转
-其他农、林、牧、渔业生产及辅助人员 正餐服务 经营饭店日常资金周转
-销售人员 天然植物纤维编织工艺品制造 购硅胶、石膏粉等
-社会生产服务和生活服务人员 果品、蔬菜批发 经营周转
-作物种子(苗)繁育生产人员 葡萄种植 个人经营
-土木工程建筑施工人员 公路工程建筑 包工地
-农作物生产人员 林木育种 种植林木
-水产养殖人员 海水养殖 个人经营
-销售人员 卫生洁具零售 无还本续贷
-其他社会生产和生活服务人员 住宅装饰和装修 建筑装饰、装修和其他建筑业
-水产养殖人员 海水养殖 个人经营
-农、林、牧、渔业生产及辅助人员 水产品冷冻加工 经营冷冻厂
-教学人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-销售人员 汽车旧车零售 周转性贷款
-水产养殖人员 海水养殖 养殖鲍鱼
-销售人员 纺织面料鞋制造 经营鞋面厂支付货款
-道路运输服务人员 普通货物道路运输 汽车运输周转
-农作物生产人员 其他农业 农业
-房屋建筑施工人员 住宅房屋建筑 购装修材料
-水产养殖人员 海水养殖 鲍鱼养殖
-水产养殖人员 海水养殖 无还本续贷
-农作物生产人员 住宅装饰和装修 借新还旧
-其他批发与零售服务人员 汽车及零配件批发 轮胎批发
-水产养殖人员 海水养殖 养殖鲍鱼
-其他农、林、牧、渔业生产及辅助人员 其他公路客运 农村客运
-行政事务处理人员 住宅装饰和装修 购买装修材料
-专业技术人员 其他居民服务业 个人消费
-五金制品制作装配人员 金属结构制造 房屋装修
-餐饮服务人员 快餐服务 经营糕饼店
-其他农林牧渔生产辅助人员 其他农业专业及辅助性活动 个人经营
-水产养殖人员 海水养殖 鲍鱼养殖
-作物种子(苗)繁育生产人员 稻谷种植 养蜂
-
-销售人员 服装零售 经营周转
-批发与零售服务人员 食品、饮料及烟草制品专门零售 个人经营
-作物种子(苗)繁育生产人员 流动货摊零售 谷仓
-餐饮服务人员 正餐服务 归还杨信伟贷款
-销售人员 服装批发 经营服装
-五金制品制作装配人员 其他未列明建筑业 钢架结构搭建
-农作物生产人员 住宅房屋建筑 经营房屋建筑
-销售人员 日用家电零售 经营周转
-销售人员 日用家电零售 经营周转
-畜禽饲养人员 鸡的饲养 养鸡
-其他采矿人员 建筑装饰用石开采 经营石材
-水产养殖人员 海水养殖 水产养殖公司经营周转
-餐饮服务人员 其他食品批发 购农产品
-信息通信业务人员 信息技术咨询服务 个人经营
-其他批发与零售服务人员 五金零售 购建材、五金
-基础化学原料制造人员 其他未列明服务业 综合消费
-社会生产服务和生活服务人员 供应链管理服务 人力资源服务
-销售人员 百货零售 经营日杂店
-其他食品、饮料产品加工人员 小吃服务 经营小吃店
-销售人员 灯具零售 生产经营
-水产捕捞及有关人员 肉、禽、蛋、奶及水产品零售 水产品零售
-销售人员 其他居民服务业 购房
-销售人员 鞋帽零售 服装店
-社会生产服务和生活服务人员 住宅装饰和装修 经营装修
-其他批发与零售服务人员 家具零售 家具店进货
-环境保护工程技术人员 公共建筑装饰和装修 无还本续贷
-销售人员 肉、禽、蛋、奶及水产品零售 购生猪等
-社会生产服务和生活服务人员 普通货物道路运输 无还本续贷
-糖制品加工人员 精制茶加工 经营茶叶加工厂
-销售人员 五金零售 购五金配件
-水产养殖人员 海水养殖 个人经营
-餐饮服务人员 正餐服务 经营周转
-农作物生产人员 茶叶种植 种植茶叶
-自由职业者 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 建材批发 经营砂石
-销售人员 建筑幕墙装饰和装修 无还本续贷
-农作物生产人员 麻类种植 种植茶叶
-水产育苗繁育人员 内陆养殖 个人经营
-农业生产服务人员 柑橘类种植 种果
-不便分类的其他从业人员 零售业 零售业
-销售人员 汽车旧车零售 经营二手车
-餐饮服务人员 小吃服务 经营小吃店购买食材
-销售人员 酒、饮料及茶叶零售 经营周转
-销售人员 酒、饮料及茶叶零售 经营周转
-纺织品和服装剪裁缝纫人员 其他未列明批发业 个人消费
-销售人员 涂料零售 采购五金
-农作物生产人员 建材批发 经营建筑材料、室内装饰材料、五金材料等
-专业技术人员 其他水果种植 农、林、牧、渔专业及辅助性活动
-销售人员 非金属矿及制品批发 购买商铺
-农、林、牧、渔业生产及辅助人员 酒、饮料及茶叶批发 购复合肥
-餐饮服务人员 正餐服务 购餐具、酒、食材
-销售人员 其他房地产业 购房
-销售人员 其他互联网服务 无还本续贷
-其他办事人员 住宅装饰和装修 经营室内装修
-其他农业生产人员 汽车新车零售 零售业
-技术辅助服务人员 零售业 零售业
-销售人员 其他农业 个人消费
-其他建筑施工人员 太阳能发电 用于安装光伏发电设备
-其他农、林、牧、渔业生产及辅助人员 住宅装饰和装修 个人消费
-销售人员 日用家电零售 购电器等
-其他农林牧渔生产辅助人员 快餐服务 个人经营
-社会生产服务和生活服务人员 住宅装饰和装修 装修
-销售人员 鞋帽零售 经营周转
-水产养殖人员 海水养殖 养殖黄鱼
-水产养殖人员 海水养殖 养虾投资生产
-其他农业生产人员 坚果种植 种植吊瓜
-销售人员 首饰、工艺品及收藏品批发 金店经营周转
-销售人员 酒、饮料及茶叶零售 经营茶厂
-农、林、牧、渔业生产及辅助人员 其他农业专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-其他非金属矿物制品制造人员 其他非金属矿物制品制造 归还贷款
-销售人员 公共建筑装饰和装修 经营灯具
-农作物生产人员 金属工艺品制造 采购木材
-其他文化、体育和娱乐服务人员 其他土木工程建筑施工 个人经营
-其他农业生产人员 其他居民服务业 个人消费
-水产养殖人员 小吃服务 经营小吃店
-水产养殖人员 海水养殖 养殖鲍鱼
-企事业单位负责人 住宅装饰和装修 个人消费
-农作物生产人员 其他农业专业及辅助性活动 个人经营
-机械工程技术人员 其他居民服务业 个人消费
-再生物资回收人员 再生物资回收与批发 经营废品
-销售人员 其他未列明批发业 装修需要
-农作物生产人员 烟草种植 个人经营
-农作物生产人员 茶叶种植 茶叶展销
-电子工程技术人员 其他农业 个人消费
-销售人员 五金零售 个人经营
-社会生产服务和生活服务人员 管道和设备安装 建筑安装业
-其他农业生产人员 手工具制造 经营蔬菜店资金需要
-其他农业生产人员 手工具制造 经营蔬菜店资金需要
-销售人员 其他未列明批发业 经营电器经营部
-农作物生产人员 茶叶种植 个人经营
-生产制造及有关人员 零售业 零售业
-餐饮服务人员 正餐服务 经营火锅店
-餐饮服务人员 正餐服务 购食材等
-销售人员 住宅装饰和装修 进货
-销售人员 日用家电零售 经营周转
-建筑工程技术人员 其他房屋建筑业 个人经营
-住宿服务人员 民宿服务 经营周转
-其他 其他互联网服务 借新还旧
-农作物生产人员 其他农业专业及辅助性活动 帮扶贷(种植柿子)
-销售人员 住宅装饰和装修 经营五金店
-销售人员 建材批发 流动资金
-农作物生产人员 其他农业 农业
-其他电气机械和器材制造人员 五金产品批发 无还本续贷
-餐饮服务人员 正餐服务 无还本续贷
-畜禽饲养人员 羊的饲养 个人经营
-经济和金融专业人员 其他金融业 其他金融业
-办事人员和有关人员 其他未列明批发业 批发业
-销售人员 首饰、工艺品及收藏品批发 购买工艺品
-销售人员 木质装饰材料零售 经营周转
-销售人员 化妆品及卫生用品零售 化妆品店周转金
-农、林、牧、渔业生产及辅助人员 海水养殖 养殖海参
-工艺美术与创意设计专业人员 五金零售 个人经营
-水产养殖人员 海水养殖 养殖螃蟹
-农业生产服务人员 烟草种植 种烟
-健身和娱乐场所服务人员 健身休闲活动 个人经营
-水产捕捞及有关人员 海水养殖 无还本续贷
-餐饮服务人员 小吃服务 经营小吃店
-采购人员 卫生洁具零售 购卫浴产品
-其他社会生产和生活服务人员 零售业 零售业
-农作物生产人员 住宅房屋建筑 购房
-销售人员 服装零售 购服装
-建材工程技术人员 其他居民服务业 家庭综合消费
-软件和信息技术服务人员 信息技术咨询服务 购买经营所需的货品及日常经营周转
-水产养殖人员 海水养殖 个人经营
-农作物生产人员 便利店零售 经营食杂周转金。
-餐饮服务人员 快餐服务 购买食品
-矿物采选人员 建筑装饰用石开采 石材经营
-其他 建材批发 个人经营
-中小学教育教师 住宅装饰和装修 个人消费
-社会生产服务和生活服务人员 再生物资回收与批发 个人经营
-行政业务办理人员 其他文化艺术业 综合消费
-电力供应服务人员 电力供应 综合消费
-销售人员 住宅装饰和装修 建房装修
-销售人员 其他林业专业及辅助性活动 个人经营
-销售人员 住宅房屋建筑 装修房屋
-其他批发与零售服务人员 木质装饰材料零售 经营建材店
-其他农、林、牧、渔业生产及辅助人员 柑橘类种植 种柑
-其他社会生产和生活服务人员 其他未列明制造业 用于归还贷款。
-住宿服务人员 其他未列明餐饮业 经营餐饮店日常资金需要
-水产养殖人员 海水养殖 养殖黄鱼
-其他 其他食品零售 购烟
-其他 其他食品零售 经营日杂零售
-销售人员 谷物、豆及薯类批发 批发业
-销售人员 化妆品及卫生用品批发 购买商品
-销售人员 其他食品零售 经营食杂店日常资金需要
-农作物生产人员 稻谷种植 个人经营
-销售人员 百货零售 购买住宅
-畜禽饲养人员 其他未列明服务业 养猪周转
-农作物生产人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 机动车燃油零售 个人经营
-其他食品、饮料产品加工人员 其他未列明农副食品加工 地瓜干加工周转金
-销售人员 其他居民服务业 经营电脑店、食品店
-作物种子(苗)繁育生产人员 运动休闲针织服装制造 个人经营
-销售人员 住宅装饰和装修 建筑安装工程有限公司
-销售人员 营养和保健品零售 经营食品
-销售人员 厨具卫具及日用杂品批发 经营建材店
-摄影扩印服务人员 其他居民服务业 居民服务业
-批发与零售服务人员 零售业 零售业
-不便分类的其他从业人员 其他非金属矿物制品制造 个人经营
-其他批发与零售服务人员 酒、饮料及茶叶零售 住房装修
-销售人员 零售业 零售业
-销售人员 建材批发 经营周转
-农作物生产人员 仁果类和核果类水果种植 种植水果
-农作物生产人员 农业 农业
-农作物生产人员 蔬菜种植 购买化肥
-其他专业技术人员 酒、饮料及茶叶零售 经营茶叶
-其他居民服务人员 其他居民服务业 个人经营
-销售人员 仁果类和核果类水果种植 经营家庭农场
-农、林、牧、渔业生产及辅助人员 猪的饲养 养猪
-采购人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-商务咨询服务人员 果品、蔬菜批发 周转金
-社会生产服务和生活服务人员 酒、饮料及茶叶零售 经营奶茶
-行政业务办理人员 住宅装饰和装修 房屋装修
-其他批发与零售服务人员 其他综合零售 经营佛具
-中小学教育教师 普通小学教育 综合消费
-农作物生产人员 鸡的饲养 养鸡
-销售人员 酒、饮料及茶叶零售 经营茶叶店
-农、林、牧、渔业生产及辅助人员 内陆养殖 养鱼
-道路运输服务人员 建筑工程机械与设备经营租赁 归还贷款
-保卫人员 安全服务 个人经营(续贷)
-农、林、牧、渔业生产及辅助人员 稻谷种植 个人经营
-销售人员 其他软件开发 软件和信息技术服务业
-酒、饮料及精制茶制造人员 茶叶种植 个人经营
-行政业务办理人员 其他不提供住宿社会工作 个人消费
-销售人员 其他食品零售 经营卤料店
-销售人员 其他房地产业 购一手房
-销售人员 建材批发 借新还旧
-销售人员 果品、蔬菜批发 流动资金
-专业技术人员 摩托车及零配件零售 经营周转
-其他农业生产人员 其他中药材种植 种仙草
-美容美发和浴池服务人员 足浴服务 经营足浴店
-其他办事人员 茶叶种植 个人经营
-其他社会生产和生活服务人员 葡萄种植 个人经营
-销售人员 汽车旧车零售 个人经营
-水产养殖人员 海水养殖 养殖鲍鱼
-销售人员 酒、饮料及茶叶零售 经营周转
-砖瓦石材等建筑材料制造人员 粘土砖瓦及建筑砌块制造 个人经营
-销售人员 涂料零售 经营油漆
-销售人员 纺织服装、服饰业 纺织服装、服饰业
-采购人员 其他食品零售 经营便利店
-其他办事人员和有关人员 国家机构 国家机构
-其他林业生产人员 林木育苗 苗木种植
-作物种子(苗)繁育生产人员 花卉种植 个人经营
-销售人员 厨具卫具及日用杂品批发 批发业
-餐饮服务人员 其他房地产业 购一手房
-其他批发与零售服务人员 建材批发 经营建材
-社会生产服务和生活服务人员 稻谷种植 农、林、牧、渔专业及辅助性活动
-作物种子(苗)繁育生产人员 其他居民服务业 个人经营
-销售人员 建材批发 购石材等
-建筑装饰人员 住宅装饰和装修 借新还旧,用于归还债务。
-其他办事人员和有关人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-销售人员 便利店零售 零售业
-行政事务处理人员 住宅装饰和装修 综合消费
-其他批发与零售服务人员 五金产品批发 借新还旧
-其他农业生产人员 其他林业专业及辅助性活动 农业
-房屋建筑施工人员 住宅房屋建筑 工程周转
-销售人员 五金零售 五金店周转
-销售人员 日用电器修理 归还傅顺情我行贷款本金
-畜禽饲养人员 猪的饲养 个人经营
-信息和通信工程技术人员 互联网其他信息服务 购房
-化工产品生产通用工艺人员 住宅装饰和装修 个人消费
-销售人员 酒、饮料及茶叶批发 经营茶叶
-销售人员 鞋帽零售 经营鞋店
-销售人员 纺织品及针织品零售 经营百货店(无还本续贷)
-销售人员 其他食品零售 进货
-工艺美术品制作人员 其他工艺美术及礼仪用品制造 经营工艺品加工资金需要
-炼钢人员 其他综合零售 个人消费
-生产制造及有关人员 其他金属制日用品制造 购铜等
-销售人员 正餐服务 无还本续贷
-健康咨询服务人员 门诊部(所) 卫生室经营周转
-不便分类的其他从业人员 土木工程建筑业 土木工程建筑业
-建筑安装施工人员 其他建筑安装 无还本续贷,用于归还贷款本金。
-水产养殖人员 海水养殖 养鱼
-房地产中介服务人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-农、林、牧、渔业生产及辅助人员 便利店零售 经营便利店
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 居民服务业 居民服务业
-行政业务办理人员 其他居民服务业 个人消费
-矿物采选人员 家庭服务 家庭综合消费
-其他石油加工和炼焦、煤化工生产人员 其他基础化学原料制造 购原料
-销售人员 百货零售 经营百货店资金需要
-其他农业生产人员 大型车辆装备修理与维护 经营机动车检测站
-专业化设计服务人员 其他广告服务 经营广告设计
-餐饮服务人员 民宿服务 经营民宿
-其他木材加工、家具与木制品制作人员 家具零售 购买家具家电
-中小学教育教师 普通小学教育
-农、林、牧、渔业生产及辅助人员 百货零售 购食品等
-农作物生产人员 小麦种植 种植小麦
-销售人员 酒、饮料及茶叶零售 茶叶店经营周转
-居民服务人员 汽车修理与维护 个人经营
-水产养殖人员 海水养殖 养殖鲍鱼
-餐饮服务人员 快餐服务 个人经营
-农作物生产人员 花卉种植 兰花种植
-作物种子(苗)繁育生产人员 其他农业专业及辅助性活动 个人经营
-畜禽饲养人员 鸡的饲养 购买饲料
-销售人员 服装零售 经营服装
-销售人员 服装零售 经营服装
-办事人员和有关人员 稻谷种植 农业
-销售人员 住宅装饰和装修 个人消费
-不便分类的其他从业人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-销售人员 住宅装饰和装修 购进家具
-不便分类的其他从业人员 其他非金属矿物制品制造 个人经营
-再生物资回收人员 再生物资回收与批发 个人经营
-销售人员 电气设备批发 个人经营
-其他社会生产和生活服务人员 其他农业 个人消费
-销售人员 鞋帽零售 用于鞋服店日常经营
-纺纱人员 房屋建筑业 房屋建筑业
-农、林、牧、渔业生产及辅助人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-畜禽饲养人员 鸡的饲养 畜牧业
-行政业务办理人员 住宅装饰和装修 个人消费
-保卫人员 住宅装饰和装修 房子装修
-酒、饮料及精制茶制造人员 精制茶加工 茶叶生产
-其他批发与零售服务人员 其他综合零售 归还本金
-水产养殖人员 海水养殖 鲍鱼养殖
-销售人员 果品、蔬菜批发 经营周转
-社会生产服务和生活服务人员 服装零售 零售业
-销售人员 陶瓷、石材装饰材料零售 购建筑材料
-其他办事人员 机动车燃油零售 经营流动金
-农作物生产人员 林木育种 个人经营
-房屋建筑施工人员 住宅装饰和装修 房屋改造
-销售人员 保健辅助治疗器材零售 零售业
-餐饮服务人员 百货零售 个人经营
-信息通信业务人员 信息技术咨询服务 购装鉓品、鞋等
-纺织品和服装剪裁缝纫人员 服饰制造 支付进货款
-五金制品制作装配人员 黑色金属冶炼和压延加工业 黑色金属冶炼和压延加工业
-销售人员 便利店零售 个人经营贷款资金周转需要
-其他批发与零售服务人员 肉、禽、蛋、奶及水产品零售 经营食品店
-农作物生产人员 食用菌种植 个人经营
-行政业务办理人员 果品、蔬菜批发 个人经营
-其他批发与零售服务人员 住宅房屋建筑 个人经营
-办事人员和有关人员 居民服务业 居民服务业
-销售人员 鞋帽批发 无还本续贷
-销售人员 柑橘类种植 种植蜜柚
-道路运输服务人员 其他综合零售 个人消费
-电机制造人员 家用电力器具专用配件制造 购车等综合消费
-销售人员 服装零售 无还本续贷
-销售人员 灯具零售 购灯具等
-销售人员 其他饮料及冷饮服务 综合消费
-银行专业人员 住宅装饰和装修 个人消费
-其他专业技术人员 铁路货物运输 个人经营资金
-行政执法和仲裁人员 住宅装饰和装修 个人消费
-销售人员 其他未列明批发业 购鱼
-其他办事人员 住宅装饰和装修 个人消费
-其他居民服务人员 其他房屋建筑业 借新还旧
-社会生产服务和生活服务人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-采购人员 纺织品及针织品零售 个人经营
-销售人员 汽车零配件零售 借新还旧
-道路运输服务人员 普通货物道路运输 经营运输
-房屋建筑施工人员 其他综合零售 个人消费
-水产养殖人员 海水养殖 个人经营
-群众文化活动服务人员 群众文体活动 经营周转
-销售人员 其他非金属矿物制品制造 个人经营
-销售人员 酒、饮料及茶叶零售 食品销售
-水泥、石灰、石膏及其制品制造人员 水泥制造 归还贷记卡
-水产养殖人员 海水养殖 养殖龙须菜
-其他办事人员 其他综合零售 个人消费
-农作物生产人员 其他未列明制造业 硅胶加工
-家具制造人员 木质家具制造 经营全屋定制
-销售人员 百货零售 百货进货
-农作物生产人员 仁果类和核果类水果种植 个人经营
-水产养殖人员 海水养殖 养殖鲍鱼
-文化、娱乐、体育经纪代理人员 电子游艺厅娱乐活动 个人经营
-土木工程建筑施工人员 园林绿化工程施工 经营周转
-其他批发与零售服务人员 酒、饮料及茶叶零售 个人经营
-其他批发与零售服务人员 陶瓷、石材装饰材料零售 购板材
-农、林、牧、渔业生产及辅助人员 其他家具制造 木质模具加工
-其他办事人员 其他日用品零售 购居家用品等
-其他办事人员 其他日用品零售 购居家用品等
-其他批发与零售服务人员 卫生洁具零售 经营周转
-住宿服务人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 便利店零售 经营便利店
-农、林、牧、渔业生产及辅助人员 其他农牧产品批发 水果营销
-健身和娱乐场所服务人员 健身休闲活动 经营健身活动中心
-畜禽饲养人员 羊的饲养 养羊
-农作物生产人员 其他农业专业及辅助性活动 购茶苗
-销售人员 厨具卫具及日用杂品批发 购酒店用品
-销售人员 厨具卫具及日用杂品批发 购酒店用品
-住宿服务人员 房地产租赁经营 周转性贷款
-销售人员 五金零售 购买经营货品等
-企业负责人 家具零售 个人消费
-采购人员 建材批发 购建材
-幼儿教育教师 学前教育 购教学耗材
-农作物生产人员 服装零售 经营服装店资金周转
-学生 住宅装饰和装修 购买家具
-销售人员 其他日用品零售 经营周转
-销售人员 五金产品批发 经营周转
-采购人员 酒、饮料及茶叶零售 购买茶叶
-餐饮服务人员 正餐服务 个人经营
-农作物生产人员 小麦种植 经营建材
-餐饮服务人员 其他未列明餐饮业 经营周转。
-道路运输服务人员 其他公路客运 道路运输
-采购人员 其他室内装饰材料零售 经营装饰材料商店
-采购人员 其他室内装饰材料零售 经营装饰材料商店
-古建筑修建人员 其他土木工程建筑施工 无还本续贷
-其他批发与零售服务人员 其他软件开发 经营周转
-农作物生产人员 茶叶种植 个人经营
-护理人员 其他农业 个人消费
-作物种子(苗)繁育生产人员 茶叶种植 农业
-作物种子(苗)繁育生产人员 百货零售 零售业
-销售人员 海水养殖 个人经营贷款资金周转需
-农作物生产人员 蔬菜种植 种植业转贷
-建筑工程技术人员 其他居民服务业 房屋装修
-建筑工程技术人员 其他未列明服务业 房屋装修
-道路运输服务人员 普通货物道路运输 无还本续贷(个人经营)
-其他信息传输、软件和信息技术服务人员 住宅装饰和装修 无还本续贷
-生产制造及有关人员 粘土砖瓦及建筑砌块制造 非金属矿物制品业
-检验、检测和计量服务人员 其他居民服务业 购二手房
-水产养殖人员 海水养殖 养殖海参
-仓储人员 其他居民服务业 经营周转(借新还旧)
-办事人员和有关人员 运行维护服务 公司流动资金周转
-销售人员 柑橘类种植 经营周转
-其他社会生产和生活服务人员 其他道路货物运输 个人经营
-销售人员 糕点、面包零售 住房装修
-销售人员 涂料零售 个人经营
-社会生产服务和生活服务人员 鞋帽零售 个人经营
-仪器仪表装配人员 卫生洁具零售 个人经营
-其他社会生产和生活服务人员 金属结构制造 养殖业
-其他金属制品制造人员 金属门窗制造 门窗加工销售
-公共卫生辅助服务人员 住宅装饰和装修 房屋装修及购买家具
-农作物生产人员 其他农业 个人经营
-土木工程建筑施工人员 其他土木工程建筑施工 建筑包工转贷
-销售人员 内陆养殖 购鱼苗
-中等职业教育教师 其他农业 个人消费
-销售人员 酒、饮料及茶叶批发 经营周转
-销售人员 其他综合零售 食杂经营
-销售人员 酒、饮料及茶叶零售 无本续贷(经营茶叶)
-企业负责人 其他日用品零售 经营周转
-销售人员 卫生洁具零售 裸房外墙装修
-作物种子(苗)繁育生产人员 稻谷种植 无还本续贷(农E贷)
-房屋建筑施工人员 管道和设备安装 经营周转金
-农作物生产人员 其他综合零售 个人消费性贷款
-其他社会生产和生活服务人员 餐饮业 餐饮业
-销售人员 果品、蔬菜零售 经营水果店购买水果
-销售人员 珠宝首饰零售 个人经营
-销售人员 工艺美术品及收藏品零售 正常
-其他批发与零售服务人员 五金零售 钢材批发销售
-销售人员 建材批发 个人经营
-办事人员和有关人员 烟叶复烤 个人消费
-邮政和快递服务人员 快递服务 周转性贷款
-事业单位负责人 其他未列明服务业 家庭综合消费
-其他批发与零售服务人员 其他食品零售 购食杂等
-其他批发与零售服务人员 其他食品零售 购食杂等
-其他批发与零售服务人员 计算机、软件及辅助设备零售 购买材料
-销售人员 酒、饮料及茶叶零售 茶叶经营
-餐饮服务人员 小吃服务 经营小吃店
-销售人员 首饰、工艺品及收藏品批发 个人经营
-其他办事人员和有关人员 其他农业 个人消费
-销售人员 服装零售 购服装
-社会生产服务和生活服务人员 日用家电零售 个人经营
-其他批发与零售服务人员 其他未列明零售业 借新还旧
-销售人员 纺织品及针织品零售 周转性贷款
-销售人员 服装零售 购经营所需材料等
-其他办事人员 住宅房屋建筑 经营周转金
-农作物生产人员 薯类种植 个人经营
-农作物生产人员 薯类种植 个人经营
-其他农林牧渔生产辅助人员 海水捕捞 养殖经营
-水产养殖人员 内陆养殖 借新还旧
-其他农业生产人员 柑橘类种植 种植蜜柚
-行政业务办理人员 住宅装饰和装修 个人消费
-不便分类的其他从业人员 农业 农业
-农作物生产人员 烟草种植 种烟
-银行专业人员 住宅装饰和装修 个人消费
-销售人员 百货零售 经营超市,购买百货
-水产捕捞及有关人员 海水捕捞 捕捞生产
-销售人员 其他食品批发 个人经营
-水产养殖人员 海水养殖 经营扇贝养殖
-社会生产服务和生活服务人员 其他未列明服务业 其他服务业
-房屋建筑施工人员 住宅装饰和装修 建筑装饰、装修和其他建筑业
-销售人员 建材批发 建材进货
-销售人员 其他室内装饰材料零售 建材店经营
-农作物生产人员 稻谷种植 经营周转
-销售人员 百货零售 百货经营
-其他批发与零售服务人员 纺织品及针织品零售 购买纺织品
-农作物生产人员 便利店零售 饮料商店
-美容美发和浴池服务人员 住宅装饰和装修 住房装修
-行政业务办理人员 其他居民服务业 个人消费
-农业生产人员 海水养殖 网箱养殖购鱼苗及饲料
-其他教学人员 教育辅助服务 经营教育信息服务
-党的机关、国家机关、群众团体和社会组织、企事业单位负责人 卫生 卫生
-水产养殖人员 海水养殖 鲍鱼养殖
-水产养殖人员 海水养殖 鲍鱼养殖
-其他农、林、牧、渔业生产及辅助人员 海水养殖 养虾
-农作物生产人员 葡萄种植 种植葡萄
-水产养殖人员 海水养殖 养殖鲍鱼
-餐饮服务人员 小吃服务 经营小吃店等
-销售人员 超级市场零售 经营超市
-水产养殖人员 海水养殖 个人经营
-其他办事人员 游乐园 购游乐设施等
-农、林、牧、渔业生产及辅助人员 稻谷种植 个人经营
-销售人员 工艺美术品及收藏品零售 零售业
-信息和通信工程技术人员 其他居民服务业 个人消费
-社会生产服务和生活服务人员 住宅装饰和装修 借新还旧
-房地产中介服务人员 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-销售人员 互联网零售 电商推广运营
-木材加工人员 单板加工 无还本续贷
-其他卫生专业技术人员 门诊部(所) 个人经营
-农、林、牧、渔业生产及辅助人员 食用菌种植 种木耳
-农作物生产人员 葡萄种植 种植葡萄
-土木工程建筑施工人员 其他土木工程建筑施工 个人经营
-销售人员 其他农牧产品批发 茶叶销售
-销售人员 日用家电零售 经营永定区银玲电器经营部
-采购人员 鸭的饲养 扶贫贷养鸡鸭
-农作物生产人员 其他日用杂品制造 其他制造业
-建筑工程技术人员 住宅装饰和装修 个人经营
-水产养殖人员 海水养殖 个人经营
-不便分类的其他从业人员 建筑装饰、装修和其他建筑业 建筑装饰、装修和其他建筑业
-销售人员 零售业 零售业
-餐饮服务人员 正餐服务 购房
-批发与零售服务人员 零售业 零售业
-水产捕捞及有关人员 其他渔业专业及辅助性活动 捕捞生产
-水产捕捞及有关人员 海水捕捞 捕捞生产
-农作物生产人员 海水养殖 魔芋经营
-农作物生产人员 海水养殖 养蟹生产
-水产养殖人员 其他农业 无还本续贷
-其他橡胶和塑料制品制造人员 非金属废料和碎屑加工处理 塑料制造加工
-农作物生产人员 其他水果种植 种植西瓜
-销售人员 酒、饮料及茶叶零售 个体经营
-其他批发与零售服务人员 机动车燃油零售 购成品油
-销售人员 百货零售 购日用品
-销售人员 百货零售 购日用品
-其他农业生产人员 住宅装饰和装修 个人消费
-农副产品加工人员 塑料零件及其他塑料制品制造 购原材料
-农作物生产人员 茶叶种植 个人经营
-销售人员 日用家电零售 购经营所需的家电等
-销售人员 服装零售 经营周转
-餐饮服务人员 其他房地产业 购首套住房
-作物种子(苗)繁育生产人员 花卉种植 经营周转
-销售人员 建筑装饰及水暖管道零件制造 经营卫浴
-房地产中介服务人员 其他居民服务业 个人消费
-住宿服务人员 民宿服务 经营出租房
-销售人员 其他农业 个人消费
-农作物生产人员 食用菌种植 种植香菇
-销售人员 便利店零售 借新还旧
-农业生产人员 海水养殖 养殖生蚝
-生产制造及有关人员 群众团体、社会团体和其他成员组织 群众团体、社会团体和其他成员组织
-道路运输服务人员 普通货物道路运输 普惠卡转贷款
-其他办事人员 零售业 零售业
-建筑装饰人员 住宅房屋建筑 盘转存量到期信贷业务
-社会生产服务和生活服务人员 鞋帽批发 皮革、毛皮、羽毛及其制品和制鞋业
-销售人员 服装零售 购服装
-销售人员 其他未列明制造业 其他制造业
-销售人员 其他食品零售 经营土特产
-社会生产服务和生活服务人员 金属门窗制造 经营周转
-其他农、林、牧、渔业生产及辅助人员 海水养殖 个人经营
-销售人员 建材批发 无还本续贷
-农副产品加工人员 酒、饮料及茶叶零售 酒、饮料及精制茶制造业
-销售人员 家具零售 无还本续贷
-畜禽饲养人员 鸡的饲养 养鸡鸭
-销售人员 其他未列明服务业 个人经营
-化工产品生产通用工艺人员 住宅装饰和装修 住房装修
-生产制造及有关人员 建筑用石加工 无还本续贷
-行政事务处理人员 住宅房屋建筑 购房
-行政事务处理人员 其他土木工程建筑施工 建筑装饰、装修和其他建筑业
-作物种子(苗)繁育生产人员 酒、饮料及茶叶零售 零售业
-销售人员 卫生洁具零售 购水暖卫浴等
-房屋建筑施工人员 住宅房屋建筑 经营周转金
-销售人员 其他综合零售 建材经营
-餐饮服务人员 其他未列明餐饮业 餐饮业
-销售人员 酒、饮料及茶叶零售 个人经营
-销售人员 服装零售 购服装
-水产养殖人员 海水养殖 鲍鱼养殖
-农作物生产人员 茶叶种植 经营茶叶种植场
-其他办事人员 其他综合零售 个人消费资金
-建筑装饰人员 住宅房屋建筑 用于归还贷款本金
-住宿服务人员 通信设备零售 经营周转
-批发与零售服务人员 零售业 零售业
-水产养殖人员 海水养殖 养殖鲍鱼
-餐饮服务人员 正餐服务 用于归还庄丽明的普惠卡
-水产养殖人员 海水养殖 个人经营
-建筑工程技术人员 建筑用石加工 无还本续贷
-农作物生产人员 其他农牧产品批发 贩卖食用菌
-销售人员 汽车新车零售 二手车经营
-销售人员 酒、饮料及茶叶零售 个人经营
-软件和信息技术服务人员 其他未列明信息技术服务业 用于无还本续贷
-社会生产服务和生活服务人员 肉、禽、蛋、奶及水产品零售 借新还旧贷款
-其他农业生产人员 其他农牧产品批发 竹林管理
-不便分类的其他从业人员 住宅装饰和装修 个人消费
-其他农、林、牧、渔业生产及辅助人员 海水养殖 养殖鲍鱼
-农业生产人员 陶瓷、石材装饰材料零售 五金店周转
-软件和信息技术服务人员 其他农业 个人消费
-其他社会生产和生活服务人员 建材批发 购管材、水泥等
-行政事务处理人员 化肥批发 个人经营资金
-银行服务人员 其他农业 个人消费
-其他农业生产人员 木材采运 收购木材
-农、林、牧、渔业生产及辅助人员 其他农业 农业
-餐饮服务人员 快餐服务 个人经营
-销售人员 通信设备零售 经营手机店
-房屋建筑施工人员 住宅房屋建筑 住房装修
-其他农林牧渔生产辅助人员 通信设备零售 购买电子产品
-建筑安装施工人员 其他居民服务业 个人消费
-租赁业务人员 房地产租赁经营 经营出租房
-销售人员 汽车旧车零售 经营二手车销售等
-销售人员 汽车旧车零售 经营二手车销售
-其他农、林、牧、渔业生产及辅助人员 食品、饮料及烟草制品专门零售 个人经营
-销售人员 医疗用品及器材批发 经营周转
-行政业务办理人员 住宅装饰和装修 无还本续贷
-其他社会生产和生活服务人员 其他食品批发 批发业
-销售人员 互联网批发 经营电子商务,购买工艺品
-销售人员 其他未列明批发业 归还本金
-行政业务办理人员 住宅装饰和装修 个人消费
-其他橡胶和塑料制品制造人员 教育 教育
-其他居民服务人员 其他居民服务业 个人经营
-销售人员 其他室内装饰材料零售 采购卫浴产品
-农作物生产人员 酒、饮料及茶叶零售 茶叶生产
-销售人员 建材批发 购买建材
-农作物生产人员 茶叶种植 茶叶种植
-农业生产服务人员 农业机械活动 盘活逾期普惠卡
-住宿服务人员 其他住宿业 周转性贷款
-行政业务办理人员 其他综合零售 个人消费
-农作物生产人员 茶叶种植 经营茶叶种植
-农作物生产人员 茶叶种植 经营茶叶种植
-销售人员 卫生洁具零售 购水暖卫浴等
-其他木材加工、家具与木制品制作人员 竹材采运 购买原材料
-销售人员 工艺美术品及收藏品零售 购配件等
-销售人员 其他仪器仪表制造业 购彩钢板、镀锌板
-销售人员 营养和保健品零售 个人经营
-销售人员 建材批发 经营建材
-农作物生产人员 稻谷种植 种植水稻
-批发与零售服务人员 零售业 零售业
-自由职业者 百货零售 零售业
-农、林、牧、渔业生产及辅助人员 住宅装饰和装修 无还本续贷
-水产养殖人员 海水养殖 养殖鲍鱼
-销售人员 陶瓷、石材装饰材料零售 零售业
-销售人员 餐饮业 餐饮业
-农作物生产人员 茶叶种植 个人经营
-五金制品制作装配人员 金属表面处理及热处理加工 建房
-农作物生产人员 稻谷种植 个人消费
-人造板制造人员 胶合板制造 购材料
-农副产品加工人员 住宅房屋建筑 装修装潢
-农作物生产人员 茶叶种植 个人消费
-水产养殖人员 海水养殖 养殖场周转金
-农业生产人员 市政道路工程建筑 个人经营
-其他 稻谷种植 农业
-餐饮服务人员 快餐服务 经营早餐店
-销售人员 其他机械设备及电子产品批发 经营贸易商行
-销售人员 五金零售 经营卷帘门
-建筑装饰人员 管道和设备安装 个人经营
-农、林、牧、渔业生产及辅助人员 其他居民服务业 借新还旧
-农作物生产人员 茶叶种植 个人经营
-皮革、毛皮及其制品制造人员 皮鞋制造 无还本续贷
-中等职业教育教师 中等职业学校教育 综合消费
-药学技术人员 农业 农业
-其他租赁和商务服务人员 其他广告服务 经营周转
-其他农业生产人员 茶叶种植 经营种植茶叶
-其他社会生产和生活服务人员 其他居民服务业 压降转贷
-销售人员 五金零售 建材购销
-水上运输服务人员 蔬菜种植 个人经营
-农业生产人员 其他农业 个人消费
-作物种子(苗)繁育生产人员 蔬菜种植 借新还旧
-销售人员 便利店零售 个人经营
-不便分类的其他从业人员 其他土木工程建筑施工 购买建材
-销售人员 其他房地产业 购二手住房
-销售人员 其他农业 个人消费
-信息通信业务人员 住宅装饰和装修 住房装修
-健康矫正服务人员 化妆品及卫生用品零售 经营周转金
-销售人员 其他食品批发 经营农副产品店
-农作物生产人员 蔬菜种植 经营周转,地亩款
-生活照料服务人员 茶叶种植 茶叶种植
-其他批发与零售服务人员 其他未列明信息技术服务业 购信息设备
-森林经营和管护人员 森林经营和管护 林业
-旅游及公共游览场所服务人员 旅行社及相关服务 旅游公司经营
-其他交通运输、仓储和邮政业服务人员 其他未列明建筑业 综合消费
-其他批发与零售服务人员 服装零售 个人经营资金
-保健服务人员 养生保健服务 进货
-餐饮服务人员 酒吧服务 个人经营
-农作物生产人员 市政设施管理 经营承包工程
-不便分类的其他从业人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-采购人员 建材批发 续贷
-其他社会生产和生活服务人员 零售业 零售业
-餐饮服务人员 正餐服务 个人经营
-农作物生产人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-农作物生产人员 含油果种植 种油茶
-居民服务人员 村民自治组织 种植柑橘,养殖鸡鸭
-纺织品和服装剪裁缝纫人员 服饰制造 转贷
-水产养殖人员 内陆养殖 借新还旧
-水产养殖人员 内陆养殖 借新还旧
-餐饮服务人员 餐饮配送服务 周转性贷款
-餐饮服务人员 餐饮配送服务 经营周转
-餐饮服务人员 餐饮配送服务 经营周转
-批发与零售服务人员 便利店零售 零售业
-其他卫生专业技术人员 综合医院 借新还旧
-家具制造人员 木质家具制造 个人经营
-销售人员 农产品初加工活动 经营茶叶
-农作物生产人员 其他房地产业 购二手房
-纺织品和服装剪裁缝纫人员 服饰制造 经营周转
-社会生产服务和生活服务人员 家具零售 经营周转,家具备货
-餐饮服务人员 小吃服务 经营小酒馆
-森林经营和管护人员 森林经营和管护 借新还旧
-其他租赁和商务服务人员 其他未列明服务业 无还本续贷
-电力供应服务人员 其他综合零售 无还本续贷
-采购人员 农产品初加工活动 经营茶叶
-销售人员 服装批发 服装经营
-教学人员 零售业 零售业
-皮革、毛皮及其制品制造人员 皮箱、包(袋)制造 借新还旧
-销售人员 家用电子产品修理 个人经营
-销售人员 日用家电零售 流动资金
-不便分类的其他从业人员 快餐服务 无还本续贷
-幼儿教育教师 其他房地产业 购房
-保险专业人员 农业 农业
-自由职业者 房地产租赁经营 参与建设村集体用地“霞梧集体项目”
-其他农、林、牧、渔业生产及辅助人员 住宅房屋建筑 流动资金
-销售人员 服装批发 服饰公司经营
-中小学教育教师 住宅房屋建筑 个人消费
-水产养殖人员 海水捕捞 海洋捕捞
-交通运输、仓储和邮政业服务人员 道路运输业 道路运输业
-销售人员 纺织品、针织品及原料批发 经营周转
-销售人员 纺织品、针织品及原料批发 经营周转
-农、林、牧、渔业生产及辅助人员 稻谷种植 无还本续贷
-销售人员 茶叶种植 个人经营
-其他办事人员 住宅房屋建筑 个人经营
-其他农林牧渔生产辅助人员 住宅房屋建筑 购一手房
-交通运输、仓储和邮政业服务人员 普通货物道路运输 道路运输业
-销售人员 木质家具制造 购买家具
-道路运输服务人员 普通货物道路运输 无还本续贷
-社会生产服务和生活服务人员 居民服务业 居民服务业
-其他批发与零售服务人员 其他综合零售 经营水果店
-行政事务处理人员 其他居民服务业 个人消费
-农作物生产人员 住宅装饰和装修 房屋装修
-邮政和快递服务人员 住宅装饰和装修 个人经营
-水产养殖人员 海水养殖 借新还旧
-销售人员 超级市场零售 经营超市
-森林经营和管护人员 森林经营和管护 无还本续贷
-银行服务人员 零售业 零售业
-社会生产服务和生活服务人员 纺织面料鞋制造 鞋材加工
-水产捕捞及有关人员 海水捕捞 个人经营
-农作物生产人员 住宅装饰和装修 不锈钢加工
-销售人员 其他农牧产品批发 经营农副产品
-销售人员 其他农牧产品批发 经营农副产品
-农作物生产人员 其他农业 个人经营
-其他农、林、牧、渔业生产及辅助人员 海水养殖 借新还旧
-销售人员 其他食品批发 归还普惠卡欠款
-销售人员 正餐服务 个人经营
-轨道交通运输服务人员 高速铁路旅客运输 个人消费
-销售人员 其他室内装饰材料零售 经营建材
-销售人员 住宅装饰和装修 住房装修
-农作物生产人员 其他房地产业 购房
-农作物生产人员 住宅装饰和装修 经营装饰材料店
-及辅助性活动
-高等教育教师 普通高等教育 消费
-农作物生产人员 香蕉等亚热带水果种植 种植香蕉、麻竹
-农、林、牧、渔业生产及辅助人员 造林和更新 造林
-农作物生产人员 其他农业 个人经营
-销售人员 其他电子产品零售 归还贷款本金
-销售人员 烟草制品零售 卷烟零售
-销售人员 住宅装饰和装修 个人消费
-其他社会生产和生活服务人员 其他综合零售 零售业
-农作物生产人员 百货零售 个人消费
-餐饮服务人员 正餐服务 经营五金店
-土木工程建筑施工人员 其他未列明建筑业 购建筑材料
-其他居民服务人员 食用菌种植 个人经营
-销售人员 其他机械设备及电子产品批发 批发业
-农作物生产人员 稻谷种植 续贷
-其他农、林、牧、渔业生产及辅助人员 肉、禽、蛋、奶及水产品零售 个人经营
-销售人员 其他未列明批发业 批发业
-其他通用设备制造人员 其他未列明通用设备制造业 支付材料耗材款
-水产养殖人员 海水养殖 鲍鱼养殖
-农作物生产人员 食用菌种植 个人经营
-销售人员 其他农牧产品批发 个人经营
-农作物生产人员 猪的饲养 养猪
-作物种子(苗)繁育生产人员 茶叶种植 农业
-家具制造人员 家具零售 无还本续贷
-农、林、牧、渔业生产及辅助人员 煤炭及制品批发 个人经营
-幼儿教育教师 学前教育 盘转存量到期业务
-农作物生产人员 其他农业 个人消费
-道路运输服务人员 小吃服务 个人经营性贷款
-中小学教育教师 住宅房屋建筑 住房按揭
-不便分类的其他从业人员 零售业 零售业
-销售人员 陶瓷、石材装饰材料零售 个人经营
-中小学教育教师 居民服务业 居民服务业
-行政业务办理人员 牲畜批发 购销活禽等
-餐饮服务人员 小吃服务 经营小吃店
-农、林、牧、渔业生产及辅助人员 柑橘类种植 种果
-其他专业技术人员 其他居民服务业 盘转存量到期业务
-销售人员 其他综合零售 经营美发店
-销售人员 酒、饮料及茶叶零售 购茶叶
-住宿服务人员 经济型连锁酒店 购酒店用品
-其他批发与零售服务人员 百货零售 购经营用日用百货等
-人民警察 住宅房屋建筑 个人消费
-销售人员 服装零售 服装销售
-销售人员 其他机械设备及电子产品批发 归还吴志雄贷款和信用卡
-贸易经济代理人员 其他农业 个人消费
-销售人员 其他综合零售 购货物
-软件和信息技术服务人员 计算机、通信和其他电子设备制造业 计算机、通信和其他电子设备制造业
-餐饮服务人员 正餐服务 个人经营
-行政事务处理人员 住宅装饰和装修 住房装修
-批发与零售服务人员 普通货物道路运输 道路运输
-销售人员 糕点、面包零售 购冷热食品原材料
-不便分类的其他从业人员 农、林、牧、渔专业及辅助性活动 农、林、牧、渔专业及辅助性活动
-其他农业生产人员 鸡的饲养 养鸡
-销售人员 服装零售 贸易公司流动资金
-销售人员 住宅装饰和装修 个人消费
-砖瓦石材等建筑材料制造人员 建筑用石加工 个人经营
-其他批发与零售服务人员 服装批发 购买经营所需的服装等
-其他办事人员 零售业 零售业
-农、林、牧、渔业生产及辅助人员 酒、饮料及茶叶零售 经营日用品店
-销售人员 其他日用品零售 经营日用品
-土木工程建筑施工人员 住宅房屋建筑 借新还旧
-水产养殖人员 海水养殖 海蛎养殖
-餐饮服务人员 快餐服务 
-农作物生产人员 茶叶种植 个人消费
-道路运输服务人员 普通货物道路运输 经营理发店
-销售人员 酒、饮料及茶叶零售 购茶叶
-砖瓦石材等建筑材料制造人员 建筑用石加工 个人周转金
-销售人员 汽车零配件零售 进购配件,日常周转等
-销售人员 酒、饮料及茶叶零售 经营烟酒
-居民服务人员 机动车、电子产品和日用产品修理业 机动车、电子产品和日用产品修理业
-船舶制造人员 其他房地产业 购买二手房
-住宿和餐饮服务人员 小吃服务 经营小吃
-销售人员 棉织造加工 借新还旧
-建筑安装施工人员 其他建筑安装 购买石材
-农作物生产人员 稻谷种植 种养殖周转
-其他建筑施工人员 住宅房屋建筑 经营周转金
-农作物生产人员 其他未列明餐饮业 经营餐饮
-农、林、牧、渔业生产及辅助人员 其他农业 个人经营
-农、林、牧、渔业生产及辅助人员 鱼苗及鱼种场活动 农、林、牧、渔专业及辅助性活动
-销售人员 其他农牧产品批发 经营周转金
-农作物生产人员 蔬菜种植 蔬菜种植
-贸易经济代理人员 家具零售 购家具及家电
-餐饮服务人员 住宅装饰和装修 个人消费
-销售人员 酒、饮料及茶叶批发 茶叶销售
-不便分类的其他从业人员 农副食品加工专用设备制造 农副食品加工业
-采购人员 机动车燃油零售 购成品油
-其他办事人员 住宅房屋建筑 借新还旧
-水产养殖人员 海水养殖 海水养殖
-销售人员 其他室内装饰材料零售 周转性贷款
-住宿服务人员 其他农业 个人消费
-销售人员 酒、饮料及茶叶零售 经营茶叶
-婚姻服务人员 摄影扩印服务 个人经营
-农作物生产人员 住宅房屋建筑 购一手房
-电子元件制造人员 其他房地产业 一手房按揭
-销售人员 酒、饮料及茶叶零售 经营茶叶店资金周转
-企业负责人 综合零售 个人消费
-农作物生产人员 造林和更新 个人经营
-其他纺织品、服装和皮革、毛皮制品加工制作人员 毛巾类制品制造 加工一次性毛巾
-其他林业生产人员 造林和更新 经营毛竹林
-农作物生产人员 小麦种植 种植小麦
-其他农业生产人员 柑橘类种植 个人经营
-幼儿教育教师 学前教育 经营幼儿园
-销售人员 橡胶鞋制造 综合消费
-行政业务办理人员 零售业 零售业
-销售人员 酒、饮料及茶叶批发 经营家庭农场
-建筑工程技术人员 住宅房屋建筑 流动资金
-其他社会生产和生活服务人员 其他农业 个人消费
-作物种子(苗)繁育生产人员 其他食品零售 个人经营
-社会生产服务和生活服务人员 建筑物拆除活动 拆迁工程
-销售人员 住宅装饰和装修 装修等
-销售人员 零售业 零售业
-销售人员 互联网零售 购五金产品
-其他农业生产人员 其他渔业专业及辅助性活动 个人经营
-办事人员和有关人员 通讯设备批发 个人经营
-农、林、牧、渔业生产及辅助人员 电气安装 建筑安装业
-水产养殖人员 海水养殖 借新还旧
-农、林、牧、渔业生产及辅助人员 其他农业专业及辅助性活动 购买肥料
-教学人员 教育 教育
-销售人员 家具零售 经营流动资金
-水产养殖人员 小吃服务 经营小吃店
-专业化设计服务人员 其他居民服务业 经营工程机械生意
-商务咨询服务人员 其他居民服务业 经营周转
-商务咨询服务人员 社会经济咨询 经营周转
-其他农业生产人员 其他中药材种植 种仙草
-社会生产服务和生活服务人员 再生物资回收与批发 购废品
-美容美发和浴池服务人员 理发及美容服务 经营零售超市
-农、林、牧、渔业生产及辅助人员 互联网零售 经营电商
-销售人员 其他未列明餐饮业 经营周转
-餐饮服务人员 快餐服务 经营餐饮周转
-销售人员 摄影扩印服务 个人经营
-其他农业生产人员 其他农业 建烤房
-其他农业生产人员 其他农业 个人经营
-销售人员 住宅装饰和装修 房屋装修
-水产养殖人员 海水养殖 养殖鲍鱼
-生产制造及有关人员 零售业 零售业
-农业生产人员 五金零售 经营五金销售
-销售人员 零售业 零售业
-水产养殖人员 海水养殖 虾池养殖
-农作物生产人员 茶叶种植 个人经营
-其他批发与零售服务人员 计算机、软件及辅助设备批发 零售业
-其他农业生产人员 农业 农业
-行政业务办理人员 农业 农业
-其他社会生产和生活服务人员 房屋建筑业 房屋建筑业
-销售人员 鞋帽零售 支付进货款
-社会生产服务和生活服务人员 便利店零售 食杂店
-其他农业生产人员 烟草种植 种烟
-其他生产制造及有关人员 住宅装饰和装修 房屋装修
-行政事务处理人员 住宅装饰和装修 个人消费
-销售人员 珠宝首饰零售 购珠宝
-销售人员 果品、蔬菜零售 进货等
-销售人员 果品、蔬菜零售 进货等
-销售人员 果品、蔬菜零售 进货等
-销售人员 其他综合零售 个人经营
-餐饮服务人员 其他未列明信息技术服务业 用于经营周转
-餐饮服务人员 其他未列明信息技术服务业 经营周转

+ 0 - 22
agent/tests/test_feedback.py

@@ -1,22 +0,0 @@
-import requests
-import logging
-logging.basicConfig(level=logging.INFO, force=True,format='%(asctime)s - %(levelname)s - %(message)s')
-# user_id: str = Field(..., description="用户ID")
-#     user_nm: Optional[str] = Field(None, description="用户名称")
-#     feedback: str = Field(..., description="用户反馈,必填,agree/reject")
-#     feedback_result: Optional[str] = Field(None, description="反馈的标签结果")
-#     contract_no: str = Field(..., description="合同编号")
-#     user_org: Optional[str] = Field(None, description="用户所属机构")
-#     user_endpoint: Optional[str] = Field(None, description="用户所属网点")
-#     business_attr: str = Field(..., description="业务属性")
-res = requests.post("http://localhost:8080/api/aitag/v1/feedback", json={
-    "user_id": "12345",
-    "user_nm": "张三",
-    "feedback": "agree",
-    "contract_no": "HT-2024-001",
-    "user_org": "XX公司",
-    "user_endpoint": "XX网点",
-    "business_attr": "99c1c7bc976c45d0912e914a602d547f"
-})
-logging.info(res.text)
-

+ 1 - 1
agent/tests/test_generate_reg.py

@@ -1,6 +1,6 @@
 import requests
 res = requests.post("http://10.192.72.13:9876/api/aitag/admin/v1/generate_reg", json={
-    "id": "0196235AA24A459499057D0BA4AEC9BC"
+    "id": "2"
 })
 print(res.json())
 

+ 1 - 86
agent/tests/test_inner_api.py

@@ -1,92 +1,7 @@
 import requests
-ids = [
-"20260200001",
-"20260200002",
-"20260200003",
-"20260200004",
-"20260200005",
-"20260200006",
-"20260200007",
-"20260200008",
-"20260200009",
-"20260200010",
-"20260200011",
-"20260200012",
-"20260200013",
-"20260200014",
-"20260200015",
-"202602000016",
-"20260200017",  
-"20260200018",
-"20260200019",
-"20260200020",
-"20260200021",
-"20260200022",      
-"20260200023",
-"20260200024",
-"20260200025",
-"20260200026",
-"20260200027",
-"20260200028",
-"20260200029",   
-"20260200030",
-"20260200031",
-"20260200032",
-"20260200033",
-"20260200034",
-"20260200035",
-"20260200036",
-"20260200037",
-"20260200038",
-"20260200039",
-"20260200040",
-"20260200041",
-"20260200042",
-"20260200043",
-"20260200044",
-"20260200045",
-"20260200046",
-"20260200047",
-"20260200048",
-"20260200049",
-"20260200050",
-"20260200051",
-"20260200052",
-"20260200053",
-"20260200054",
-"20260200055",
-"20260200056",
-"20260200057",
-"20260200058",
-"20260200059",
-"20260200060",
-"20260200061",
-"20260200062",
-"20260200063",
-"20260200064",
-"20260200065",
-"20260200066",
-"20260200067",
-"20260200068",
-"20260200069",
-"20260200070",
-"20260200071",
-"20260200072",
-"20260200073",
-"20260200074",
-"20260200075",
-"20260200076",
-"20260200077",
-"20260200078",
-"20260200079",
-"20260200080",
-"20260200081",
-"20260200082",
-"20260200083"
-]
 
 res = requests.post("http://localhost:8080/api/aitag/admin/v1/synchronize_tag", json={
-    "tag_ids": ids
+    "tag_ids": ["2","3"]
 })
 print(res.json())
 

+ 14 - 0
agent/tests/test_outter_api.py

@@ -0,0 +1,14 @@
+import requests
+import logging
+logging.basicConfig(level=logging.INFO, force=True,format='%(asctime)s - %(levelname)s - %(message)s')
+logging.info("app starting!")
+
+res = requests.post("http://localhost:8080/api/aitag/v1/tagging", json={
+    # "app_id": "test_app",
+    # "timestamp": 1234567890,
+    # "sign": "test_sign",
+    "business_attr": "test_attr",
+    "phrase": "职业:务农;投向:水产养殖;用途:养螃蟹"
+})
+logging.info(res.text)
+

+ 0 - 4
agent/tests/test_query.py

@@ -1,4 +0,0 @@
-import requests
-
-result = requests.get("http://localhost:8080/api/aitag/v1/query?business_attr=d372684dbae64b3dadd33b631480d946")
-print(result.text)

+ 2 - 13
agent/tests/test_reg.py

@@ -1,19 +1,8 @@
 import re
 
 regstr = """
-^(?!.*(服装|纺织|食品|农业|医疗)).*(海洋.{0,6}(防护|防腐|防污|防附着|防渗透)|防护.{0,6}海洋|防腐.{0,6}(材料|涂料)|防污.{0,6}(材料|涂层)|船舶.{0,3}(防腐|防污)|海工.{0,3}(材料|防护))
+^(?!.*(服装|纺织|食品|农业|医疗))(海洋.{0,6}(防护|防腐|防污|防附着|防渗透)|防护.{0,6}海洋|防腐.{0,6}(材料|涂料)|防污.{0,6}(材料|涂层)|船舶.{0,3}(防腐|防污)|海工.{0,3}(材料|防护))
 """
 
-test_cases = [
-    "防腐材料",       
-    "海洋防污涂层",     
-    "船舶防腐",        
-    "职业:个体;投向:船体防腐;用途:海洋防污涂层", 
-    "材料",           
-    "医疗防护服",      
-]
 
-pattern = re.compile(regstr, re.VERBOSE)
-
-for t in test_cases:
-    print(f"{t!r}: {'✓' if pattern.match(t) else '✗'}")
+# re.search(regstr, phrase)

+ 0 - 14
agent/tests/test_tagging.py

@@ -1,14 +0,0 @@
-import requests
-import logging
-logging.basicConfig(level=logging.INFO, force=True,format='%(asctime)s - %(levelname)s - %(message)s')
-logging.info("app starting!")
-
-res = requests.post("http://localhost:8080/api/aitag/v1/tagging", json={
-    # "app_id": "test_app",
-    # "timestamp": 1234567890,
-    # "sign": "test_sign",
-    "business_attr": "test_attr",
-    "phrase": "职业:水产养殖人员 投向:海水养殖 用途:个人经营"
-})
-logging.info(res.text)
-

+ 0 - 25
agent/tests/test_tagging_batch.py

@@ -1,25 +0,0 @@
-import requests
-import logging
-import uuid
-logging.basicConfig(level=logging.INFO, force=True,format='%(asctime)s - %(levelname)s - %(message)s')
-logging.info("app starting!")
-
-#批量读取test_data.txt中的测试用例,并调用接口进行测试
-with open("tests/test_data.txt", "r", encoding="utf-8") as f:
-    for line in f:
-        phrase = line.strip().split(" ")
-        if len(phrase) < 2:
-            continue
-        if len(phrase) ==2:
-            phrase = "职业:"+phrase[0]+" "+"投向:"+phrase[1]
-        if len(phrase) == 3:
-            phrase = "职业:"+phrase[0]+" "+"投向:"+phrase[1]+" "+"用途:"+phrase[2]
-
-        logging.info("测试用例: "+phrase)
-        res = requests.post("http://localhost:8080/api/aitag/v1/tagging", json={
-            "business_attr": uuid.uuid4().hex,
-            "phrase": phrase
-        })
-        logging.info(res.text)
-
-

BIN
agent/服务接口定义.xlsx


+ 11 - 0
server/pom.xml

@@ -26,6 +26,17 @@
         <ojdbc8.version>19.3.0.0</ojdbc8.version>
         <dynamic.datasource.version>3.4.1</dynamic.datasource.version>
     </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.jsonwebtoken</groupId>
+                <artifactId>jjwt</artifactId>
+                <version>0.9.1</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
     <!-- 模块 -->
     <modules>
         <module>yusp-tagging-core</module>

+ 36 - 8
server/yusp-tagging-core/pom.xml

@@ -13,7 +13,12 @@
     <version>1.0.0-SNAPSHOT</version>
 
     <dependencies>
-
+        <!-- Spring Web MVC依赖 -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>5.3.33</version>
+        </dependency>
 
         <dependency>
             <groupId>cn.com.yusys.yusp.common</groupId>
@@ -164,13 +169,6 @@
             <version>3.4.5</version> <!-- 最后一个支持 Java 8 的版本 -->
             <scope>compile</scope>
         </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>easyexcel-core</artifactId>
-            <version>3.3.4</version>
-            <scope>compile</scope>
-        </dependency>
-
         <!-- AOP 模块  2.26新增 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -186,6 +184,36 @@
             <artifactId>aspectjrt</artifactId>
             <version>1.9.7</version>
         </dependency>
+
+        <!-- JWT支持 -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <!-- 用于JWT签名算法 -->
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+
+        <!-- Servlet API -->
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
+            <version>4.0.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.13</version>
+        </dependency>
+
+
     </dependencies>
 
     <dependencyManagement>

+ 33 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/annotation/RequireRole.java

@@ -0,0 +1,33 @@
+package cn.com.yusys.yusp.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 权限校验注解
+ * 用于控制接口访问权限
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Target({ElementType.METHOD, ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RequireRole {
+
+    /**
+     * 允许访问的角色数组
+     * 0: 客户经理
+     * 1: 标签管理人员
+     * 2: 业务管理员
+     * 3: 运维管理员
+     * 4: 测试管理员
+     */
+    String[] value() default {};
+
+    /**
+     * 是否需要登录(默认需要)
+     */
+    boolean requireLogin() default true;
+}

+ 34 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/aop/ApiLogAspect.java

@@ -3,6 +3,7 @@ package cn.com.yusys.yusp.aop;
 import cn.com.yusys.yusp.annotation.ApiOperationType;
 import cn.com.yusys.yusp.domain.entity.AitagApiLog;
 import cn.com.yusys.yusp.service.AitagApiLogService;
+import cn.com.yusys.yusp.util.AuthContextUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -10,6 +11,7 @@ import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Method;
@@ -22,6 +24,9 @@ public class ApiLogAspect {
     @Autowired
     private AitagApiLogService apiLogService;
 
+    @Value("${auth.enabled:false}")
+    private boolean authEnabled;
+
     @Around("@annotation(cn.com.yusys.yusp.annotation.ApiOperationType)")
     public Object logApiCall(ProceedingJoinPoint joinPoint) throws Throwable {
         long startTime = System.currentTimeMillis();
@@ -30,6 +35,9 @@ public class ApiLogAspect {
         apiLog.setId(apiLogService.generateLogId());
         apiLog.setCreateDate(new Date());
 
+        // 设置用户信息 - 根据认证状态决定
+        setUserInfo(apiLog);
+
         // 获取操作类型
         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
         Method method = signature.getMethod();
@@ -101,6 +109,32 @@ public class ApiLogAspect {
     }
 
     /**
+     * 设置用户信息
+     * @param apiLog API日志对象
+     */
+    private void setUserInfo(AitagApiLog apiLog) {
+        if (authEnabled) {
+            // 认证启用时,使用当前登录用户信息
+            String currentUserId = AuthContextUtil.getCurrentUser();
+            String currentUserName = AuthContextUtil.getCurrentUserName();
+
+            if (currentUserId != null) {
+                apiLog.setUserId(currentUserId);
+                // 如果有用户名就用用户名,否则用用户ID
+                apiLog.setUserName(currentUserName != null ? currentUserName : currentUserId);
+            } else {
+                // fallback到默认值
+                apiLog.setUserId("unknown");
+                apiLog.setUserName("unknown");
+            }
+        } else {
+            // 认证关闭时,使用固定测试值
+            apiLog.setUserId("testID");
+            apiLog.setUserName("testName");
+        }
+    }
+
+    /**
      * 隐藏敏感数据
      * @param jsonStr 原始JSON字符串
      * @return 隐藏敏感数据后的JSON字符串

+ 13 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/condition/AuthEnabledCondition.java

@@ -0,0 +1,13 @@
+package cn.com.yusys.yusp.condition;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+public class AuthEnabledCondition implements Condition {
+    @Override
+    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+        String authEnabled = context.getEnvironment().getProperty("auth.enabled");
+        return "true".equals(authEnabled);
+    }
+}

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

@@ -0,0 +1,190 @@
+package cn.com.yusys.yusp.config;
+
+import cn.com.yusys.yusp.annotation.RequireRole;
+import cn.com.yusys.yusp.condition.AuthEnabledCondition;
+import cn.com.yusys.yusp.domain.entity.AitagUser;
+import cn.com.yusys.yusp.mapper.AitagUserMapper;
+import cn.com.yusys.yusp.model.Result;
+import cn.com.yusys.yusp.util.AuthContextUtil;
+import cn.com.yusys.yusp.util.JwtUtil;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * 认证拦截器
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Slf4j
+@Component
+@Conditional(AuthEnabledCondition.class)
+public class AuthInterceptor implements HandlerInterceptor {
+
+    @Autowired
+    private JwtUtil jwtUtil;
+
+    @Autowired
+    private AitagUserMapper userMapper;
+
+    @Value("${auth.enabled:true}")
+    private boolean authEnabled;
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        // 如果认证功能未启用,直接放行
+        if (!authEnabled) {
+            log.debug("认证功能已关闭,放行请求: {}", request.getRequestURI());
+            return true;
+        }
+
+        // 只处理Controller方法
+        if (!(handler instanceof HandlerMethod)) {
+            return true;
+        }
+
+        HandlerMethod handlerMethod = (HandlerMethod) handler;
+        RequireRole requireRole = handlerMethod.getMethodAnnotation(RequireRole.class);
+
+        // 如果没有权限注解,直接放行
+        if (requireRole == null) {
+            requireRole = handlerMethod.getBeanType().getAnnotation(RequireRole.class);
+            if (requireRole == null) {
+                return true;
+            }
+        }
+
+        // 检查是否需要登录
+        if (!requireRole.requireLogin()) {
+            return true;
+        }
+
+        // 获取token
+        String token = getTokenFromRequest(request);
+        if (token == null || token.isEmpty()) {
+            log.warn("请求缺少认证token: {}", request.getRequestURI());
+            handleUnauthorized(response, "未提供认证信息");
+            return false;
+        }
+
+        // 验证token
+        if (!jwtUtil.validateToken(token)) {
+            log.warn("token验证失败: {}", request.getRequestURI());
+            handleUnauthorized(response, "认证信息无效或已过期");
+            return false;
+        }
+
+        // 获取用户信息
+        String userId = jwtUtil.getUserIdFromToken(token);
+        String role = jwtUtil.getRoleFromToken(token);
+
+        if (userId == null || role == null) {
+            log.warn("token中缺少必要的用户信息: {}", request.getRequestURI());
+            handleUnauthorized(response, "认证信息不完整");
+            return false;
+        }
+
+        // 获取完整的用户信息(包括用户名)
+        AitagUser user = userMapper.selectByUserId(userId);
+        if (user == null) {
+            log.warn("用户不存在: {}", userId);
+            handleUnauthorized(response, "用户信息不存在");
+            return false;
+        }
+
+        // 检查角色权限
+        String[] allowedRoles = requireRole.value();
+        if (allowedRoles.length > 0) {
+            boolean hasPermission = false;
+            for (String allowedRole : allowedRoles) {
+                if (allowedRole.equals(role)) {
+                    hasPermission = true;
+                    break;
+                }
+            }
+            if (!hasPermission) {
+                log.warn("用户{}角色{}无权访问: {}", userId, role, request.getRequestURI());
+                handleForbidden(response, "权限不足");
+                return false;
+            }
+        }
+
+        // 设置当前用户信息到上下文(包括用户名)
+        AuthContextUtil.setCurrentUser(userId);
+        AuthContextUtil.setCurrentRole(role);
+        AuthContextUtil.setCurrentUserName(user.getUserName()); // 新增:存储用户名
+
+        log.debug("用户{}认证通过,角色: {}, 用户名: {}, 访问: {}", userId, role, user.getUserName(), request.getRequestURI());
+        return true;
+    }
+
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        // 清除线程本地变量
+        AuthContextUtil.clear();
+    }
+
+    /**
+     * 从请求中获取token
+     *
+     * @param request HTTP请求
+     * @return token
+     */
+    private String getTokenFromRequest(HttpServletRequest request) {
+        // 优先从Header获取
+        String token = request.getHeader("Authorization");
+        if (token != null && token.startsWith("Bearer ")) {
+            return token.substring(7);
+        }
+
+        // 从参数获取
+        token = request.getParameter("token");
+        if (token != null) {
+            return token;
+        }
+
+        return null;
+    }
+
+    /**
+     * 处理未授权响应
+     *
+     * @param response HTTP响应
+     * @param message 错误消息
+     */
+    private void handleUnauthorized(HttpServletResponse response, String message) throws IOException {
+        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        response.setContentType("application/json;charset=UTF-8");
+        PrintWriter writer = response.getWriter();
+        Result<Void> result = Result.error("401", message);
+        writer.write(JSON.toJSONString(result));
+        writer.flush();
+    }
+
+    /**
+     * 处理禁止访问响应
+     *
+     * @param response HTTP响应
+     * @param message 错误消息
+     */
+    private void handleForbidden(HttpServletResponse response, String message) throws IOException {
+        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+        response.setContentType("application/json;charset=UTF-8");
+        PrintWriter writer = response.getWriter();
+        Result<Void> result = Result.error("403", message);
+        writer.write(JSON.toJSONString(result));
+        writer.flush();
+    }
+}

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

@@ -35,21 +35,6 @@ public class DataDictionary {
 
 
     /**
-     *标签启用	tag_enabled
-     * 标签停用	tag_disabled
-     * 标签删除	tag_deleted
-     * 标签未删除	tag_undeleted
-     */
-    public static final Integer TAG_ENABLED = 0;
-
-    public static final Integer TAG_DISABLED = 1;
-    public static final Integer TAG_DELETED = 1;
-
-    public static final Integer TAG_UNDELETED = 0;
-
-
-
-    /**
      *    统计值
      *        day:日
      *        week:周

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

@@ -0,0 +1,31 @@
+package cn.com.yusys.yusp.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "fastapi.service")
+public class FastApiConfig {
+
+    /**
+     * FastAPI服务地址
+     */
+    private String url;
+
+    /**
+     * 请求超时时间(毫秒)
+     */
+    private int timeout = 10000;
+
+    /**
+     * 连接超时时间(毫秒)
+     */
+    private int connectTimeout = 5000;
+
+    /**
+     * 读取超时时间(毫秒)
+     */
+    private int readTimeout = 10000;
+}

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

@@ -0,0 +1,40 @@
+package cn.com.yusys.yusp.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * Web MVC配置类
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Autowired(required = false)  // 改为可选注入,避免启动时报错
+    private AuthInterceptor authInterceptor;
+
+    @Value("${auth.enabled:false}")
+    private boolean authEnabled;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        // 只有当认证功能启用且拦截器存在时才注册
+        if (authEnabled && authInterceptor != null) {
+            registry.addInterceptor(authInterceptor)
+                    .addPathPatterns("/**")
+                    .excludePathPatterns(
+                            "/api/auth/login",
+                            "/api/auth/logout",
+                            "/health",
+                            "/swagger-ui/**",
+                            "/v2/api-docs",
+                            "/webjars/**"
+                    );
+        }
+    }
+}

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

@@ -1,5 +1,6 @@
 package cn.com.yusys.yusp.controller;
 
+import cn.com.yusys.yusp.annotation.RequireRole;
 import cn.com.yusys.yusp.model.Result;
 import cn.com.yusys.yusp.domain.dto.AitagAppCreateDto;
 import cn.com.yusys.yusp.domain.entity.AitagApp;
@@ -21,6 +22,7 @@ public class AitagAppController {
     private AitagAppService aiTagAppService;
 
     @ApiOperationType("应用列表一览")
+    @RequireRole({"1", "4"})
     @GetMapping("/list")
     public Result<List<AitagApp>> listApps(
             @RequestParam(defaultValue = "1") int page,

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

@@ -99,4 +99,17 @@ public class AitagTagCategoryController {
             return Result.error("500", "删除标签体系失败:" + e.getMessage());
         }
     }
+
+    @ApiOperationType("已启用标签体系列表一览")
+    @GetMapping("/enablelist")
+    public Result<List<AitagTagCategoryVo>> listEnabledCategories(
+            @RequestParam(defaultValue = "1") int page,
+            @RequestParam(defaultValue = "5") int size) {
+        try {
+            Page<AitagTagCategoryVo> pageResult = aiTagCategoryService.listEnabledCategories(page, size);
+            return Result.pageSuccess(pageResult.getRecords(), pageResult.getTotal());
+        } catch (Exception e) {
+            return Result.error("500", "分页查询失败:" + e.getMessage());
+        }
+    }
 }

+ 13 - 59
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagInfoController.java

@@ -1,15 +1,10 @@
 package cn.com.yusys.yusp.controller;
 
-import cn.com.yusys.yusp.commons.exception.BizException;
 import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
-import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
-import cn.com.yusys.yusp.domain.vo.TagNodeVo;
-import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
 import cn.com.yusys.yusp.service.AitagTagInfoService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,7 +17,6 @@ import org.springframework.web.bind.annotation.PathVariable;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 
@@ -30,7 +24,7 @@ import java.util.Map;
  * @author 2507040827
  * @date 2026-02-26 14:34:56
  */
-@Api(tags = "标签管理")
+@Api(tags = "")
 @RestController
 @RequestMapping("/api/aitagtaginfo")
 public class AitagTagInfoController {
@@ -47,41 +41,12 @@ public class AitagTagInfoController {
      * @param aitagTagInfoQueryVo
      * @return ResultDto
      */
-    @ApiOperation("列表标签分页信息")
-    @GetMapping("/page")
-    public ResultDto<List<AitagTagInfoEntity>> page(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        IPage<AitagTagInfoEntity> page = aitagTagInfoService.queryPage(aitagTagInfoQueryVo);
-        return ResultDto.success(page.getRecords()).total(page.getTotal());
-    }
-
-
-    /**
-     * 列表查询
-     *
-     * @param aitagTagInfoQueryVo
-     * @return ResultDto
-     */
-    @ApiOperation("标签列表查询")
+    @ApiOperation("列表查询")
     @GetMapping("/list")
     public ResultDto<List<AitagTagInfoEntity>> list(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        List<AitagTagInfoEntity> page = aitagTagInfoService.queryList(aitagTagInfoQueryVo);
-        return ResultDto.success(page);
-    }
+        IPage<AitagTagInfoEntity> page = aitagTagInfoService.queryPage(aitagTagInfoQueryVo);
 
-    /**
-     * 查询标签树
-     *
-     * @param aitagTagInfoQueryVo
-     * @return ResultDto
-     */
-    @ApiOperation("查询标签树")
-    @PostMapping("/queryTagTree")
-    public ResultDto<List<TagNodeVo>> queryTagTree(@RequestBody AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        if(StringUtils.isBlank(aitagTagInfoQueryVo.getCategoryId())){
-           throw BizException.of("E001");
-        }
-        List<TagNodeVo> tagNodeVos = aitagTagInfoService.queryTagTree(aitagTagInfoQueryVo);
-        return ResultDto.success(tagNodeVos);
+        return ResultDto.success(page.getRecords()).total(page.getTotal());
     }
 
     /**
@@ -92,8 +57,9 @@ public class AitagTagInfoController {
      */
     @ApiOperation("详细")
     @GetMapping("/info/{id}")
-    public ResultDto<TagInfoDto> info(@PathVariable("id") String id) {
-        TagInfoDto aitagTagInfo = aitagTagInfoService.getTagInfo(id);
+    public ResultDto<AitagTagInfoEntity> info(@PathVariable("id") String id) {
+        AitagTagInfoEntity aitagTagInfo = aitagTagInfoService.getById(id);
+
         return ResultDto.success(aitagTagInfo);
     }
 
@@ -106,7 +72,8 @@ public class AitagTagInfoController {
     @ApiOperation("保存")
     @PostMapping("/save")
     public ResultDto save(@RequestBody AitagTagInfoEntity aitagTagInfoEntity) {
-        aitagTagInfoService.saveTag(aitagTagInfoEntity);
+        aitagTagInfoService.save(aitagTagInfoEntity);
+
         return ResultDto.success();
     }
 
@@ -119,24 +86,11 @@ public class AitagTagInfoController {
     @ApiOperation("修改")
     @PostMapping("/update")
     public ResultDto update(@RequestBody AitagTagInfoEntity aitagTagInfoEntity) {
-        aitagTagInfoService.updateTag(aitagTagInfoEntity);
-        return ResultDto.success();
-    }
+        aitagTagInfoService.updateById(aitagTagInfoEntity);
 
-    /**
-     * 修改
-     *
-     * @param versionRollbackVo
-     * @return ResultDto
-     */
-    @ApiOperation("版本回溯")
-    @PostMapping("/versionRollback")
-    public ResultDto versionRollback(@RequestBody VersionRollbackVo versionRollbackVo) {
-        aitagTagInfoService.versionRollback(versionRollbackVo);
         return ResultDto.success();
     }
 
-
     /**
      * 删除
      *
@@ -145,9 +99,9 @@ public class AitagTagInfoController {
      */
     @ApiOperation("删除")
     @PostMapping("/delete")
-    public ResultDto delete(@RequestBody Map<String,List> ids) {
-        List<String> idsList = ids.get("ids");
-        aitagTagInfoService.removeTags(idsList);
+    public ResultDto delete(@RequestBody String[] ids) {
+        aitagTagInfoService.removeByIds(Arrays.asList(ids));
+
         return ResultDto.success();
     }
 

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

@@ -1,107 +0,0 @@
-package cn.com.yusys.yusp.controller;
-
-import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
-import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
-import cn.com.yusys.yusp.service.AitagTagInfoVersionService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-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 org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-@Api(tags = "标签信息版本表")
-@RestController
-@RequestMapping("/api/aitagtaginfoversion")
-public class AitagTagInfoVersionController {
-    /**
-     * AitagTagInfoVersionService
-     */
-    @Autowired
-    private AitagTagInfoVersionService aitagTagInfoVersionService;
-
-
-    /**
-     * 列表查询
-     *
-     * @param aitagTagInfoVersionQueryVo
-     * @return ResultDto
-     */
-    @ApiOperation("列表查询")
-    @GetMapping("/list")
-    public ResultDto<List<AitagTagInfoVersionEntity>> list(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo) {
-        IPage<AitagTagInfoVersionEntity> page = aitagTagInfoVersionService.queryPage(aitagTagInfoVersionQueryVo);
-
-        return ResultDto.success(page.getRecords()).total(page.getTotal());
-    }
-
-    /**
-     * 详细
-     *
-     * @param id
-     * @return ResultDto
-     */
-    @ApiOperation("详细")
-    @GetMapping("/info/{id}")
-    public ResultDto<AitagTagInfoVersionEntity> info(@PathVariable("id") String id) {
-        AitagTagInfoVersionEntity aitagTagInfoVersion = aitagTagInfoVersionService.getById(id);
-
-        return ResultDto.success(aitagTagInfoVersion);
-    }
-
-    /**
-     * 保存
-     *
-     * @param aitagTagInfoVersionEntity
-     * @return ResultDto
-     */
-    @ApiOperation("保存")
-    @PostMapping("/save")
-    public ResultDto save(@RequestBody AitagTagInfoVersionEntity aitagTagInfoVersionEntity) {
-        aitagTagInfoVersionService.save(aitagTagInfoVersionEntity);
-        return ResultDto.success();
-    }
-
-    /**
-     * 修改
-     *
-     * @param aitagTagInfoVersionEntity
-     * @return ResultDto
-     */
-    @ApiOperation("修改")
-    @PostMapping("/update")
-    public ResultDto update(@RequestBody AitagTagInfoVersionEntity aitagTagInfoVersionEntity) {
-        aitagTagInfoVersionService.updateById(aitagTagInfoVersionEntity);
-
-        return ResultDto.success();
-    }
-
-    /**
-     * 删除
-     *
-     * @param ids
-     * @return ResultDto
-     */
-    @ApiOperation("删除")
-    @PostMapping("/delete")
-    public ResultDto delete(@RequestBody String[] ids) {
-        aitagTagInfoVersionService.removeByIds(Arrays.asList(ids));
-
-        return ResultDto.success();
-    }
-
-}

+ 22 - 68
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/controller/AitagTagLogController.java

@@ -1,28 +1,20 @@
 package cn.com.yusys.yusp.controller;
 
+import cn.com.yusys.yusp.annotation.ApiOperationType;
 import cn.com.yusys.yusp.commons.module.adapter.web.rest.ResultDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import cn.com.yusys.yusp.domain.vo.*;
 import cn.com.yusys.yusp.service.AitagTagLogService;
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+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.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-
-import static cn.com.yusys.yusp.config.DataDictionary.FEEDBACK_RESULT_REJECT;
 
 /**
  * 
@@ -42,12 +34,12 @@ public class AitagTagLogController {
 
 
     /**
-     * 我的配置
+     * 数据概览
      *
      * @param taggingResult 智能打标结果
      * @return ResultDto
      */
-    @ApiOperation("我的配置")
+    @ApiOperationType("数据概览")
     @PostMapping("/dataOverview")
     public ResultDto<DataOverviewVo> dataOverview(@RequestBody SmartTaggingResultVo taggingResult) {
         DataOverviewVo dataOverviewDTO = aitagTagLogService.dataOverview(taggingResult);
@@ -62,7 +54,7 @@ public class AitagTagLogController {
      * @param taggingTrendReq 打标趋势
      * @return ResultDto
      */
-    @ApiOperation("打标趋势")
+    @ApiOperationType("打标趋势")
     @PostMapping("/taggingTrend")
     public ResultDto<List<IconResVo>> taggingTrend(@RequestBody TaggingTrendReqVo taggingTrendReq) {
         List<IconResVo> taggingTrendRes = aitagTagLogService.taggingTrend(taggingTrendReq);
@@ -75,7 +67,7 @@ public class AitagTagLogController {
      * @param resultDTO 智能打标结果
      * @return ResultDto
      */
-    @ApiOperation("标签分布统计")
+    @ApiOperationType("标签分布统计")
     @PostMapping("/tagDistStats")
     public ResultDto<List<IconResVo>> tagDistStats(@RequestBody TagDistStatsReqVo resultDTO) {
         List<IconResVo> taggingTrendRes = aitagTagLogService.tagDistStats(resultDTO);
@@ -89,11 +81,11 @@ public class AitagTagLogController {
      * @param transactionReqVo
      * @return ResultDto
      */
-    @ApiOperation("打标明细")
+    @ApiOperationType("打标明细")
     @PostMapping("/taggingTransaction")
     public ResultDto<IPage<AitagTagLogEntity>> taggingTransaction(@RequestBody TaggingTransactionReqVo transactionReqVo) {
         IPage<AitagTagLogEntity> page = aitagTagLogService.taggingDetails(transactionReqVo);
-        return ResultDto.success(page.getRecords()).total(page.getTotal());
+        return ResultDto.success(page);
     }
 
     /**
@@ -102,63 +94,25 @@ public class AitagTagLogController {
      * @param id
      * @return ResultDto
      */
-    @ApiOperation("打标结果详情")
-    @GetMapping("/show/{id}")
-    public ResultDto<AitagTagLogEntity> show(@PathVariable("id") String id) {
+    @ApiOperationType("打标结果详情")
+    @PostMapping("/show")
+    public ResultDto<AitagTagLogEntity> show(@RequestBody String id) {
         AitagTagLogEntity taggingDetailsResDTO = aitagTagLogService.show(id);
         return ResultDto.success(taggingDetailsResDTO);
     }
 
     /**
-     * 导出数据
+     * 删除
      *
-     * @param transactionReqVo
+     * @param ids
      * @return ResultDto
      */
-    @ApiOperation("导出数据")
-    @PostMapping("/exportData")
-    public void exportData(@RequestBody TaggingTransactionReqVo transactionReqVo,HttpServletResponse response) throws IOException {
-        List<AitagTagLogEntity> aitagTagLogEntities = aitagTagLogService.queryList(transactionReqVo);
-        List<ExportDataVo> exportDataVos = new ArrayList<>();
-        for (AitagTagLogEntity aitagTagLog:aitagTagLogEntities) {
-            ExportDataVo exportDataVo = JSONObject.parseObject(JSONObject.toJSONString(aitagTagLog), ExportDataVo.class);
-            if(FEEDBACK_RESULT_REJECT.equals(aitagTagLog.getFeedback())){
-                String feedbackResult = aitagTagLog.getFeedbackResult();
-                exportDataVo.setResult(getTags(feedbackResult));
-            }else{
-                String result = aitagTagLog.getResult();
-                exportDataVo.setResult(getTags(result));
-            }
-            exportDataVos.add(exportDataVo);
-        }
-        // 2. 设置响应头(防止中文乱码)
-        response.reset();
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-        response.setCharacterEncoding("utf-8");
-        String fileName = URLEncoder.encode("导出标签", "UTF-8").replaceAll("\\+", "%20");
-        response.setHeader("Content-Disposition", "attachment; filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), ExportDataVo.class)
-                .sheet("标签数据")
-                .doWrite(exportDataVos);
-    }
+    @ApiOperationType("打标结果删除")
+    @PostMapping("/delete")
+    public ResultDto delete(@RequestBody String[] ids) {
+        aitagTagLogService.removeByIds(Arrays.asList(ids));
 
-
-    private String getTags(String result) {
-        if(StringUtils.isBlank(result)){
-            return "";
-        }
-        List<Map> results = JSONArray.parseArray(result, Map.class);
-        StringBuilder stringBuilder = new StringBuilder();
-        for (int i = 0 ;i<results.size();i++){
-            Map resultMap = results.get(i);
-            String tagName = resultMap.getOrDefault("tag_name","").toString();
-            stringBuilder.append(tagName);
-            if(i < (results.size()-1) ){
-                stringBuilder.append(",");
-            }
-        }
-        return stringBuilder.toString();
+        return ResultDto.success();
     }
 
-
 }

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

@@ -0,0 +1,153 @@
+package cn.com.yusys.yusp.controller;
+
+import cn.com.yusys.yusp.annotation.ApiOperationType;
+import cn.com.yusys.yusp.condition.AuthEnabledCondition;
+import cn.com.yusys.yusp.model.Result;
+import cn.com.yusys.yusp.domain.dto.LoginRequestDto;
+import cn.com.yusys.yusp.domain.vo.LoginResponseVo;
+import cn.com.yusys.yusp.service.AuthService;
+import cn.com.yusys.yusp.util.AuthContextUtil;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 认证控制器
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Slf4j
+@Api(tags = "认证管理")
+@RestController
+@RequestMapping("/api/auth")
+@Conditional(AuthEnabledCondition.class)
+public class AitagUserController {
+
+    @Autowired
+    private AuthService authService;
+
+    @Value("${auth.enabled:true}")
+    private boolean authEnabled;
+
+    /**
+     * 用户登录
+     *
+     * @param loginRequest 登录请求
+     * @return 登录结果
+     */
+    @ApiOperationType("用户登录")
+    @PostMapping("/login")
+    public Result<LoginResponseVo> login(@Valid @RequestBody LoginRequestDto loginRequest) {
+        try {
+            log.info("收到登录请求: {}", loginRequest.getUserId());
+
+            if (!authEnabled) {
+                log.warn("认证功能已关闭,但仍允许登录");
+            }
+
+            LoginResponseVo response = authService.login(loginRequest);
+            return Result.success(response);
+        } catch (Exception e) {
+            log.error("登录失败", e);
+            return Result.error("500", "登录失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 用户登出
+     *
+     * @return 登出结果
+     */
+    @ApiOperationType("用户登出")
+    @PostMapping("/logout")
+    public Result<Void> logout() {
+        try {
+            String currentUserId = AuthContextUtil.getCurrentUser();
+            if (currentUserId != null) {
+                authService.logout(currentUserId);
+                log.info("用户登出成功: {}", currentUserId);
+            }
+            return Result.success();
+        } catch (Exception e) {
+            log.error("登出失败", e);
+            return Result.error("500", "登出失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 获取当前用户信息
+     *
+     * @return 用户信息
+     */
+    @ApiOperationType("获取当前用户信息")
+    @GetMapping("/current-user")
+    public Result<Object> getCurrentUser() {
+        try {
+            String userId = AuthContextUtil.getCurrentUser();
+            String role = AuthContextUtil.getCurrentRole();
+
+            if (userId == null) {
+                return Result.error("401", "未登录");
+            }
+
+            return Result.success(new CurrentUserInfo(userId, role));
+        } catch (Exception e) {
+            log.error("获取当前用户信息失败", e);
+            return Result.error("500", "获取用户信息失败: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 检查认证状态
+     *
+     * @return 认证状态
+     */
+    @ApiOperationType("检查认证状态")
+    @GetMapping("/status")
+    public Result<AuthStatusVo> getStatus() {
+        AuthStatusVo status = new AuthStatusVo();
+        status.setEnabled(authEnabled);
+        status.setCurrentUser(AuthContextUtil.getCurrentUser());
+        status.setCurrentRole(AuthContextUtil.getCurrentRole());
+        return Result.success(status);
+    }
+
+    /**
+     * 当前用户信息内部类
+     */
+    private static class CurrentUserInfo {
+        private String userId;
+        private String role;
+
+        public CurrentUserInfo(String userId, String role) {
+            this.userId = userId;
+            this.role = role;
+        }
+
+        public String getUserId() { return userId; }
+        public String getRole() { return role; }
+    }
+
+    /**
+     * 认证状态VO
+     */
+    private static class AuthStatusVo {
+        private boolean enabled;
+        private String currentUser;
+        private String currentRole;
+
+        // Getters and setters
+        public boolean isEnabled() { return enabled; }
+        public void setEnabled(boolean enabled) { this.enabled = enabled; }
+        public String getCurrentUser() { return currentUser; }
+        public void setCurrentUser(String currentUser) { this.currentUser = currentUser; }
+        public String getCurrentRole() { return currentRole; }
+        public void setCurrentRole(String currentRole) { this.currentRole = currentRole; }
+    }
+}

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

@@ -0,0 +1,105 @@
+package cn.com.yusys.yusp.controller;
+
+import cn.com.yusys.yusp.annotation.ApiOperationType;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingFeedbackRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingQueryRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingRequestDto;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingQueryResponseVo;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingResponseVo;
+import cn.com.yusys.yusp.model.Result;
+import cn.com.yusys.yusp.service.FastApiService;
+import cn.com.yusys.yusp.util.AuthContextUtil;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@Slf4j
+@Api(tags = "AI打标接口")
+@RestController
+@RequestMapping("/api/fastapi")
+public class FastApiController {
+
+    @Autowired
+    private FastApiService fastApiService;
+
+    @ApiOperationType("AI打标")
+    @PostMapping("/tagging")
+    public Result<AiTaggingResponseVo> tagging(@RequestBody AiTaggingRequestDto request) {
+        try {
+            log.info("收到AI打标请求: appId={}, businessAttr={}", request.getAppId(), request.getBusinessAttr());
+            AiTaggingResponseVo response = fastApiService.tagging(request);
+            return Result.success(response);
+        } catch (Exception e) {
+            log.error("AI打标接口调用失败", e);
+            return Result.error("500", "AI打标接口调用失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperationType("AI打标查询")
+    @GetMapping("/query")
+    public Result<AiTaggingQueryResponseVo> query(
+            @RequestParam(required = false) String appId,
+            @RequestParam(required = false) String timestamp,
+            @RequestParam(required = false) String sign,
+            @Valid @RequestParam String businessAttr) {
+        try {
+            log.info("收到AI打标查询请求: appId={}, businessAttr={}", appId, businessAttr);
+
+            AiTaggingQueryRequestDto request = new AiTaggingQueryRequestDto();
+            request.setAppId(appId);
+            request.setTimestamp(timestamp);
+            request.setSign(sign);
+            request.setBusinessAttr(businessAttr);
+
+            AiTaggingQueryResponseVo response = fastApiService.query(request);
+            return Result.success(response);
+        } catch (Exception e) {
+            log.error("AI打标查询接口调用失败", e);
+            return Result.error("500", "AI打标查询接口调用失败: " + e.getMessage());
+        }
+    }
+
+    @ApiOperationType("AI打标反馈")
+    @GetMapping("/feedback")
+    public Result<AiTaggingResponseVo> feedback(
+            @RequestParam(required = false) String userId,
+            @RequestParam(required = false) String userNm,
+            @RequestParam(required = true) String feedback,
+            @RequestParam(required = false) String contractNo,
+            @RequestParam(required = false) String userOrg,
+            @RequestParam(required = false) String userEndpoint,
+            @RequestParam(required = true) String businessAttr) {
+        try {
+            log.info("收到AI打标反馈请求: userId={}, businessAttr={}, feedback={}", userId, businessAttr, feedback);
+
+            AiTaggingFeedbackRequestDto request = new AiTaggingFeedbackRequestDto();
+
+            // 设置用户信息 - 优先使用登录信息,否则使用默认值
+            String currentUserId = AuthContextUtil.getCurrentUser();
+            String currentUserName = AuthContextUtil.getCurrentUserName();
+
+            if (currentUserId != null && currentUserName != null) {
+                request.setUserId(currentUserId);
+                request.setUserNm(currentUserName);
+            } else {
+                request.setUserId(userId != null ? userId : "无登录测试ID");
+                request.setUserNm(userNm != null ? userNm : "无登录测试");
+            }
+
+            request.setFeedback(feedback);
+            request.setContractNo(contractNo);
+            request.setUserOrg(userOrg);
+            request.setUserEndpoint(userEndpoint);
+            request.setBusinessAttr(businessAttr);
+
+            AiTaggingResponseVo response = fastApiService.feedback(request);
+            return Result.success(response);
+        } catch (Exception e) {
+            log.error("AI打标反馈接口调用失败", e);
+            return Result.error("500", "AI打标反馈接口调用失败: " + e.getMessage());
+        }
+    }
+}

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

@@ -0,0 +1,26 @@
+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;
+
+/**
+ * 登录请求DTO
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Data
+@ApiModel("登录请求")
+public class LoginRequestDto {
+
+    @NotBlank(message = "用户ID不能为空")
+    @ApiModelProperty(value = "用户ID", required = true)
+    private String userId;
+
+    @NotBlank(message = "密码不能为空")
+    @ApiModelProperty(value = "密码", required = true)
+    private String password;
+}

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

@@ -1,114 +0,0 @@
-package cn.com.yusys.yusp.domain.dto;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-
-/**
- * 
- *标签详情信息
- * @author 2507040827
- * @date 2026-02-26 14:34:56
- */
-@Data
-public class TagInfoDto {
-
-    /**
-     * id
-     **/
-    @ApiModelProperty(value="id")
-    private String id;
-
-    /**
-     * 所属大类
-     **/
-    @ApiModelProperty(value = "所属大类")
-    private String categoryId;
-
-    /**
-     * 标签名称
-     **/
-    @ApiModelProperty(value = "标签名称")
-    private String tagNm;
-
-    /**
-     * 标签代码
-     **/
-    @ApiModelProperty(value = "标签代码")
-    private String tagCode;
-
-    /**
-     * 标签备注
-     **/
-    @ApiModelProperty(value = "标签备注")
-    private String tagRemark;
-
-    /**
-     * 父级ID
-     **/
-    @ApiModelProperty(value = "父级ID")
-    private String parentId;
-
-    /**
-     * 标签规则
-     **/
-    @ApiModelProperty(value = "标签规则")
-    private String reg;
-
-    /**
-     * 标签等级
-     **/
-    @ApiModelProperty(value = "标签等级")
-    private Integer level;
-
-    /**
-     * tag1/tag2/tag3/...
-     **/
-    @ApiModelProperty(value = "tag1/tag2/tag3/...")
-    private String tagPath;
-
-
-    /**
-     * 标签提示词
-     **/
-    @ApiModelProperty(value = "标签提示词")
-    private String tagPrompt;
-
-
-    /**
-     * 标签版本
-     **/
-    @ApiModelProperty(value = "标签版本")
-    private String tagVersion;
-
-    /**
-     * 修订时间
-     **/
-    @ApiModelProperty(value = "修订时间")
-    private String revisionTime;
-
-    /**
-     * 修订人
-     **/
-    @ApiModelProperty(value = "修订人")
-    private String reviser;
-
-
-    /**
-     * 标签历史版本信息
-     */
-    @ApiModelProperty(value = "标签历史版本信息")
-    private List<TagInfoVersionDto> tagInfoVersionDtos;
-
-
-    public String getTagVersionShow() {
-        return "版本V"+tagVersion;
-    }
-
-}

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

@@ -1,114 +0,0 @@
-package cn.com.yusys.yusp.domain.dto;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-
-/**
- * 标签信息版本详情信息
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-@Data
-public class TagInfoVersionDto {
-
-    /**
-     * id
-     **/
-    @ApiModelProperty(value="id")
-    @TableId(type=IdType.UUID)
-    private String id;
-
-    /**
-     * 所属大类
-     **/
-    @ApiModelProperty(value = "所属大类")
-    private String categoryId;
-
-    /**
-     * 标签名称
-     **/
-    @ApiModelProperty(value = "标签名称")
-    private String tagNm;
-
-    /**
-     * 标签代码
-     **/
-    @ApiModelProperty(value = "标签代码")
-    private String tagCode;
-
-    /**
-     * 标签备注
-     **/
-    @ApiModelProperty(value = "标签备注")
-    private String tagRemark;
-
-    /**
-     * 父级ID
-     **/
-    @ApiModelProperty(value = "父级ID")
-    private String parentId;
-
-    /**
-     * 标签规则
-     **/
-    @ApiModelProperty(value = "标签规则")
-    private String reg;
-
-    /**
-     * 标签等级
-     **/
-    @ApiModelProperty(value = "标签等级")
-    private Integer level;
-
-    /**
-     * tag1/tag2/tag3/...
-     **/
-    @ApiModelProperty(value = "tag1/tag2/tag3/...")
-    private String tagPath;
-
-    /**
-     * 0未删除;1删除
-     **/
-    @ApiModelProperty(value = "0未删除;1删除")
-    private Integer isDelete;
-
-    /**
-     * 0 正常;1 停用
-     **/
-    @ApiModelProperty(value = "0 正常;1 停用")
-    private Integer state;
-
-    /**
-     * 标签提示词
-     **/
-    @ApiModelProperty(value = "标签提示词")
-    private String tagPrompt;
-
-    /**
-     * 标签版本
-     **/
-    @ApiModelProperty(value = "标签版本")
-    private String tagVersion;
-
-    /**
-     * 修订时间
-     **/
-    @ApiModelProperty(value = "修订时间")
-    private String revisionTime;
-
-    /**
-     * 修订人
-     **/
-    @ApiModelProperty(value = "修订人")
-    private String reviser;
-
-    public String getTagVersionShow() {
-        return "版本V"+tagVersion;
-    }
-}

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

@@ -0,0 +1,20 @@
+package cn.com.yusys.yusp.domain.dto;
+
+
+import lombok.Data;
+
+@Data
+public class TagSumDto {
+
+
+    /**
+     * 总打标数
+     */
+    private Integer totalCount;
+
+
+    /**
+     * 总时长
+     */
+    private Integer totalDuration = 0;
+}

+ 35 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingFeedbackRequestDto.java

@@ -0,0 +1,35 @@
+package cn.com.yusys.yusp.domain.dto.fastapidto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("AI打标反馈请求")
+public class AiTaggingFeedbackRequestDto {
+
+    @ApiModelProperty(value = "用户ID", required = false)
+    private String userId;
+
+    @ApiModelProperty(value = "用户姓名", required = false)
+    private String userNm;
+
+    @NotBlank(message = "反馈结果不能为空")
+    @ApiModelProperty(value = "反馈结果(agree/reject)", required = true)
+    private String feedback;
+
+    @ApiModelProperty(value = "合同编号", required = false)
+    private String contractNo;
+
+    @ApiModelProperty(value = "用户机构", required = false)
+    private String userOrg;
+
+    @ApiModelProperty(value = "用户终端", required = false)
+    private String userEndpoint;
+
+    @NotBlank(message = "业务属性不能为空")
+    @ApiModelProperty(value = "业务属性", required = true)
+    private String businessAttr;
+}

+ 23 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingQueryRequestDto.java

@@ -0,0 +1,23 @@
+
+package cn.com.yusys.yusp.domain.dto.fastapidto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("AI打标查询请求")
+public class AiTaggingQueryRequestDto {
+
+    @ApiModelProperty(value = "后台分配的APPID", required = false)
+    private String appId;
+
+    @ApiModelProperty(value = "时间戳", required = false)
+    private String timestamp;
+
+    @ApiModelProperty(value = "签名", required = false)
+    private String sign;
+
+    @ApiModelProperty(value = "业务属性", required = true)
+    private String businessAttr;
+}

+ 32 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/dto/fastapidto/AiTaggingRequestDto.java

@@ -0,0 +1,32 @@
+package cn.com.yusys.yusp.domain.dto.fastapidto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("AI打标请求")
+public class AiTaggingRequestDto {
+
+    @NotBlank(message = "appId不能为空")
+    @ApiModelProperty(value = "后台分配的APPID", required = true)
+    private String appId;
+
+    @NotBlank(message = "时间戳不能为空")
+    @ApiModelProperty(value = "时间戳", required = true)
+    private String timestamp;
+
+    @NotBlank(message = "签名不能为空")
+    @ApiModelProperty(value = "签名", required = true)
+    private String sign;
+
+    @NotBlank(message = "业务属性不能为空")
+    @ApiModelProperty(value = "业务属性", required = true)
+    private String businessAttr;
+
+    @NotBlank(message = "投向+用途+职业不能为空")
+    @ApiModelProperty(value = "投向+用途+职业", required = true)
+    private String phrase;
+}

+ 95 - 20
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/entity/AitagTagInfoEntity.java

@@ -5,18 +5,16 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.IdType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
 
 
 /**
  * 
- *标签信息表
+ *
  * @author 2507040827
  * @date 2026-02-26 14:34:56
  */
 @TableName("aitag_tag_info")
-@ApiModel(value = "AitagTagInfoEntity", description = "标签信息表")
-@Data
+@ApiModel(value = "AitagTagInfoEntity", description = "")
 public class AitagTagInfoEntity {
 
     /**
@@ -54,7 +52,7 @@ public class AitagTagInfoEntity {
      * 父级ID
      **/
     @ApiModelProperty(value = "父级ID")
-    private String parentId;
+    private String parentCode;
 
     /**
      * 标签规则
@@ -93,23 +91,100 @@ public class AitagTagInfoEntity {
     private String tagPrompt;
 
 
-    /**
-     * 标签版本
-     **/
-    @ApiModelProperty(value = "标签版本")
-    private String tagVersion;
+    public String getId() {
+        return this.id;
+    }
 
-    /**
-     * 修订时间
-     **/
-    @ApiModelProperty(value = "修订时间")
-    private String revisionTime;
+    public void setId(String id) {
+        this.id = id;
+    }
 
-    /**
-     * 修订人
-     **/
-    @ApiModelProperty(value = "修订人")
-    private String reviser;
+    public String getCategoryId() {
+        return this.categoryId;
+    }
+
+    public void setCategoryId(String categoryId) {
+        this.categoryId = categoryId;
+    }
+
+    public String getTagNm() {
+        return this.tagNm;
+    }
+
+    public void setTagNm(String tagNm) {
+        this.tagNm = tagNm;
+    }
+
+    public String getTagCode() {
+        return this.tagCode;
+    }
+
+    public void setTagCode(String tagCode) {
+        this.tagCode = tagCode;
+    }
+
+    public String getTagRemark() {
+        return this.tagRemark;
+    }
+
+    public void setTagRemark(String tagRemark) {
+        this.tagRemark = tagRemark;
+    }
+
+    public String getParentCode() {
+        return this.parentCode;
+    }
+
+    public void setParentCode(String parentCode) {
+        this.parentCode = parentCode;
+    }
+
+    public String getReg() {
+        return this.reg;
+    }
+
+    public void setReg(String reg) {
+        this.reg = reg;
+    }
+
+    public Integer getLevel() {
+        return this.level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public String getTagPath() {
+        return this.tagPath;
+    }
+
+    public void setTagPath(String tagPath) {
+        this.tagPath = tagPath;
+    }
+
+    public Integer getIsDelete() {
+        return this.isDelete;
+    }
+
+    public void setIsDelete(Integer isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    public Integer getState() {
+        return this.state;
+    }
+
+    public void setState(Integer state) {
+        this.state = state;
+    }
+
+    public String getTagPrompt() {
+        return this.tagPrompt;
+    }
 
+    public void setTagPrompt(String tagPrompt) {
+        this.tagPrompt = tagPrompt;
+    }
 
 }

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

@@ -1,232 +0,0 @@
-package cn.com.yusys.yusp.domain.entity;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.IdType;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-@TableName("aitag_tag_info_version")
-@ApiModel(value = "AitagTagInfoVersionEntity", description = "标签信息版本表")
-public class AitagTagInfoVersionEntity {
-
-    /**
-     * id
-     **/
-    @ApiModelProperty(value="id")
-    @TableId(type=IdType.UUID)
-    private String id;
-
-    /**
-     * 所属大类
-     **/
-    @ApiModelProperty(value = "所属大类")
-    private String categoryId;
-
-    /**
-     * 标签名称
-     **/
-    @ApiModelProperty(value = "标签名称")
-    private String tagNm;
-
-    /**
-     * 标签代码
-     **/
-    @ApiModelProperty(value = "标签代码")
-    private String tagCode;
-
-    /**
-     * 标签备注
-     **/
-    @ApiModelProperty(value = "标签备注")
-    private String tagRemark;
-
-    /**
-     * 父级ID
-     **/
-    @ApiModelProperty(value = "父级ID")
-    private String parentId;
-
-    /**
-     * 标签规则
-     **/
-    @ApiModelProperty(value = "标签规则")
-    private String reg;
-
-    /**
-     * 标签等级
-     **/
-    @ApiModelProperty(value = "标签等级")
-    private Integer level;
-
-    /**
-     * tag1/tag2/tag3/...
-     **/
-    @ApiModelProperty(value = "tag1/tag2/tag3/...")
-    private String tagPath;
-
-    /**
-     * 0未删除;1删除
-     **/
-    @ApiModelProperty(value = "0未删除;1删除")
-    private Integer isDelete;
-
-    /**
-     * 0 正常;1 停用
-     **/
-    @ApiModelProperty(value = "0 正常;1 停用")
-    private Integer state;
-
-    /**
-     * 标签提示词
-     **/
-    @ApiModelProperty(value = "标签提示词")
-    private String tagPrompt;
-
-    /**
-     * 标签版本
-     **/
-    @ApiModelProperty(value = "标签版本")
-    private String tagVersion;
-
-    /**
-     * 修订时间
-     **/
-    @ApiModelProperty(value = "修订时间")
-    private String revisionTime;
-
-    /**
-     * 修订人
-     **/
-    @ApiModelProperty(value = "修订人")
-    private String reviser;
-
-
-    public String getId() {
-        return this.id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCategoryId() {
-        return this.categoryId;
-    }
-
-    public void setCategoryId(String categoryId) {
-        this.categoryId = categoryId;
-    }
-
-    public String getTagNm() {
-        return this.tagNm;
-    }
-
-    public void setTagNm(String tagNm) {
-        this.tagNm = tagNm;
-    }
-
-    public String getTagCode() {
-        return this.tagCode;
-    }
-
-    public void setTagCode(String tagCode) {
-        this.tagCode = tagCode;
-    }
-
-    public String getTagRemark() {
-        return this.tagRemark;
-    }
-
-    public void setTagRemark(String tagRemark) {
-        this.tagRemark = tagRemark;
-    }
-
-    public String getparentId() {
-        return this.parentId;
-    }
-
-    public void setparentId(String parentId) {
-        this.parentId = parentId;
-    }
-
-    public String getReg() {
-        return this.reg;
-    }
-
-    public void setReg(String reg) {
-        this.reg = reg;
-    }
-
-    public Integer getLevel() {
-        return this.level;
-    }
-
-    public void setLevel(Integer level) {
-        this.level = level;
-    }
-
-    public String getTagPath() {
-        return this.tagPath;
-    }
-
-    public void setTagPath(String tagPath) {
-        this.tagPath = tagPath;
-    }
-
-    public Integer getIsDelete() {
-        return this.isDelete;
-    }
-
-    public void setIsDelete(Integer isDelete) {
-        this.isDelete = isDelete;
-    }
-
-    public Integer getState() {
-        return this.state;
-    }
-
-    public void setState(Integer state) {
-        this.state = state;
-    }
-
-    public String getTagPrompt() {
-        return this.tagPrompt;
-    }
-
-    public void setTagPrompt(String tagPrompt) {
-        this.tagPrompt = tagPrompt;
-    }
-
-    public String getTagVersion() {
-        return this.tagVersion;
-    }
-
-    public void setTagVersion(String tagVersion) {
-        this.tagVersion = tagVersion;
-    }
-
-    public String getRevisionTime() {
-        return this.revisionTime;
-    }
-
-    public void setRevisionTime(String revisionTime) {
-        this.revisionTime = revisionTime;
-    }
-
-    public String getReviser() {
-        return this.reviser;
-    }
-
-    public void setReviser(String reviser) {
-        this.reviser = reviser;
-    }
-
-}

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

@@ -132,29 +132,4 @@ passr: true/false
     @ApiModelProperty(value = "标签类别")
     private String categoryCode;
 
-    /**
-     * 合同编号
-     **/
-    @ApiModelProperty(value = "合同编号")
-    private String contractNo;
-
-
-
-    /**
-     * 正则过滤结果
-     **/
-    @ApiModelProperty(value = "正则过滤结果")
-    private String regResult;
-
-    /**
-     * 法人机构
-     **/
-    @ApiModelProperty(value = "法人机构")
-    private String feedbackUserOrg;
-
-    /**
-     * 网点
-     **/
-    @ApiModelProperty(value = "网点")
-    private String feedbackUserEndpoint;
 }

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

@@ -0,0 +1,57 @@
+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 lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* 
+* @TableName aitag_user
+*/
+@Data
+public class AitagUser 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 userId;
+    /**
+    * 登陆密码
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("登陆密码")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String password;
+    /**
+    * 用户名称
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("用户名称")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String userName;
+    /**
+    * 角色权限(0客户经理,1标签管理人员,2业务管理员,3运维管理员,4测试管理员)
+    */
+    @Size(max= 100,message="编码长度不能超过100")
+    @ApiModelProperty("角色权限(0客户经理,1标签管理人员,2业务管理员,3运维管理员,4测试管理员)")
+    @Length(max= 100,message="编码长度不能超过100")
+    private String role;
+
+}

+ 5 - 5
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoQueryVo.java

@@ -39,7 +39,7 @@ public class AitagTagInfoQueryVo extends PageQuery {
     /**
      * 父级ID
      **/
-    private String parentId;
+    private String parentCode;
 
     /**
      * 标签规则
@@ -112,12 +112,12 @@ public class AitagTagInfoQueryVo extends PageQuery {
         this.tagRemark = tagRemark;
     }
 
-    public String getparentId() {
-        return this.parentId;
+    public String getParentCode() {
+        return this.parentCode;
     }
 
-    public void setparentId(String parentId) {
-        this.parentId = parentId;
+    public void setParentCode(String parentCode) {
+        this.parentCode = parentCode;
     }
 
     public String getReg() {

+ 0 - 210
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/AitagTagInfoVersionQueryVo.java

@@ -1,210 +0,0 @@
-package cn.com.yusys.yusp.domain.vo;
-
-import cn.com.yusys.yusp.commons.module.adapter.query.PageQuery;
-
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-public class AitagTagInfoVersionQueryVo extends PageQuery {
-
-    /**
-     * id
-     **/
-    private String id;
-
-    /**
-     * 所属大类
-     **/
-    private String categoryId;
-
-    /**
-     * 标签名称
-     **/
-    private String tagNm;
-
-    /**
-     * 标签代码
-     **/
-    private String tagCode;
-
-    /**
-     * 标签备注
-     **/
-    private String tagRemark;
-
-    /**
-     * 父级ID
-     **/
-    private String parentId;
-
-    /**
-     * 标签规则
-     **/
-    private String reg;
-
-    /**
-     * 标签等级
-     **/
-    private Integer level;
-
-    /**
-     * tag1/tag2/tag3/...
-     **/
-    private String tagPath;
-
-    /**
-     * 0未删除;1删除
-     **/
-    private Integer isDelete;
-
-    /**
-     * 0 正常;1 停用
-     **/
-    private Integer state;
-
-    /**
-     * 标签提示词
-     **/
-    private String tagPrompt;
-
-    /**
-     * 标签版本
-     **/
-    private String tagVersion;
-
-    /**
-     * 修订时间
-     **/
-    private String revisionTime;
-
-    /**
-     * 修订人
-     **/
-    private String reviser;
-
-
-    public String getId() {
-        return this.id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCategoryId() {
-        return this.categoryId;
-    }
-
-    public void setCategoryId(String categoryId) {
-        this.categoryId = categoryId;
-    }
-
-    public String getTagNm() {
-        return this.tagNm;
-    }
-
-    public void setTagNm(String tagNm) {
-        this.tagNm = tagNm;
-    }
-
-    public String getTagCode() {
-        return this.tagCode;
-    }
-
-    public void setTagCode(String tagCode) {
-        this.tagCode = tagCode;
-    }
-
-    public String getTagRemark() {
-        return this.tagRemark;
-    }
-
-    public void setTagRemark(String tagRemark) {
-        this.tagRemark = tagRemark;
-    }
-
-    public String getparentId() {
-        return this.parentId;
-    }
-
-    public void setparentId(String parentId) {
-        this.parentId = parentId;
-    }
-
-    public String getReg() {
-        return this.reg;
-    }
-
-    public void setReg(String reg) {
-        this.reg = reg;
-    }
-
-    public Integer getLevel() {
-        return this.level;
-    }
-
-    public void setLevel(Integer level) {
-        this.level = level;
-    }
-
-    public String getTagPath() {
-        return this.tagPath;
-    }
-
-    public void setTagPath(String tagPath) {
-        this.tagPath = tagPath;
-    }
-
-    public Integer getIsDelete() {
-        return this.isDelete;
-    }
-
-    public void setIsDelete(Integer isDelete) {
-        this.isDelete = isDelete;
-    }
-
-    public Integer getState() {
-        return this.state;
-    }
-
-    public void setState(Integer state) {
-        this.state = state;
-    }
-
-    public String getTagPrompt() {
-        return this.tagPrompt;
-    }
-
-    public void setTagPrompt(String tagPrompt) {
-        this.tagPrompt = tagPrompt;
-    }
-
-    public String getTagVersion() {
-        return this.tagVersion;
-    }
-
-    public void setTagVersion(String tagVersion) {
-        this.tagVersion = tagVersion;
-    }
-
-    public String getRevisionTime() {
-        return this.revisionTime;
-    }
-
-    public void setRevisionTime(String revisionTime) {
-        this.revisionTime = revisionTime;
-    }
-
-    public String getReviser() {
-        return this.reviser;
-    }
-
-    public void setReviser(String reviser) {
-        this.reviser = reviser;
-    }
-
-}

+ 2 - 2
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/DataOverviewVo.java

@@ -38,7 +38,7 @@ public class DataOverviewVo {
 
 
     /**
-     * 打标未确认
+     * 评估处理时长
      */
-    private Integer taggedUnconfirmed;
+    private String avgProcessingDuration;
 }

+ 0 - 58
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/ExportDataVo.java

@@ -1,58 +0,0 @@
-package cn.com.yusys.yusp.domain.vo;
-
-
-import com.alibaba.excel.annotation.ExcelProperty;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Data
-public class ExportDataVo {
-
-
-    /**
-     * 合同编号
-     **/
-    @ExcelProperty(value = "合同编号" ,index = 0)
-    private String contractNo;
-
-
-    /**
-     * 客户经理
-     **/
-    @ExcelProperty(value = "客户经理" ,index = 1)
-    private String feedbackUserNm;
-
-
-    /**
-     * 客户经理
-     **/
-    @ExcelProperty(value = "法人机构" ,index = 2)
-    private String feedbackUserOrg;
-
-
-    /**
-     * 客户经理
-     **/
-    @ExcelProperty(value = "网点" ,index = 3)
-    private String feedbackUserEndpoint;
-
-
-
-    /**
-     * 打标结果,JSON
-     **/
-    @ExcelProperty(value = "智能标签" ,index = 4)
-    private String result;
-
-
-    /**
-     * 发起时间
-     **/
-    @ExcelProperty(value = "标注时间" ,index = 5)
-    private String insertTime;
-
-    public void setInsertTime(LocalDateTime insertTime) {
-        this.insertTime = insertTime.toString();
-    }
-}

+ 41 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/LoginResponseVo.java

@@ -0,0 +1,41 @@
+package cn.com.yusys.yusp.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 登录响应VO
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Data
+@ApiModel("登录响应")
+public class LoginResponseVo {
+
+    @ApiModelProperty("访问令牌")
+    private String token;
+
+    @ApiModelProperty("用户ID")
+    private String userId;
+
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    @ApiModelProperty("用户角色")
+    private String role;
+
+    @ApiModelProperty("过期时间(毫秒)")
+    private Long expiresIn;
+
+    public static LoginResponseVo success(String token, String userId, String userName, String role, Long expiresIn) {
+        LoginResponseVo response = new LoginResponseVo();
+        response.setToken(token);
+        response.setUserId(userId);
+        response.setUserName(userName);
+        response.setRole(role);
+        response.setExpiresIn(expiresIn);
+        return response;
+    }
+}

+ 0 - 74
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/TagNodeVo.java

@@ -1,74 +0,0 @@
-package cn.com.yusys.yusp.domain.vo;
-
-
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 智能标签数
- */
-public class TagNodeVo {
-
-
-    private String id;
-
-    private String parentId;
-    private String tagNm;
-    private String tagCode;
-    private List<TagNodeVo> children = new ArrayList<>();
-
-
-    public TagNodeVo(AitagTagInfoEntity entity) {
-        this.id = entity.getId();
-        this.parentId = entity.getParentId();
-        this.tagNm = entity.getTagNm();
-        this.tagCode = entity.getTagCode();
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getparentId() {
-        return parentId;
-    }
-
-    public void setparentId(String parentId) {
-        this.parentId = parentId;
-    }
-
-    public String getTagNm() {
-        return tagNm;
-    }
-
-    public void setTagNm(String tagNm) {
-        this.tagNm = tagNm;
-    }
-
-    public String getTagCode() {
-        return tagCode;
-    }
-
-    public void setTagCode(String tagCode) {
-        this.tagCode = tagCode;
-    }
-
-
-    public List<TagNodeVo> getChildren() {
-        return children;
-    }
-
-    public void setChildren(List<TagNodeVo> children) {
-        this.children = children;
-    }
-
-    public void addChild(TagNodeVo child) {
-        this.children.add(child);
-    }
-}

+ 0 - 35
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/VersionRollbackVo.java

@@ -1,35 +0,0 @@
-package cn.com.yusys.yusp.domain.vo;
-
-
-import lombok.Data;
-
-/**
- * 版本回溯
- */
-
-@Data
-public class VersionRollbackVo {
-
-
-
-    /**
-     * 标签主键
-     */
-    private String id;
-
-    /**
-     * 标签代码
-     */
-    private String tagCode;
-
-
-    /**
-     * 要回溯标签版本
-     */
-    private String version;
-
-    /**
-     * 修订人
-     */
-    private String reviser;
-}

+ 36 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingQueryResponseVo.java

@@ -0,0 +1,36 @@
+package cn.com.yusys.yusp.domain.vo.fastapivo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("AI打标查询响应")
+public class AiTaggingQueryResponseVo {
+
+    @ApiModelProperty(value = "状态码 200(查询成功)/300(正在处理中)/500(处理失败)")
+    private String code;
+
+    @ApiModelProperty(value = "消息内容")
+    private String message;
+
+    @ApiModelProperty(value = "标签数据")
+    private AiTagDataVo[] data;
+
+    @Data
+    @ApiModel("标签数据")
+    public static class AiTagDataVo {
+
+        @ApiModelProperty(value = "标签名称")
+        private String tag;
+
+        @ApiModelProperty(value = "标签代码")
+        private String tagcode;
+
+        @ApiModelProperty(value = "是否AI推荐 true: AI推荐的标签, false: 算法筛选出来但是被LLM淘汰的候选标签")
+        private Boolean passr;
+
+        @ApiModelProperty(value = "解释说明")
+        private String desc;
+    }
+}

+ 16 - 0
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/domain/vo/fastapivo/AiTaggingResponseVo.java

@@ -0,0 +1,16 @@
+package cn.com.yusys.yusp.domain.vo.fastapivo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("AI打标响应")
+public class AiTaggingResponseVo {
+
+    @ApiModelProperty(value = "状态码 200/500")
+    private String code;
+
+    @ApiModelProperty(value = "消息内容")
+    private String message;
+}

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

@@ -38,4 +38,10 @@ public interface AitagTagCategoryMapper {
 
     // 全表计数(分页总数)
     long selectCountAll();
+
+    // 分页查询已启用的标签体系
+    List<AitagTagCategory> selectPageEnabledCategories(@Param("offset") int offset, @Param("limit") int limit);
+
+    // 统计已启用标签体系的数量
+    long selectCountEnabled();
 }

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

@@ -1,12 +1,8 @@
 package cn.com.yusys.yusp.mapper;
 
 import cn.com.yusys.yusp.commons.mybatisplus.mapper.BaseMapper;
-import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
 
 /**
  * 
@@ -18,7 +14,4 @@ import java.util.List;
 @Mapper
 public interface AitagTagInfoDao extends BaseMapper<AitagTagInfoEntity> {
 
-
-   TagInfoDto selectTagInfo(@Param("id") String id);
-
 }

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

@@ -1,17 +0,0 @@
-package cn.com.yusys.yusp.mapper;
-
-import cn.com.yusys.yusp.commons.mybatisplus.mapper.BaseMapper;
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-
-@Mapper
-public interface AitagTagInfoVersionDao extends BaseMapper<AitagTagInfoVersionEntity> {
-
-}

+ 2 - 1
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/mapper/AitagTagLogDao.java

@@ -3,6 +3,7 @@ package cn.com.yusys.yusp.mapper;
 import cn.com.yusys.yusp.commons.mybatisplus.mapper.BaseMapper;
 import cn.com.yusys.yusp.domain.vo.IconResVo;
 import cn.com.yusys.yusp.domain.vo.SmartTaggingResultVo;
+import cn.com.yusys.yusp.domain.dto.TagSumDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -19,7 +20,7 @@ import java.util.List;
 @Mapper
 public interface AitagTagLogDao extends BaseMapper<AitagTagLogEntity> {
 
-    Integer selectTagCount(SmartTaggingResultVo taggingResult);
+    TagSumDto selectTagCount(SmartTaggingResultVo taggingResult);
 
 
     List<IconResVo> selectTagReportByDay(SmartTaggingResultVo taggingResult);

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

@@ -0,0 +1,23 @@
+package cn.com.yusys.yusp.mapper;
+
+import cn.com.yusys.yusp.domain.entity.AitagUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * 用户Mapper接口
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+public interface AitagUserMapper extends BaseMapper<AitagUser> {
+
+    /**
+     * 根据用户ID查询用户
+     *
+     * @param userId 用户ID
+     * @return 用户信息
+     */
+    AitagUser selectByUserId(@Param("userId") String userId);
+}

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

@@ -16,4 +16,7 @@ public interface AitagTagCategoryService {
     void enableCategory(String id);
     void disableCategory(String id);
     void deleteCategory(String id);
+    // 分页查询已启用的标签体系
+    Page<AitagTagCategoryVo> listEnabledCategories(int page, int size);
+
 }

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

@@ -1,15 +1,10 @@
 package cn.com.yusys.yusp.service;
 
-import cn.com.yusys.yusp.domain.dto.TagInfoDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
-import cn.com.yusys.yusp.domain.vo.TagNodeVo;
-import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 
-import java.util.List;
-
 /**
  * 
  *
@@ -26,19 +21,5 @@ public interface AitagTagInfoService extends IService<AitagTagInfoEntity> {
      * @return IPage
      */
     IPage<AitagTagInfoEntity> queryPage(AitagTagInfoQueryVo aitagTagInfoQueryVo);
-
-    void saveTag(AitagTagInfoEntity aitagTagInfo);
-
-    List<TagNodeVo> queryTagTree(AitagTagInfoQueryVo aitagTagInfoQueryVo);
-
-    TagInfoDto getTagInfo(String id);
-
-    void updateTag(AitagTagInfoEntity aitagTagInfoEntity);
-
-    void removeTags(List<String> list);
-
-    void versionRollback(VersionRollbackVo versionRollbackVo);
-
-    List<AitagTagInfoEntity> queryList(AitagTagInfoQueryVo aitagTagInfoQueryVo);
 }
 

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

@@ -1,25 +0,0 @@
-package cn.com.yusys.yusp.service;
-
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
-import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.service.IService;
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-
-public interface AitagTagInfoVersionService extends IService<AitagTagInfoVersionEntity> {
-
-    /**
-     * 分页查询
-     *
-     * @param aitagTagInfoVersionQueryVo
-     * @return IPage
-     */
-    IPage<AitagTagInfoVersionEntity> queryPage(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo);
-}
-

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

@@ -25,7 +25,5 @@ public interface AitagTagLogService extends IService<AitagTagLogEntity> {
     AitagTagLogEntity show(String id);
 
     List<IconResVo> tagDistStats(TagDistStatsReqVo resultDTO);
-
-    List<AitagTagLogEntity> queryList(TaggingTransactionReqVo transactionReqVo);
 }
 

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

@@ -0,0 +1,46 @@
+package cn.com.yusys.yusp.service;
+
+import cn.com.yusys.yusp.domain.dto.LoginRequestDto;
+import cn.com.yusys.yusp.domain.entity.AitagUser;
+import cn.com.yusys.yusp.domain.vo.LoginResponseVo;
+
+/**
+ * 认证服务接口
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+public interface AuthService {
+
+    /**
+     * 用户登录
+     *
+     * @param loginRequest 登录请求
+     * @return 登录响应
+     */
+    LoginResponseVo login(LoginRequestDto loginRequest);
+
+    /**
+     * 用户登出
+     *
+     * @param userId 用户ID
+     */
+    void logout(String userId);
+
+    /**
+     * 根据用户ID获取用户信息
+     *
+     * @param userId 用户ID
+     * @return 用户信息
+     */
+    AitagUser getUserById(String userId);
+
+    /**
+     * 验证用户密码
+     *
+     * @param userId 用户ID
+     * @param password 密码
+     * @return 是否验证通过
+     */
+    boolean validatePassword(String userId, String password);
+}

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

@@ -0,0 +1,31 @@
+package cn.com.yusys.yusp.service;
+
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingFeedbackRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingQueryRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingRequestDto;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingQueryResponseVo;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingResponseVo;
+
+public interface FastApiService {
+
+    /**
+     * AI打标接口
+     * @param request 打标请求
+     * @return 响应结果
+     */
+    AiTaggingResponseVo tagging(AiTaggingRequestDto request);
+
+    /**
+     * AI打标查询接口
+     * @param request 查询请求
+     * @return 查询结果
+     */
+    AiTaggingQueryResponseVo query(AiTaggingQueryRequestDto request);
+
+    /**
+     * AI打标反馈接口
+     * @param request 反馈请求
+     * @return 响应结果
+     */
+    AiTaggingResponseVo feedback(AiTaggingFeedbackRequestDto request);
+}

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

@@ -145,4 +145,33 @@ public class AitagTagCategoryServiceImpl implements AitagTagCategoryService {
 
         aiTagCategoryMapper.deleteCategory(id);
     }
+
+    @Override
+    public Page<AitagTagCategoryVo> listEnabledCategories(int page, int size) {
+        int offset = (page - 1) * size;
+        List<AitagTagCategory> records = aiTagCategoryMapper.selectPageEnabledCategories(offset, size);
+        long total = aiTagCategoryMapper.selectCountEnabled();
+
+        // 转换为 VO 并动态计算 tagNum
+        List<AitagTagCategoryVo> voList = records.stream().map(category -> {
+            AitagTagCategoryVo vo = new AitagTagCategoryVo();
+            vo.setId(category.getId());
+            vo.setCategoryCode(category.getCategoryCode());
+            vo.setCategoryNm(category.getCategoryNm());
+            vo.setCategoryDesc(category.getCategoryDesc());
+            vo.setVisibilityLevel(category.getVisibilityLevel());
+            vo.setState(category.getState());
+            vo.setIsDelete(category.getIsDelete());
+
+            // 动态计算 tagNum
+            int tagNum = aiTagCategoryMapper.countTagsByCategoryId(category.getId());
+            vo.setTagNum(tagNum);
+
+            return vo;
+        }).collect(Collectors.toList());
+
+        Page<AitagTagCategoryVo> pageObj = new Page<>(page, size, total);
+        pageObj.setRecords(voList);
+        return pageObj;
+    }
 }

+ 2 - 202
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagInfoServiceImpl.java

@@ -1,30 +1,14 @@
 package cn.com.yusys.yusp.service.impl;
 
-import cn.com.yusys.yusp.commons.util.StringUtils;
-import cn.com.yusys.yusp.commons.util.date.DateUtils;
-import cn.com.yusys.yusp.domain.vo.VersionRollbackVo;
-import cn.com.yusys.yusp.mapper.AitagTagInfoVersionDao;
-import cn.com.yusys.yusp.domain.dto.TagInfoDto;
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
-import cn.com.yusys.yusp.domain.vo.TagNodeVo;
 import cn.com.yusys.yusp.mapper.AitagTagInfoDao;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.AitagTagInfoQueryVo;
 import cn.com.yusys.yusp.service.AitagTagInfoService;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-
-import static cn.com.yusys.yusp.config.DataDictionary.*;
 
 /**
  * 
@@ -36,10 +20,6 @@ import static cn.com.yusys.yusp.config.DataDictionary.*;
 @Service("aitagTagInfoService")
 public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagTagInfoEntity> implements AitagTagInfoService {
 
-
-    @Autowired
-    private AitagTagInfoVersionDao aitagTagInfoVersionDao;
-
     /**
      * 分页查询
      *
@@ -64,8 +44,8 @@ public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagT
         if (aitagTagInfoQueryVo.getTagRemark() != null) {
             queryWrapper.eq(AitagTagInfoEntity::getTagRemark, aitagTagInfoQueryVo.getTagRemark());
         }
-        if (aitagTagInfoQueryVo.getparentId() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getParentId, aitagTagInfoQueryVo.getparentId());
+        if (aitagTagInfoQueryVo.getParentCode() != null) {
+            queryWrapper.eq(AitagTagInfoEntity::getParentCode, aitagTagInfoQueryVo.getParentCode());
         }
         if (aitagTagInfoQueryVo.getReg() != null) {
             queryWrapper.eq(AitagTagInfoEntity::getReg, aitagTagInfoQueryVo.getReg());
@@ -89,184 +69,4 @@ public class AitagTagInfoServiceImpl extends ServiceImpl<AitagTagInfoDao, AitagT
         IPage<AitagTagInfoEntity> page = this.page(new Page<>(aitagTagInfoQueryVo.getPage(), aitagTagInfoQueryVo.getSize()), queryWrapper);
         return page;
     }
-
-
-    @Override
-    public void saveTag(AitagTagInfoEntity aitagTagInfo){
-        aitagTagInfo.setId(StringUtils.getUUID());
-        String parentId = aitagTagInfo.getParentId();
-        if(!StringUtils.isBlank(parentId)){
-            LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(AitagTagInfoEntity::getParentId,parentId);
-            queryWrapper.eq(AitagTagInfoEntity::getIsDelete,TAG_UNDELETED);
-            List<AitagTagInfoEntity> aitagTagInfoEntities = this.baseMapper.selectList(queryWrapper);
-            if(!aitagTagInfoEntities.isEmpty()){
-                AitagTagInfoEntity aitagTagInfoEntity = aitagTagInfoEntities.get(0);
-                aitagTagInfo.setTagPath(aitagTagInfoEntity.getTagPath()+"/"+aitagTagInfo.getTagNm());
-                aitagTagInfo.setLevel(aitagTagInfoEntity.getLevel()+1);
-            }else{
-                aitagTagInfo.setTagPath(aitagTagInfo.getTagNm());
-                aitagTagInfo.setLevel(1);
-            }
-        }else{
-            aitagTagInfo.setTagPath(aitagTagInfo.getTagNm());
-            aitagTagInfo.setLevel(1);
-        }
-        aitagTagInfo.setRevisionTime(DateUtils.getCurrDateTimeStr());
-        aitagTagInfo.setTagVersion("0.1");
-        aitagTagInfo.setIsDelete(TAG_UNDELETED);
-        aitagTagInfo.setState(TAG_ENABLED);
-        this.save(aitagTagInfo);
-    }
-
-    /**
-     * 列表查询
-     *
-     * @param aitagTagInfoQueryVo
-     * @return List<TagNodeVo>
-     */
-    @Override
-    public List<TagNodeVo> queryTagTree(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
-        if (aitagTagInfoQueryVo.getId() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getId, aitagTagInfoQueryVo.getId());
-        }
-        queryWrapper.eq(AitagTagInfoEntity::getCategoryId, aitagTagInfoQueryVo.getCategoryId());
-        if (aitagTagInfoQueryVo.getTagNm() != null) {
-            queryWrapper.like(AitagTagInfoEntity::getTagNm, aitagTagInfoQueryVo.getTagNm());
-        }
-        queryWrapper.eq(AitagTagInfoEntity::getIsDelete, TAG_UNDELETED);
-        List<AitagTagInfoEntity> aitagTagInfoEntities = this.baseMapper.selectList(queryWrapper);
-        return this.buildTree(aitagTagInfoEntities);
-    }
-
-    @Override
-    public TagInfoDto getTagInfo(String id) {
-        return this.baseMapper.selectTagInfo(id);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void updateTag(AitagTagInfoEntity aitagTagInfoEntity) {
-        AitagTagInfoEntity tagInfo = this.baseMapper.selectById(aitagTagInfoEntity.getId());
-        AitagTagInfoVersionEntity aitagTagInfoVersionEntity = JSON.parseObject(JSON.toJSONString(tagInfo), AitagTagInfoVersionEntity.class);
-        aitagTagInfoVersionEntity.setId(StringUtils.getUUID());
-        this.aitagTagInfoVersionDao.insert(aitagTagInfoVersionEntity);
-        aitagTagInfoEntity.setRevisionTime(DateUtils.getCurrDateTimeStr());
-        aitagTagInfoEntity.setTagVersion(Double.parseDouble(tagInfo.getTagVersion())+0.1+"");
-        this.baseMapper.updateById(aitagTagInfoEntity);
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void removeTags(List<String> list) {
-        AitagTagInfoEntity aitagTagInfoEntity = new AitagTagInfoEntity();
-        for (String id:list){
-            aitagTagInfoEntity.setId(id);
-            aitagTagInfoEntity.setIsDelete(TAG_DELETED);
-            this.baseMapper.updateById(aitagTagInfoEntity);
-        }
-    }
-
-    @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void versionRollback(VersionRollbackVo versionRollback) {
-        LambdaQueryWrapper<AitagTagInfoVersionEntity> queryTagVersionWrapper = new LambdaQueryWrapper<>();
-        queryTagVersionWrapper.eq(AitagTagInfoVersionEntity::getTagCode,versionRollback.getTagCode());
-        queryTagVersionWrapper.eq(AitagTagInfoVersionEntity::getTagVersion,versionRollback.getVersion());
-        List<AitagTagInfoVersionEntity> versionEntities = this.aitagTagInfoVersionDao.selectList(queryTagVersionWrapper);
-        if(versionEntities !=null && !versionEntities.isEmpty()){
-            AitagTagInfoVersionEntity tagInfoVersion = versionEntities.get(0);
-            AitagTagInfoEntity aitagTagInfoEntity = JSON.parseObject(JSONObject.toJSONString(tagInfoVersion), AitagTagInfoEntity.class);
-            aitagTagInfoEntity.setId(versionRollback.getId());
-            aitagTagInfoEntity.setRevisionTime(DateUtils.getCurrDateTimeStr());
-            aitagTagInfoEntity.setReviser(versionRollback.getReviser());
-            this.baseMapper.updateById(aitagTagInfoEntity);
-            LambdaUpdateWrapper<AitagTagInfoVersionEntity> updateTagVersion = new LambdaUpdateWrapper<>();
-            updateTagVersion.eq(AitagTagInfoVersionEntity::getTagCode,versionRollback.getTagCode());
-            updateTagVersion.ge(AitagTagInfoVersionEntity::getTagVersion,versionRollback.getVersion());
-            AitagTagInfoVersionEntity aitagTagInfoVersionEntity = new AitagTagInfoVersionEntity();
-            aitagTagInfoVersionEntity.setIsDelete(TAG_DELETED);
-            this.aitagTagInfoVersionDao.update(aitagTagInfoVersionEntity,updateTagVersion);
-        }
-    }
-
-    @Override
-    public List<AitagTagInfoEntity> queryList(AitagTagInfoQueryVo aitagTagInfoQueryVo) {
-        LambdaQueryWrapper<AitagTagInfoEntity> queryWrapper = new LambdaQueryWrapper<>();
-        if (aitagTagInfoQueryVo.getId() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getId, aitagTagInfoQueryVo.getId());
-        }
-        if (aitagTagInfoQueryVo.getCategoryId() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getCategoryId, aitagTagInfoQueryVo.getCategoryId());
-        }
-        if (aitagTagInfoQueryVo.getTagNm() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getTagNm, aitagTagInfoQueryVo.getTagNm());
-        }
-        if (aitagTagInfoQueryVo.getTagCode() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getTagCode, aitagTagInfoQueryVo.getTagCode());
-        }
-        if (aitagTagInfoQueryVo.getTagRemark() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getTagRemark, aitagTagInfoQueryVo.getTagRemark());
-        }
-        if (aitagTagInfoQueryVo.getparentId() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getParentId, aitagTagInfoQueryVo.getparentId());
-        }
-        if (aitagTagInfoQueryVo.getReg() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getReg, aitagTagInfoQueryVo.getReg());
-        }
-        if (aitagTagInfoQueryVo.getLevel() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getLevel, aitagTagInfoQueryVo.getLevel());
-        }
-        if (aitagTagInfoQueryVo.getTagPath() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getTagPath, aitagTagInfoQueryVo.getTagPath());
-        }
-        if (aitagTagInfoQueryVo.getIsDelete() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getIsDelete, aitagTagInfoQueryVo.getIsDelete());
-        }
-        if (aitagTagInfoQueryVo.getState() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getState, aitagTagInfoQueryVo.getState());
-        }
-        if (aitagTagInfoQueryVo.getTagPrompt() != null) {
-            queryWrapper.eq(AitagTagInfoEntity::getTagPrompt, aitagTagInfoQueryVo.getTagPrompt());
-        }
-        queryWrapper.select(AitagTagInfoEntity::getId,AitagTagInfoEntity::getTagNm,AitagTagInfoEntity::getParentId);
-        return this.baseMapper.selectList(queryWrapper);
-    }
-
-    /**
-     * 将AitagTagInfoEntity列表转换为树形结构
-     * @param entities AitagTagInfoEntity列表
-     * @return 树形结构的根节点列表
-     */
-    private List<TagNodeVo> buildTree(List<AitagTagInfoEntity> entities) {
-        List<TagNodeVo> rootNodes = new ArrayList<>();
-        Map<String, TagNodeVo> nodeMap = new HashMap<>();
-
-        // 首先创建所有节点并放入map
-        for (AitagTagInfoEntity entity : entities) {
-            TagNodeVo node = new TagNodeVo(entity);
-            nodeMap.put(entity.getId(), node);
-        }
-
-        // 构建树形结构
-        for (AitagTagInfoEntity entity : entities) {
-            TagNodeVo currentNode = nodeMap.get(entity.getId());
-            String parentId = entity.getParentId();
-
-            // 如果parentId为null或空,则为根节点
-            if (parentId == null || parentId.isEmpty()) {
-                rootNodes.add(currentNode);
-            } else {
-                // 查找父节点并添加为子节点
-                TagNodeVo parentNode = nodeMap.get(parentId);
-                if (parentNode != null) {
-                    parentNode.addChild(currentNode);
-                }else{
-                    rootNodes.add(currentNode);
-                }
-            }
-        }
-        return rootNodes;
-    }
 }

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

@@ -1,81 +0,0 @@
-package cn.com.yusys.yusp.service.impl;
-
-import cn.com.yusys.yusp.mapper.AitagTagInfoVersionDao;
-import cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity;
-import cn.com.yusys.yusp.domain.vo.AitagTagInfoVersionQueryVo;
-import cn.com.yusys.yusp.service.AitagTagInfoVersionService;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-/**
- * 标签信息版本表
- *
- * @author 2507040827
- * @date 2026-02-27 11:33:54
- */
-
-@Service("aitagTagInfoVersionService")
-public class AitagTagInfoVersionServiceImpl extends ServiceImpl<AitagTagInfoVersionDao, AitagTagInfoVersionEntity> implements AitagTagInfoVersionService {
-
-    /**
-     * 分页查询
-     *
-     * @param aitagTagInfoVersionQueryVo
-     * @return IPage
-     */
-    @Override
-    public IPage<AitagTagInfoVersionEntity> queryPage(AitagTagInfoVersionQueryVo aitagTagInfoVersionQueryVo) {
-        LambdaQueryWrapper<AitagTagInfoVersionEntity> queryWrapper = new LambdaQueryWrapper<>();
-        if (aitagTagInfoVersionQueryVo.getId() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getId, aitagTagInfoVersionQueryVo.getId());
-        }
-        if (aitagTagInfoVersionQueryVo.getCategoryId() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getCategoryId, aitagTagInfoVersionQueryVo.getCategoryId());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagNm() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagNm, aitagTagInfoVersionQueryVo.getTagNm());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagCode() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagCode, aitagTagInfoVersionQueryVo.getTagCode());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagRemark() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagRemark, aitagTagInfoVersionQueryVo.getTagRemark());
-        }
-        if (aitagTagInfoVersionQueryVo.getparentId() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getparentId, aitagTagInfoVersionQueryVo.getparentId());
-        }
-        if (aitagTagInfoVersionQueryVo.getReg() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getReg, aitagTagInfoVersionQueryVo.getReg());
-        }
-        if (aitagTagInfoVersionQueryVo.getLevel() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getLevel, aitagTagInfoVersionQueryVo.getLevel());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagPath() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagPath, aitagTagInfoVersionQueryVo.getTagPath());
-        }
-        if (aitagTagInfoVersionQueryVo.getIsDelete() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getIsDelete, aitagTagInfoVersionQueryVo.getIsDelete());
-        }
-        if (aitagTagInfoVersionQueryVo.getState() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getState, aitagTagInfoVersionQueryVo.getState());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagPrompt() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagPrompt, aitagTagInfoVersionQueryVo.getTagPrompt());
-        }
-        if (aitagTagInfoVersionQueryVo.getTagVersion() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getTagVersion, aitagTagInfoVersionQueryVo.getTagVersion());
-        }
-        if (aitagTagInfoVersionQueryVo.getRevisionTime() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getRevisionTime, aitagTagInfoVersionQueryVo.getRevisionTime());
-        }
-        if (aitagTagInfoVersionQueryVo.getReviser() != null) {
-            queryWrapper.eq(AitagTagInfoVersionEntity::getReviser, aitagTagInfoVersionQueryVo.getReviser());
-        }
-
-        IPage<AitagTagInfoVersionEntity> page = this.page(new Page<>(aitagTagInfoVersionQueryVo.getPage(), aitagTagInfoVersionQueryVo.getSize()), queryWrapper);
-        return page;
-    }
-}

+ 52 - 60
server/yusp-tagging-core/src/main/java/cn/com/yusys/yusp/service/impl/AitagTagLogServiceImpl.java

@@ -1,8 +1,8 @@
 package cn.com.yusys.yusp.service.impl;
 
 import cn.com.yusys.yusp.commons.exception.BizException;
-import cn.com.yusys.yusp.commons.util.date.DateUtils;
 import cn.com.yusys.yusp.config.DataDictionary;
+import cn.com.yusys.yusp.domain.dto.TagSumDto;
 import cn.com.yusys.yusp.domain.entity.AitagTagInfoEntity;
 import cn.com.yusys.yusp.domain.vo.*;
 import cn.com.yusys.yusp.mapper.AitagTagDailyAggDao;
@@ -11,18 +11,17 @@ import cn.com.yusys.yusp.mapper.AitagTagLogDao;
 import cn.com.yusys.yusp.domain.entity.AitagTagLogEntity;
 import cn.com.yusys.yusp.service.AitagTagLogService;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.net.URL;
 import java.util.List;
 import java.util.Map;
 
@@ -47,77 +46,86 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
     @Override
     public DataOverviewVo dataOverview(SmartTaggingResultVo taggingResult) {
         DataOverviewVo dataOverview = new DataOverviewVo();
-        Integer totalCnt = this.baseMapper.selectTagCount(taggingResult);
-        dataOverview.setCountNum(totalCnt);
+        TagSumDto tagSumVo = this.baseMapper.selectTagCount(taggingResult);
+        dataOverview.setCountNum(tagSumVo.getTotalCount());
+        if(tagSumVo.getTotalDuration() !=0){
+            BigDecimal result = new BigDecimal(tagSumVo.getTotalDuration())
+                    .divide(new BigDecimal(tagSumVo.getTotalCount()), 10, RoundingMode.HALF_UP);
+            dataOverview.setAvgProcessingDuration(result.toString());
+        }else{
+            dataOverview.setAvgProcessingDuration("0");
+        }
 
         LambdaQueryWrapper<AitagTagLogEntity> queryCount = new LambdaQueryWrapper<>();
-        LambdaQueryWrapper<AitagTagLogEntity> queryAgreeTags = new LambdaQueryWrapper<>();
+        LambdaQueryWrapper<AitagTagLogEntity> queryAccurateMarks = new LambdaQueryWrapper<>();
         if (StringUtils.isNotBlank(taggingResult.getCategoryCode())) {
             queryCount.eq(AitagTagLogEntity::getCategoryCode, taggingResult.getCategoryCode());
-            queryAgreeTags.eq(AitagTagLogEntity::getCategoryCode, taggingResult.getCategoryCode());
+            queryAccurateMarks.eq(AitagTagLogEntity::getCategoryCode, taggingResult.getCategoryCode());
         }
         if (StringUtils.isNotBlank(taggingResult.getStartTaggingTime())){
             queryCount.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
-            queryAgreeTags.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
+            queryAccurateMarks.ge(AitagTagLogEntity::getInsertTime, taggingResult.getStartTaggingTime());
         }
         if (StringUtils.isNotBlank(taggingResult.getEndTaggingTime())){
             queryCount.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
-            queryAgreeTags.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
+            queryAccurateMarks.le(AitagTagLogEntity::getInsertTime, taggingResult.getEndTaggingTime());
         }
         queryCount.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
-        queryAgreeTags.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
+        queryAccurateMarks.in(AitagTagLogEntity::getState, DataDictionary.RESULT_PUSHED,DataDictionary.MANAGER_CONFIRMED);
 
-        Integer totalConfirmedCnt = this.baseMapper.selectCount(queryCount);
+        Integer countNum = this.baseMapper.selectCount(queryCount);
 
-        queryAgreeTags.eq(AitagTagLogEntity::getFeedback,FEEDBACK_RESULT_AGREE);
-        Integer agreeTagNum = this.baseMapper.selectCount(queryAgreeTags);
-        BigDecimal accurateRate = calculateAccuracy(agreeTagNum, totalConfirmedCnt);
+        queryAccurateMarks.eq(AitagTagLogEntity::getFeedback,FEEDBACK_RESULT_AGREE);
+        Integer accurateMarksNum = this.baseMapper.selectCount(queryAccurateMarks);
+        BigDecimal accurateRate = calculateAccuracy(accurateMarksNum, countNum);
 
-        dataOverview.setAccurateNum(totalConfirmedCnt);
+        dataOverview.setAccurateNum(countNum);
         dataOverview.setAccurateRate(accurateRate+"%");
-        if(totalConfirmedCnt == 0){
+        if(countNum == 0){
             dataOverview.setManualAdjustRate("0%");
         }else{
             dataOverview.setManualAdjustRate(BigDecimal.valueOf(100).subtract(accurateRate)
                     .setScale(2, RoundingMode.HALF_UP)+"%");
         }
-        dataOverview.setManualAdjustCount(totalConfirmedCnt-agreeTagNum);
-        dataOverview.setTaggedUnconfirmed(totalCnt-totalConfirmedCnt);
+        dataOverview.setManualAdjustCount(countNum-accurateMarksNum);
+
         return dataOverview;
     }
 
     @Override
     public List<IconResVo> taggingTrend(TaggingTrendReqVo taggingTrendReqVo) {
-        String startTaggingTime = taggingTrendReqVo.getStartTaggingTime();
-        String endTaggingTime = taggingTrendReqVo.getEndTaggingTime();
-
-        int daysByTwoDatesDef = DateUtils.getDaysByTwoDatesDef(startTaggingTime, endTaggingTime);
+        String statisticalPeriod = taggingTrendReqVo.getStatisticalPeriod();
         List<IconResVo> taggingTrendResVo = null;
-        if(daysByTwoDatesDef>=15){
-            taggingTrendResVo = this.baseMapper.selectTagReportByDay(taggingTrendReqVo);
-        }else{
-            taggingTrendResVo = this.baseMapper.selectTagReportByMonth(taggingTrendReqVo);
+                switch (statisticalPeriod){
+            case DAY:
+                taggingTrendResVo = this.baseMapper.selectTagReportByDay(taggingTrendReqVo);
+                break;
+            case MONTH:
+                taggingTrendResVo = this.baseMapper.selectTagReportByMonth(taggingTrendReqVo);
+                break;
+            default:
+                throw BizException.of("NO_DATA_PERIOD");
         }
         return taggingTrendResVo;
     }
 
     @Override
-    public IPage<AitagTagLogEntity> taggingDetails(TaggingTransactionReqVo transactionReqVo) {
-        LambdaQueryWrapper<AitagTagLogEntity> queryWrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotBlank(transactionReqVo.getCategoryCode())) {
-            queryWrapper.eq(AitagTagLogEntity::getCategoryCode, transactionReqVo.getCategoryCode());
+    public IPage<AitagTagLogEntity> taggingDetails(TaggingTransactionReqVo aitagTagLogEntity) {
+        LambdaQueryWrapper<AitagTagLogEntity> queryCount = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(aitagTagLogEntity.getCategoryCode())) {
+            queryCount.eq(AitagTagLogEntity::getCategoryCode, aitagTagLogEntity.getCategoryCode());
         }
-        if (StringUtils.isNotBlank(transactionReqVo.getStartTaggingTime())){
-            queryWrapper.ge(AitagTagLogEntity::getInsertTime, transactionReqVo.getStartTaggingTime());
+        if (StringUtils.isNotBlank(aitagTagLogEntity.getStartTaggingTime())){
+            queryCount.ge(AitagTagLogEntity::getInsertTime, aitagTagLogEntity.getStartTaggingTime());
         }
-        if (StringUtils.isNotBlank(transactionReqVo.getEndTaggingTime())){
-            queryWrapper.le(AitagTagLogEntity::getInsertTime, transactionReqVo.getEndTaggingTime());
+        if (StringUtils.isNotBlank(aitagTagLogEntity.getEndTaggingTime())){
+            queryCount.le(AitagTagLogEntity::getInsertTime, aitagTagLogEntity.getEndTaggingTime());
         }
-        if (StringUtils.isNotBlank(transactionReqVo.getLoanApplicationNo())){
-            queryWrapper.le(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
+        if (StringUtils.isNotBlank(aitagTagLogEntity.getLoanApplicationNo())){
+            queryCount.le(AitagTagLogEntity::getBusinessAttr, aitagTagLogEntity.getLoanApplicationNo());
         }
-        return this.baseMapper.selectPage(new Page<>(transactionReqVo.getPage() == null?0:transactionReqVo.getPage(),
-                transactionReqVo.getSize() == null?10:transactionReqVo.getSize()),queryWrapper);
+        return this.baseMapper.selectPage(new Page<>(aitagTagLogEntity.getPage(),
+                aitagTagLogEntity.getSize()),queryCount);
     }
 
     @Override
@@ -142,9 +150,12 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
     private String getTagPath(String result) {
         List<Map> results = JSONArray.parseArray(result, Map.class);
         for (Map resultMap: results){
-            String tagId = resultMap.getOrDefault("id","").toString();
-            AitagTagInfoEntity aitagTagInfoEntity = tagInfoDao.selectById(tagId);
-            if(aitagTagInfoEntity!=null){
+            String tagCode = resultMap.getOrDefault("tag_code","").toString();
+            LambdaQueryWrapper<AitagTagInfoEntity> queryCount = new LambdaQueryWrapper<>();
+            queryCount.eq(AitagTagInfoEntity::getTagCode,tagCode);
+            List<AitagTagInfoEntity> aitagTagInfoEntities = tagInfoDao.selectList(queryCount);
+            if(!aitagTagInfoEntities.isEmpty()){
+                AitagTagInfoEntity aitagTagInfoEntity = aitagTagInfoEntities.get(0);
                 resultMap.put("tag_path",aitagTagInfoEntity.getTagPath());
             }
         }
@@ -156,25 +167,6 @@ public class AitagTagLogServiceImpl extends ServiceImpl<AitagTagLogDao, AitagTag
         return aggDao.selectTagDistStats(resultVo);
     }
 
-    @Override
-    public List<AitagTagLogEntity> queryList(TaggingTransactionReqVo transactionReqVo) {
-        LambdaQueryWrapper<AitagTagLogEntity> queryCount = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotBlank(transactionReqVo.getCategoryCode())) {
-            queryCount.eq(AitagTagLogEntity::getCategoryCode, transactionReqVo.getCategoryCode());
-        }
-        if (StringUtils.isNotBlank(transactionReqVo.getStartTaggingTime())){
-            queryCount.ge(AitagTagLogEntity::getInsertTime, transactionReqVo.getStartTaggingTime());
-        }
-        if (StringUtils.isNotBlank(transactionReqVo.getEndTaggingTime())){
-            queryCount.le(AitagTagLogEntity::getInsertTime, transactionReqVo.getEndTaggingTime());
-        }
-        if (StringUtils.isNotBlank(transactionReqVo.getLoanApplicationNo())){
-            queryCount.le(AitagTagLogEntity::getBusinessAttr, transactionReqVo.getLoanApplicationNo());
-        }
-        return this.baseMapper.selectList(queryCount);
-    }
-
-
 
     /**
      * 计算准确率

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

@@ -0,0 +1,118 @@
+package cn.com.yusys.yusp.service.impl;
+
+import cn.com.yusys.yusp.condition.AuthEnabledCondition;
+import cn.com.yusys.yusp.domain.dto.LoginRequestDto;
+import cn.com.yusys.yusp.domain.entity.AitagUser;
+import cn.com.yusys.yusp.domain.vo.LoginResponseVo;
+import cn.com.yusys.yusp.mapper.AitagUserMapper;
+import cn.com.yusys.yusp.service.AuthService;
+import cn.com.yusys.yusp.util.JwtUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.stereotype.Service;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 认证服务实现类
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Slf4j
+@Service
+@Conditional(AuthEnabledCondition.class)
+public class AuthServiceImpl implements AuthService {
+
+    @Autowired
+    private AitagUserMapper userMapper;
+
+    @Autowired
+    private JwtUtil jwtUtil;
+
+    @Value("${jwt.expiration:86400000}")
+    private Long expiration;
+
+    // 存储在线用户的token(简单实现,生产环境建议使用Redis)
+    private final ConcurrentHashMap<String, String> onlineUsers = new ConcurrentHashMap<>();
+
+    @Override
+    public LoginResponseVo login(LoginRequestDto loginRequest) {
+        String userId = loginRequest.getUserId();
+        String password = loginRequest.getPassword();
+
+        log.info("用户尝试登录: {}", userId);
+
+        // 验证用户是否存在
+        AitagUser user = getUserById(userId);
+        if (user == null) {
+            log.warn("用户不存在: {}", userId);
+            throw new RuntimeException("用户名或密码错误");
+        }
+
+        // 验证密码
+        if (!validatePassword(userId, password)) {
+            log.warn("密码错误: {}", userId);
+            throw new RuntimeException("用户名或密码错误");
+        }
+
+        // 生成token
+        String token = jwtUtil.generateToken(userId, user.getRole());
+
+        // 记录在线用户
+        onlineUsers.put(userId, token);
+
+        log.info("用户登录成功: {}, 角色: {}", userId, user.getRole());
+
+        return LoginResponseVo.success(
+                token,
+                user.getUserId(),
+                user.getUserName(),
+                user.getRole(),
+                expiration
+        );
+    }
+
+    @Override
+    public void logout(String userId) {
+        log.info("用户登出: {}", userId);
+        onlineUsers.remove(userId);
+    }
+
+    @Override
+    public AitagUser getUserById(String userId) {
+        return userMapper.selectByUserId(userId);
+    }
+
+    @Override
+    public boolean validatePassword(String userId, String password) {
+        AitagUser user = getUserById(userId);
+        if (user == null) {
+            return false;
+        }
+        // 简单的密码比较,实际项目中应该使用加密存储
+        return user.getPassword() != null && user.getPassword().equals(password);
+    }
+
+    /**
+     * 检查用户是否在线
+     *
+     * @param userId 用户ID
+     * @return 是否在线
+     */
+    public boolean isUserOnline(String userId) {
+        return onlineUsers.containsKey(userId);
+    }
+
+    /**
+     * 获取用户的当前token
+     *
+     * @param userId 用户ID
+     * @return token
+     */
+    public String getUserToken(String userId) {
+        return onlineUsers.get(userId);
+    }
+}

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

@@ -0,0 +1,199 @@
+package cn.com.yusys.yusp.service.impl;
+
+import cn.com.yusys.yusp.config.FastApiConfig;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingFeedbackRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingQueryRequestDto;
+import cn.com.yusys.yusp.domain.dto.fastapidto.AiTaggingRequestDto;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingQueryResponseVo;
+import cn.com.yusys.yusp.domain.vo.fastapivo.AiTaggingResponseVo;
+import cn.com.yusys.yusp.service.FastApiService;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+public class FastApiServiceImpl implements FastApiService {
+
+    @Autowired
+    private FastApiConfig fastApiConfig;
+
+    private static final String TAGGING_PATH = "/aitag/v1/tagging";
+    private static final String QUERY_PATH = "/aitag/v1/query";
+    private static final String FEEDBACK_PATH = "/aitag/v1/feedback";
+
+    @Override
+    public AiTaggingResponseVo tagging(AiTaggingRequestDto request) {
+        String url = fastApiConfig.getUrl() + TAGGING_PATH;
+        log.info("调用AI打标接口: {}", url);
+
+        try (CloseableHttpClient httpClient = createHttpClient()) {
+            HttpPost httpPost = new HttpPost(url);
+            httpPost.setHeader("Content-Type", "application/json");
+
+            // 构造请求体
+            String requestBody = JSON.toJSONString(request);
+            httpPost.setEntity(new StringEntity(requestBody, "UTF-8"));
+
+            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
+                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
+                log.info("AI打标接口响应: {}", responseBody);
+
+                return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
+            }
+        } catch (Exception e) {
+            log.error("调用AI打标接口失败", e);
+            AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
+            errorResponse.setCode("500");
+            errorResponse.setMessage("调用AI打标接口失败: " + e.getMessage());
+            return errorResponse;
+        }
+    }
+
+    @Override
+    public AiTaggingQueryResponseVo query(AiTaggingQueryRequestDto request) {
+        StringBuilder urlBuilder = new StringBuilder(fastApiConfig.getUrl()).append(QUERY_PATH);
+
+        // 只添加非空参数
+        boolean hasParams = false;
+
+        if (request.getAppId() != null && !request.getAppId().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("appId=").append(encodeParam(request.getAppId()));
+            hasParams = true;
+        }
+
+        if (request.getTimestamp() != null && !request.getTimestamp().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("timestamp=").append(encodeParam(request.getTimestamp()));
+            hasParams = true;
+        }
+
+        if (request.getSign() != null && !request.getSign().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("sign=").append(encodeParam(request.getSign()));
+            hasParams = true;
+        }
+
+        // businessAttr是必填参数,直接添加
+        urlBuilder.append(hasParams ? "&" : "?").append("businessAttr=").append(encodeParam(request.getBusinessAttr()));
+
+        String url = urlBuilder.toString();
+        log.info("调用AI打标查询接口: {}", url);
+        try (CloseableHttpClient httpClient = createHttpClient()) {
+            HttpGet httpGet = new HttpGet(url);
+
+            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
+                log.info("AI打标查询接口响应: {}", responseBody);
+
+                return JSON.parseObject(responseBody, AiTaggingQueryResponseVo.class);
+            }
+        } catch (Exception e) {
+            log.error("调用AI打标查询接口失败", e);
+            AiTaggingQueryResponseVo errorResponse = new AiTaggingQueryResponseVo();
+            errorResponse.setCode("500");
+            errorResponse.setMessage("调用AI打标查询接口失败: " + e.getMessage());
+            return errorResponse;
+        }
+    }
+
+    @Override
+    public AiTaggingResponseVo feedback(AiTaggingFeedbackRequestDto request) {
+        StringBuilder urlBuilder = new StringBuilder(fastApiConfig.getUrl()).append(FEEDBACK_PATH);
+
+        // 构造GET请求参数
+        boolean hasParams = false;
+
+        if (request.getUserId() != null && !request.getUserId().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("user_id=").append(encodeParam(request.getUserId()));
+            hasParams = true;
+        }
+
+        if (request.getUserNm() != null && !request.getUserNm().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("user_nm=").append(encodeParam(request.getUserNm()));
+            hasParams = true;
+        }
+
+        // feedback是必填参数
+        urlBuilder.append(hasParams ? "&" : "?").append("feedback=").append(encodeParam(request.getFeedback()));
+        hasParams = true;
+
+        if (request.getContractNo() != null && !request.getContractNo().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("contract_no=").append(encodeParam(request.getContractNo()));
+            hasParams = true;
+        }
+
+        if (request.getUserOrg() != null && !request.getUserOrg().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("user_org=").append(encodeParam(request.getUserOrg()));
+            hasParams = true;
+        }
+
+        if (request.getUserEndpoint() != null && !request.getUserEndpoint().isEmpty()) {
+            urlBuilder.append(hasParams ? "&" : "?").append("user_endpoint=").append(encodeParam(request.getUserEndpoint()));
+            hasParams = true;
+        }
+
+        // business_attr是必填参数
+        urlBuilder.append(hasParams ? "&" : "?").append("business_attr=").append(encodeParam(request.getBusinessAttr()));
+
+        String url = urlBuilder.toString();
+        log.info("调用AI打标反馈接口: {}", url);
+
+        try (CloseableHttpClient httpClient = createHttpClient()) {
+            HttpGet httpGet = new HttpGet(url);
+
+            try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
+                String responseBody = EntityUtils.toString(response.getEntity(), "UTF-8");
+                log.info("AI打标反馈接口响应: {}", responseBody);
+
+                return JSON.parseObject(responseBody, AiTaggingResponseVo.class);
+            }
+        } catch (Exception e) {
+            log.error("调用AI打标反馈接口失败", e);
+            AiTaggingResponseVo errorResponse = new AiTaggingResponseVo();
+            errorResponse.setCode("500");
+            errorResponse.setMessage("调用AI打标反馈接口失败: " + e.getMessage());
+            return errorResponse;
+        }
+    }
+
+
+    // 辅助方法用于URL编码
+    private String encodeParam(String param) {
+        try {
+            return URLEncoder.encode(param, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            log.warn("URL编码失败,使用原始值: {}", param);
+            return param;
+        }
+    }
+
+    /**
+     * 创建HTTP客户端
+     */
+    private CloseableHttpClient createHttpClient() {
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setConnectTimeout(fastApiConfig.getConnectTimeout())
+                .setSocketTimeout(fastApiConfig.getReadTimeout())
+                .build();
+
+        return HttpClients.custom()
+                .setDefaultRequestConfig(requestConfig)
+                .build();
+    }
+}

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

@@ -0,0 +1,81 @@
+package cn.com.yusys.yusp.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 认证上下文工具类
+ * 用于存储当前线程的用户信息
+ *
+ * @author AI助手
+ * @date 2026-02-27
+ */
+@Slf4j
+public class AuthContextUtil {
+
+    private static final ThreadLocal<String> currentUser = new ThreadLocal<>();
+    private static final ThreadLocal<String> currentRole = new ThreadLocal<>();
+    private static final ThreadLocal<String> currentUserName = new ThreadLocal<>(); // 新增:存储用户名
+
+    /**
+     * 设置当前用户
+     *
+     * @param userId 用户ID
+     */
+    public static void setCurrentUser(String userId) {
+        currentUser.set(userId);
+    }
+
+    /**
+     * 获取当前用户
+     *
+     * @return 用户ID
+     */
+    public static String getCurrentUser() {
+        return currentUser.get();
+    }
+
+    /**
+     * 设置当前用户角色
+     *
+     * @param role 用户角色
+     */
+    public static void setCurrentRole(String role) {
+        currentRole.set(role);
+    }
+
+    /**
+     * 获取当前用户角色
+     *
+     * @return 用户角色
+     */
+    public static String getCurrentRole() {
+        return currentRole.get();
+    }
+
+    /**
+     * 设置当前用户名
+     *
+     * @param userName 用户名
+     */
+    public static void setCurrentUserName(String userName) {
+        currentUserName.set(userName);
+    }
+
+    /**
+     * 获取当前用户名
+     *
+     * @return 用户名
+     */
+    public static String getCurrentUserName() {
+        return currentUserName.get();
+    }
+
+    /**
+     * 清除当前线程的用户信息
+     */
+    public static void clear() {
+        currentUser.remove();
+        currentRole.remove();
+        currentUserName.remove(); // 新增:清除用户名
+    }
+}

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

@@ -0,0 +1,126 @@
+package cn.com.yusys.yusp.util;
+
+import cn.com.yusys.yusp.condition.AuthEnabledCondition;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm; // 0.9.1 使用这个枚举
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * JWT工具类 (适配 JJWT 0.9.1)
+ *
+ * @author 2643616413
+ * @date 2026-02-27
+ */
+@Slf4j
+@Component
+@Conditional(AuthEnabledCondition.class)
+public class JwtUtil {
+
+    @Value("${jwt.secret:yusp-tagging-secret-key}")
+    private String secret;
+
+    @Value("${jwt.expiration:86400000}")
+    private Long expiration;
+
+    /**
+     * 生成JWT token
+     */
+    public String generateToken(String userId, String role) {
+        Map<String, Object> claims = new HashMap<>();
+        claims.put("userId", userId);
+        claims.put("role", role);
+        return createToken(claims, userId);
+    }
+
+    /**
+     * 创建token
+     */
+    private String createToken(Map<String, Object> claims, String subject) {
+        Date now = new Date();
+        Date expiryDate = new Date(now.getTime() + expiration);
+
+        return Jwts.builder()
+                .setClaims(claims)
+                .setSubject(subject)
+                .setIssuedAt(now)
+                .setExpiration(expiryDate)
+                // 0.9.1 的 signWith 签名算法在前,密钥在后,且密钥可以是 String
+                .signWith(SignatureAlgorithm.HS512, secret)
+                .compact();
+    }
+
+    /**
+     * 验证token有效性
+     */
+    public Boolean validateToken(String token) {
+        try {
+            Claims claims = getClaimsFromToken(token);
+            Date expiration = claims.getExpiration();
+            return !expiration.before(new Date());
+        } catch (Exception e) {
+            log.warn("JWT token验证失败:{}", e.getMessage());
+            return false;
+        }
+    }
+
+    /**
+     * 从token中获取用户ID
+     */
+    public String getUserIdFromToken(String token) {
+        try {
+            Claims claims = getClaimsFromToken(token);
+            return claims.get("userId", String.class);
+        } catch (Exception e) {
+            log.warn("从token获取用户ID失败:{}", e.getMessage());
+            return null;
+        }
+    }
+
+    /**
+     * 从token中获取用户角色
+     */
+    public String getRoleFromToken(String token) {
+        try {
+            Claims claims = getClaimsFromToken(token);
+            return claims.get("role", String.class);
+        } catch (Exception e) {
+            log.warn("从token获取用户角色失败:{}", e.getMessage());
+            return null;
+        }
+    }
+
+    /**
+     * 从token中获取声明 (0.9.1 写法)
+     */
+    private Claims getClaimsFromToken(String token) {
+        // 修改点 3: 0.9.1 没有 parserBuilder(),直接使用 parser()
+        // 修改点 4: setSigningKey 直接接受 String secret
+        return Jwts.parser()
+                .setSigningKey(secret)
+                .parseClaimsJws(token)
+                .getBody();
+    }
+
+    /**
+     * 刷新token
+     */
+    public String refreshToken(String token) {
+        try {
+            Claims claims = getClaimsFromToken(token);
+            String userId = claims.getSubject();
+            String role = claims.get("role", String.class);
+            return generateToken(userId, role);
+        } catch (Exception e) {
+            log.warn("刷新token失败:{}", e.getMessage());
+            return null;
+        }
+    }
+}

+ 12 - 0
server/yusp-tagging-core/src/main/resources/mapper/AitagTagCategoryMapper.xml

@@ -59,4 +59,16 @@
     <select id="selectCountAll" resultType="long">
         SELECT COUNT(*) FROM aitag_tag_category WHERE is_delete = 0
     </select>
+
+    <!-- 分页查询已启用的标签体系 -->
+    <select id="selectPageEnabledCategories" resultType="cn.com.yusys.yusp.domain.entity.AitagTagCategory">
+        SELECT * FROM aitag_tag_category
+        WHERE is_delete = 0 AND state = 0
+            LIMIT #{offset}, #{limit}
+    </select>
+
+    <!-- 统计已启用标签体系的数量 -->
+    <select id="selectCountEnabled" resultType="long">
+        SELECT COUNT(*) FROM aitag_tag_category WHERE is_delete = 0 AND state = 0
+    </select>
 </mapper>

+ 3 - 60
server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoMapper.xml

@@ -7,69 +7,12 @@
         <result column="tag_nm" jdbcType="VARCHAR" property="tagNm"/>
         <result column="tag_code" jdbcType="VARCHAR" property="tagCode"/>
         <result column="tag_remark" jdbcType="VARCHAR" property="tagRemark"/>
-        <result column="parent_id" jdbcType="VARCHAR" property="parentId"/>
+        <result column="parent_code" jdbcType="VARCHAR" property="parentCode"/>
         <result column="reg" jdbcType="VARCHAR" property="reg"/>
         <result column="level" jdbcType="INTEGER" property="level"/>
         <result column="tag_path" jdbcType="VARCHAR" property="tagPath"/>
+        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
+        <result column="state" jdbcType="INTEGER" property="state"/>
         <result column="tag_prompt" jdbcType="VARCHAR" property="tagPrompt"/>
-        <result column="tag_version" jdbcType="VARCHAR" property="tagVersion"/>
-        <result column="revision_time" jdbcType="VARCHAR" property="revisionTime"/>
-        <result column="reviser" jdbcType="VARCHAR" property="reviser"/>
     </resultMap>
-
-
-    <resultMap id="tagInfo" type="cn.com.yusys.yusp.domain.dto.TagInfoDto" extends="aitagTagInfo">
-        <collection property="tagInfoVersionDtos" ofType="cn.com.yusys.yusp.domain.dto.TagInfoVersionDto">
-            <id property="id" column="version_id"/>
-            <result property="categoryId" column="version_category_id"/>
-            <result property="tagNm" column="version_tag_nm"/>
-            <result property="tagCode" column="version_tag_code"/>
-            <result property="tagRemark" column="version_tag_remark"/>
-            <result property="parentId" column="version_parent_id"/>
-            <result property="reg" column="version_reg"/>
-            <result property="level" column="version_level"/>
-            <result property="tagPath" column="version_tag_path"/>
-            <result property="tagPrompt" column="version_tag_prompt"/>
-            <result property="tagVersion" column="version_tag_version"/>
-            <result property="revisionTime" column="version_revision_time"/>
-            <result property="reviser" column="version_reviser"/>
-        </collection>
-    </resultMap>
-
-
-    <select id="selectTagInfo" resultMap="tagInfo">
-        SELECT
-            ti.id,
-            ti.category_id,
-            ti.tag_nm,
-            ti.tag_code,
-            ti.tag_remark,
-            ti.parent_id,
-            ti.reg,
-            ti.level,
-            ti.tag_path,
-            ti.tag_prompt,
-            ti.tag_version,
-            ti.revision_time,
-            ti.reviser,
-            tiv.id AS version_id,
-            tiv.category_id AS version_category_id,
-            tiv.tag_nm AS version_tag_nm,
-            tiv.tag_code AS version_tag_code,
-            tiv.tag_remark AS version_tag_remark,
-            tiv.parent_id AS version_parent_id,
-            tiv.reg AS version_reg,
-            tiv.level AS version_level,
-            tiv.tag_path AS version_tag_path,
-            tiv.tag_prompt AS version_tag_prompt,
-            tiv.tag_version AS version_tag_version,
-            tiv.revision_time AS version_revision_time,
-            tiv.reviser AS version_reviser
-        FROM aitag_tag_info ti
-                 LEFT JOIN (SELECT *
-                            FROM aitag_tag_info_version
-                            WHERE is_delete = '0')  tiv ON ti.tag_code = tiv.tag_code
-        where ti.id= #{id}
-    </select>
-
 </mapper>

+ 0 - 21
server/yusp-tagging-core/src/main/resources/mapper/AitagTagInfoVersionMapper.xml

@@ -1,21 +0,0 @@
-<?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.AitagTagInfoVersionDao">
-    <resultMap id="aitagTagInfoVersion" type="cn.com.yusys.yusp.domain.entity.AitagTagInfoVersionEntity">
-        <id column="id" jdbcType="VARCHAR" property="id"/>
-        <result column="category_id" jdbcType="VARCHAR" property="categoryId"/>
-        <result column="tag_nm" jdbcType="VARCHAR" property="tagNm"/>
-        <result column="tag_code" jdbcType="VARCHAR" property="tagCode"/>
-        <result column="tag_remark" jdbcType="LONGVARCHAR" property="tagRemark"/>
-        <result column="parent_id" jdbcType="VARCHAR" property="parentId"/>
-        <result column="reg" jdbcType="LONGVARCHAR" property="reg"/>
-        <result column="level" jdbcType="INTEGER" property="level"/>
-        <result column="tag_path" jdbcType="VARCHAR" property="tagPath"/>
-        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
-        <result column="state" jdbcType="INTEGER" property="state"/>
-        <result column="tag_prompt" jdbcType="VARCHAR" property="tagPrompt"/>
-        <result column="tag_version" jdbcType="VARCHAR" property="tagVersion"/>
-        <result column="revision_time" jdbcType="VARCHAR" property="revisionTime"/>
-        <result column="reviser" jdbcType="VARCHAR" property="reviser"/>
-    </resultMap>
-</mapper>

+ 3 - 5
server/yusp-tagging-core/src/main/resources/mapper/AitagTagLogMapper.xml

@@ -18,15 +18,13 @@
         <result column="state" jdbcType="INTEGER" property="state"/>
         <result column="consuming_time" jdbcType="LONGVARCHAR" property="consumingTime"/>
         <result column="category_code" jdbcType="VARCHAR" property="categoryCode"/>
-        <result column="reg_result" jdbcType="VARCHAR" property="regResult"/>
-        <result column="feedback_user_org" jdbcType="VARCHAR" property="feedbackUserOrg"/>
-        <result column="feedback_user_endpoint" jdbcType="VARCHAR" property="feedbackUserEndpoint"/>
     </resultMap>
 
 
-    <select id="selectTagCount" parameterType="cn.com.yusys.yusp.domain.vo.SmartTaggingResultVo">
+    <select id="selectTagCount" resultType="cn.com.yusys.yusp.domain.dto.TagSumDto" parameterType="cn.com.yusys.yusp.domain.vo.SmartTaggingResultVo">
         SELECT
-        COUNT(1) as totalCount
+        COUNT(1) as totalCount,
+        SUM(consuming_time) as totalDuration
         FROM aitag_tag_log
         <where>
             <if test="startTaggingTime != null and startTaggingTime != ''">

+ 10 - 0
server/yusp-tagging-core/src/main/resources/mapper/AitagUserMapper.xml

@@ -0,0 +1,10 @@
+<?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.AitagUserMapper">
+
+    <select id="selectByUserId" resultType="cn.com.yusys.yusp.domain.entity.AitagUser">
+        SELECT * FROM aitag_user
+        WHERE user_id = #{userId}
+    </select>
+
+</mapper>

+ 1 - 2
server/yusp-tagging-core/src/main/resources/messages/yusp_input_msg.properties

@@ -97,5 +97,4 @@ REQUEST_PARAMETER_CANNOT_BE_EMPTY=\u8BF7\u6C42\u53C2\u6570\u4E0D\u80FD\u4E3A\u7A
 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
-NO_DATA_PERIOD=\u8BE5\u7EDF\u8BA1\u5468\u671F\u6682\u672A\u5B9E\u73B0
-E001=\u6240\u5C5E\u5927\u7C7B\u4E0D\u80FD\u4E3A\u7A7A
+NO_DATA_PERIOD=\u8BE5\u7EDF\u8BA1\u5468\u671F\u6682\u672A\u5B9E\u73B0

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

@@ -210,13 +210,6 @@
             <version>5.3.33</version>
         </dependency>
 
-    <!-- EasyExcel 依赖 -->
-    <dependency>
-        <groupId>com.alibaba</groupId>
-        <artifactId>easyexcel</artifactId>
-        <version>3.3.4</version>
-    </dependency>
-
     </dependencies>
 
     <build>

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

@@ -1,24 +1,39 @@
 package cn.com.yusys.yusp.detail;
 
 
-import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-import java.net.URL;
 
 @EnableDiscoveryClient
 @SpringBootApplication(scanBasePackages = {"cn.com.yusys.yusp"})
 @MapperScan("cn.com.yusys.yusp.mapper")
 @EnableScheduling
-@EnableTransactionManagement
 public class App {
     public static void main(String[] args) {
+        // --- 新增诊断代码开始 ---
+        try {
+            // 尝试强制加载 Claims 类
+            Class.forName("io.jsonwebtoken.Claims");
+            System.out.println(">>> [DIAGNOSTIC] SUCCESS: io.jsonwebtoken.Claims is in classpath!");
+
+            // 打印该类来自哪个 Jar 包
+            String location = Class.forName("io.jsonwebtoken.Claims")
+                    .getProtectionDomain()
+                    .getCodeSource()
+                    .getLocation()
+                    .toString();
+            System.out.println(">>> [DIAGNOSTIC] Loaded from: " + location);
+
+        } catch (ClassNotFoundException e) {
+            System.err.println(">>> [DIAGNOSTIC] FATAL: io.jsonwebtoken.Claims NOT found in classpath!");
+            System.err.println(">>> [DIAGNOSTIC] Current Thread Context ClassLoader: " + Thread.currentThread().getContextClassLoader());
+            e.printStackTrace();
+        }
+        // --- 新增诊断代码结束 ---
+
         SpringApplication.run(App.class, args);
     }
-
 }

+ 15 - 1
server/yusp-tagging-starter/src/main/resources/application.yml

@@ -56,4 +56,18 @@ management:
 
 mybatis-plus:
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台输出
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台输出
+
+fastapi:
+  service:
+    url: http://10.192.72.13:9876  # 你的FastAPI服务地址
+    timeout: 10000  # 请求超时时间
+
+# 认证配置
+auth:
+  enabled: false  # 认证开关,true为开启,false为关闭
+
+# JWT配置
+jwt:
+  secret: yusp-tagging-secret-key-for-jwt-token-generation-and-validation-2026
+  expiration: 86400000  # token过期时间(毫秒),默认24小时

+ 5 - 6
web/.editorconfig

@@ -1,15 +1,14 @@
+# https://editorconfig.org
 root = true
 
 [*]
+charset = utf-8
 indent_style = space
+indent_size = 2
 end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
 insert_final_newline = true
+trim_trailing_whitespace = true
 
 [*.md]
-max_line_length = off
+insert_final_newline = false
 trim_trailing_whitespace = false
-
-[*.{ts,js,vue,css}]
-indent_size = 2

+ 0 - 8
web/.env

@@ -1,8 +0,0 @@
-# 项目本地运行端口号
-VITE_APP_DEV_PORT = 8000
-
-# 前端静态资源打包路径
-VITE_APP_BASE_URL = ./
-
-# 是否开启微服务
-VITE_APP_MICRO_SERVER = true

+ 0 - 15
web/.env.development

@@ -1,15 +0,0 @@
-# 开发环境服务地址/网关地址
-# VITE_APP_BASE_API = http://110.16.193.170:20011
-VITE_APP_BASE_API = http://10.192.72.13:9195
-# VITE_APP_BASE_API = http://10.192.72.13:22227
-
-# yusp-uaa yusp-oca服务相关接口走本地mock服务 支持配置多个地址,分隔
-# VITE_APP_BASE_AUTH = http://110.16.193.170:20011
-VITE_APP_BASE_AUTH = http://10.192.72.13:9195
-# VITE_APP_BASE_AUTH = http://10.192.72.13:22227
-
-# 开发环境登录相关代理前缀
-VITE_APP_PROXY_API = /yusp-flow,/cdp-oca,/bj-npam-starter,/account,/session,/oauth,/swagger-resources,/v2/api-docs,/zzh-api,/yusp-ai
-
-# 开发环境代理shuffle业务功能接口代理前缀
-VITE_APP_PROXY_SHUFFLE = /api

+ 37 - 2
web/.env.production

@@ -1,2 +1,37 @@
-# 开发环境服务地址/网关地址
-VITE_APP_BASE_API = ''
+# 环境标识,生产环境
+ENV = 'production'
+VUE_APP_ENV = 'production'
+
+# 生产模式
+NODE_ENV = production
+
+# APP应用若计划部署在应用服务器子目录,则需要设置publicPath,
+# 例如:你计划部署在GitHub Pages上,访问路径为:https://your.github.io/app/,则你此处应配置为:'/app/'
+# 默认配置为根:'/'
+VUE_APP_PUBLIC_PATH = ''
+
+# 应用服务前缀URL
+# 1) 指定应用模式,Protocol(http/https)+IP+PORT。如:'https://172.16.20.92:8102/xyapp'
+# 2) 本地应用模式,前后端部署在一起。如:'' 或者 '/xyapp'
+
+#山西环境(开发)--使用老服务
+#VUE_APP_BASE_API = 'http://172.168.165.159:30503'
+#山西环境(测试)--使用新服务
+#VUE_APP_BASE_API = 'http://172.168.168.125:30503'
+#金融云环境
+#VUE_APP_BASE_API = 'http://192.168.51.16:8000'
+#金华环境
+#VUE_APP_BASE_API = 'http://21.5.130.72:18503'
+#金华环境
+#VUE_APP_BASE_API = 'http://21.5.4.14:18503'
+#五矿演示
+# VUE_APP_BASE_API = 'http://192.168.42.7:12022'
+#五矿信托
+VUE_APP_BASE_API = ''
+
+
+# Mock模拟数据,true启用,false禁用
+# 为测试部署,保留mock
+VUE_APP_MOCK_ENABLE = false
+# Mock模拟方式,是否真实服务模拟: true 使用express模拟, false 使用XHR拦截模拟。生产环境只能配置为false。
+VUE_APP_MOCK_MODE = false

+ 22 - 0
web/.env.staging

@@ -0,0 +1,22 @@
+# 环境标识,自定义环境
+ENV = 'staging'
+VUE_APP_ENV = 'staging'
+
+# 生产模式
+NODE_ENV = production
+
+# APP应用若计划部署在应用服务器子目录,则需要设置publicPath,
+# 例如:你计划部署在GitHub Pages上,访问路径为:https://your.github.io/app/,则你此处应配置为:'/app/'
+# 默认配置为根:'/'
+VUE_APP_PUBLIC_PATH = ''
+
+# 应用服务前缀URL
+# 1) 指定应用模式,Protocol(http/https)+IP+PORT。如:'https://172.16.20.92:8102/xyapp'
+# 2) 本地应用模式,前后端部署在一起。如:'' 或者 '/xyapp'
+
+VUE_APP_BASE_API = ''
+
+# Mock模拟数据,true启用,false禁用
+VUE_APP_MOCK_ENABLE = false
+# Mock模拟方式,是否真实服务模拟: true 使用express模拟, false 使用XHR拦截模拟。生产环境只能配置为false。
+VUE_APP_MOCK_MODE = false

+ 5 - 17
web/.eslintignore

@@ -1,18 +1,6 @@
-dist
-node_modules
-!.prettierrc.js
-components.d.ts
-auto-imports.d.ts
-.*
-*.min.js
-src/utils
-src/components
-src/router
-src/config
-src/store
-src/views/pagefactory
-src/views/framework
+build/*.js
+src/assets
+src/*
 public
-src/views/@xdjf/oca-web/config
-src/views/@xdjf/oca-web/views/xpOca
-src/views/@xdjf/card/components/xtableHeaderDrag
+dist
+src/locale

+ 106 - 140
web/.eslintrc.js

@@ -1,105 +1,62 @@
-const { defineConfig } = require('eslint-define-config');
-
-module.exports = defineConfig({
+// https://eslint.org/docs/user-guide/configuring
+module.exports = {
   root: true,
+  parserOptions: {
+      parser: 'babel-eslint'
+  },
   env: {
-    browser: true,
+    browser: false,
     node: true,
-    jest: true,
     es6: true,
+    mocha: true
   },
   globals: {
-    RESP_CODE: true,
-    APP_CONST: true,
-    backend: true,
-    document: true,
-    localStorage: true,
-    window: true,
-    navigator: true,
-    yufp: true,
-    Image: true,
-    MICRO: true,
-    xp: true,
-    ctx: true,
+    'document': true,
+    'localStorage': true,
+    'window': true,
+    'navigator': true,
+    'yufp': true,
+    'Image': true,
+    'backend': true
   },
-  plugins: ['vue'],
-  parser: 'vue-eslint-parser',
-  parserOptions: {
-    ecmaVersion: 'latest',
-    sourceType: 'module',
-    allowImportExportEverywhere: true,
-    ecmaFeatures: {
-      jsx: true,
-    },
-    // parser: "@babel/eslint-parser",
-    requireConfigFile: false,
-  },
-  extends: [
-    'airbnb-base',
-    'eslint:recommended',
-    'plugin:vue/essential',
-    'plugin:vue/recommended',
-    'plugin:prettier/recommended',
-    'eslint:recommended',
+  // extends: [
+  //     // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
+  //     // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
+  //     'plugin:vue/essential',
+  //     // https://github.com/standard/standard/blob/master/docs/RULES-en.md
+  //     'standard'
+  // ],
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+  // required to lint *.vue files
+  plugins: [
+    'vue',
+    'html'
   ],
   // add your custom rules here
   rules: {
-    // 禁止使用多余的包
-    'import/no-extraneous-dependencies': 0,
-    // 确保在导入路径内一致使用文件扩展名
-    'import/extensions': 0,
-    // 确保导入指向可以解析的文件/模块
-    'import/no-unresolved': 0,
-    // 首选默认导出导入/首选默认导出
-    'import/prefer-default-export': 0,
-    // 要求使用 let 或 const 而不是 var
-    'no-var': 'error',
-    'no-loss-of-precision': 2,
-    'vue/no-lone-template': 'off',
-    // 禁止使用 new 以避免产生副作用
-    'no-new': 1,
-    // 禁止对 Function 对象使用 new 操作符
-    'no-new-func': 0,
-    // 禁止使用 Object 的构造函数
-    'no-new-object': 0,
-    // 禁止调用 require 时使用 new 操作符
-    'no-new-require': 2,
-    // 禁止 Symbol 的构造函数
-    'no-new-symbol': 1,
-    // 禁止对 String,Number 和 Boolean 使用 new 操作符
-    'no-new-wrappers': 0,
-    // 禁止变量声明与外层作用域的变量同名
-    'no-shadow': 0,
-    // 禁止覆盖受限制的标识符
-    'no-shadow-restricted-names': 2,
-    strict: 0,
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
-    'vue/max-attributes-per-line': [
-      2,
-      {
-        singleline: 10,
-        multiline: {
-          max: 1,
-          allowFirstLine: false,
-        },
-      },
-    ],
-    'vue/singleline-html-element-content-newline': 'off',
-    'vue/multiline-html-element-content-newline': 'off',
+    "no-console": process.env.NODE_ENV === "production" ? "error" : "off",
+    "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline": "off",
     // "vue/name-property-casing": ["error", "PascalCase"],
-    'vue/name-property-casing': 'off',
-    'vue/no-v-html': 'off',
-    'vue/valid-v-bind': 'off',
-    'vue/html-closing-bracket-newline': 'off',
+    "vue/name-property-casing": "off",
+    "vue/no-v-html": "off",
+    "vue/valid-v-bind": "off",
+    "vue/html-closing-bracket-newline": "off",
     // @fixable vue属性编写顺序
     // @off 没有必要限制
-    'vue/attributes-order': 'off',
-    'vue/html-self-closing': 'off',
-    'vue/require-default-prop': 'off',
-    'vue/attribute-hyphenation': 'off',
-    'vue/no-unused-components': 'off',
-    // 不支持template嵌套规则
-    'vue/no-useless-template-attributes': 'off',
+    "vue/attributes-order": "off",
+    "vue/html-self-closing": "off",
+    "vue/require-default-prop": "off",
+    "vue/attribute-hyphenation": "off",
+    "vue/no-unused-components": "off",
     // "vue/html-self-closing": ["error", {
     //   "html": {
     //     "void": "never",
@@ -124,19 +81,19 @@ module.exports = defineConfig({
     'arrow-body-style': 0,
     // 要求箭头函数的参数使用圆括号
     'arrow-parens': 0,
-    // 强制箭头函数的箭头前后使用一致的空格
-    'arrow-spacing': 'error',
+    // 要求箭头函数空格
+    'arrow-spacing': [2, {'before': true,'after': true}],
     // 强制把变量的使用限制在其定义的作用域范围内
     'block-scoped-var': 0,
     // 禁止或强制在单行代码块中使用空格(禁用)
     'block-spacing': 0,
     //强制使用一致的缩进 第二个参数为 'tab' 时,会使用tab,
     // if while function 后面的{必须与if在同一行,java风格。
-    'brace-style': [2, '1tbs', { allowSingleLine: true }],
+    'brace-style': [2, '1tbs', { 'allowSingleLine': true }],
     // require return statements after
     'callback-return': 0,
     // 双峰驼命名格式
-    camelcase: 0,
+    'camelcase': 2,
     // 注释 大写字母开头,不推荐 注释的代码会报错
     'capitalized-comments': 0,
     // 如果一个类方法没有使用this,它有时可以变成一个静态函数。如果将该方法转换为静态函数,那么调用该特定方法的类的实例也必须转换为静态调用
@@ -145,14 +102,14 @@ module.exports = defineConfig({
     // always-multiline:多行模式必须带逗号,单行模式不能带逗号
     // 'comma-dangle': [2, 'never'],
     // 控制逗号前后的空格
-    'comma-spacing': [2, { before: false, after: true }],
+    'comma-spacing': [2, {'before': false,'after': true}],
     // 控制逗号在行尾出现还是在行首出现 (默认行尾)
     // http: //eslint.org/docs/rules/comma-style
-    'comma-style': [2, 'last'],
+    'comma-style': [2,'last'],
     // 限制圈复杂度,也就是类似if else能连续接多少个
-    complexity: 0,
+    'complexity': 0,
     // 以方括号取对象属性时,[ 后面和 ] 前面是否需要空格, 可选参数 never, always
-    'computed-property-spacing': [2, 'never'],
+    'computed-property-spacing': [2,'never'],
     // 要求 return 语句要么总是指定返回的值,要么不指定
     'consistent-return': 0,
     // 用于指统一在回调函数中指向this的变量名,箭头函数中的this已经可以指向外层调用者,应该没卵用了
@@ -161,13 +118,13 @@ module.exports = defineConfig({
     // 强制在子类构造函数中用super()调用父类构造函数,TypeScrip的编译器也会提示
     'constructor-super': 0,
     // 强制所有控制语句使用一致的括号风格
-    curly: [0, 'all'],
+    'curly': [0,'all'],
     // switch 语句强制 default 分支,也可添加 // no default 注释取消此次警告
     'default-case': 2,
     // 强制object.key 中 . 的位置,参数:
     // property,'.'号应与属性在同一行
     // object, '.' 号应与对象名在同一行
-    'dot-location': [2, 'property'],
+    'dot-location': [2,'property'],
     // 强制使用.号取属性
     // 参数: allowKeywords:true 使用保留字做属性名时,只能使用.方式取属性
     // false 使用保留字做属性名时, 只能使用[]方式取属性 e.g [2, {'allowKeywords': false}]
@@ -176,9 +133,9 @@ module.exports = defineConfig({
     // 文件末尾强制换行
     'eol-last': 0,
     // 使用 === 替代 == allow-null允许null和undefined==
-    eqeqeq: [0, 'allow-null'],
+    'eqeqeq': [0, 'allow-null'],
     //强制 “for” 循环中更新子句的计数器朝着正确的方向移动
-    'for-direction': 'error',
+    'for-direction': "error",
     // 要求或禁止函数标识符与其调用之间的间隔
     'func-call-spacing': [0, 'always'],
     // 要求函数名称与它们所分配的变量或属性的名称相匹配
@@ -193,7 +150,7 @@ module.exports = defineConfig({
     // 在函数括号内强制执行一致的换行符
     'function-paren-newline': 0,
     // 强制 generator 函数中 * 号周围使用一致的空格
-    'generator-star-spacing': [2, { before: true, after: true }],
+    'generator-star-spacing': [2, {'before': true,'after': true}],
     // 强制在 getter 属性中出现一个 return 语句。每个 getter 都期望有返回值。
     'getter-return': 2,
     // 要求 require() 出现在顶层模块作用域中
@@ -201,7 +158,7 @@ module.exports = defineConfig({
     // 要求 for-in 循环中有一个 if 语句
     'guard-for-in': 0,
     // 要求回调函数中有容错处理
-    'handle-callback-err': [2, '^(err|error)$'],
+    'handle-callback-err': [2,'^(err|error)$'],
     // 禁止使用指定的标识符
     'id-blacklist': 0,
     // 强制标识符的最新和最大长度
@@ -211,7 +168,7 @@ module.exports = defineConfig({
     // 强制执行箭头函数体的位置,一个箭头函数体可以包含一个隐式返回,而不是一个块体。对隐式返回的表达式执行一致的位置可能很有用。
     'implicit-arrow-linebreak': 0,
     // 强制执行一致的缩进
-    indent: ['error', 2, { SwitchCase: 1 }], // 强制 switch 语句中的 case 子句的缩进水平(默认:0)
+    'indent': [2, 2, {'SwitchCase': 1}], // 强制 switch 语句中的 case 子句的缩进水平(默认:0) 
     // 要求或禁止 var 声明中的初始化(初值)
     'init-declarations': 0,
     // 强制在 JSX 属性中一致地使用双引号或单引号
@@ -231,9 +188,9 @@ module.exports = defineConfig({
     // 要求或禁止class成员之间的空行
     'lines-between-class-members': 0,
     // 强制执行嵌套块的最大深度,以降低代码复杂度。"max"(默认为4)
-    'max-depth': [2, 10],
+    'max-depth': [2,10],
     // 强制一行的最大长度
-    'max-len': 0,
+    'max-len': [1, 2000, { 'ignoreTemplateLiterals': true }],
     // 强制最大行数
     'max-lines': 0,
     // 强制回调函数最大嵌套深度 5层
@@ -312,8 +269,8 @@ module.exports = defineConfig({
     'no-dupe-keys': 2,
     // 禁止重复的 case 标签
     'no-duplicate-case': 2,
-    // 禁止重复模块导入
-    'no-duplicate-imports': 'error',
+    // 不允许复制模块的进口
+    'no-duplicate-imports': 2,
     // 禁止 if 语句中有 return 之后有 else
     'no-else-return': 0,
     // 禁止空语句块
@@ -360,7 +317,7 @@ module.exports = defineConfig({
     // 禁止在代码行后使用内联注释
     'no-inline-comments': 0,
     // 禁止在嵌套的块中出现 function 或 var 声明
-    'no-inner-declarations': [0, 'both'],
+    'no-inner-declarations': [0,'both'],
     // 禁止 RegExp 构造函数中无效的正则表达式字符串
     'no-invalid-regexp': 2,
     // 禁止 this 关键字出现在类和类对象之外
@@ -395,13 +352,25 @@ module.exports = defineConfig({
     // 禁止使用多行字符串,在 JavaScript 中,可以在新行之前使用斜线创建多行字符串
     'no-multi-str': 0,
     // 不允许多个空行
-    'no-multiple-empty-lines': [2, { max: 2 }],
+    'no-multiple-empty-lines': [2, {'max': 2}],
     // 不允许否定的表达式
     'no-negated-condition': 0,
     // 禁止在 in 表达式中出现否定的左操作数
     'no-negated-in-lhs': 0,
     // 不允许使用嵌套的三元表达式 var foo = bar ? baz : qux === quxx ? bing : bam;
     'no-nested-ternary': 1,
+    // 禁止在非赋值或条件语句中使用 new 操作符
+    'no-new': 0,
+    // 禁止对 Function 对象使用 new 操作符
+    'no-new-func': 1,
+    // 禁止使用 Object 的构造函数
+    'no-new-object': 0,
+    // 禁止调用 require 时使用 new 操作符
+    'no-new-require': 2,
+    // 禁止 Symbol 的构造函数
+    'no-new-symbol': 1,
+    // 禁止对 String,Number 和 Boolean 使用 new 操作符
+    'no-new-wrappers': 0,
     // 禁止把全局对象 (Math 和 JSON) 作为函数调用 错误:var math = Math();
     'no-obj-calls': 2,
     // 禁用八进制字面量
@@ -448,6 +417,10 @@ module.exports = defineConfig({
     'no-self-compare': 2,
     // 禁用逗号操作符
     'no-sequences': 2,
+    // 禁止 var 声明 与外层作用域的变量同名
+    'no-shadow': 0,
+    // 禁止覆盖受限制的标识符
+    'no-shadow-restricted-names': 2,
     // 禁用稀疏数组
     'no-sparse-arrays': 2,
     // 禁用同步方法
@@ -477,7 +450,7 @@ module.exports = defineConfig({
     // 禁用一成不变的循环条件
     'no-unmodified-loop-condition': 2,
     // 禁止可以在有更简单的可替代的表达式时使用三元操作符
-    'no-unneeded-ternary': 'error',
+    'no-unneeded-ternary': 0,
     // 禁止在return、throw、continue 和 break语句之后出现不可达代码
     /*
     function foo() {
@@ -500,8 +473,8 @@ module.exports = defineConfig({
     'no-use-before-define': 0,
     // 禁止不必要的 .call() 和 .apply()
     'no-useless-call': 2,
-    // 禁止在对象中使用不必要的计算
-    'no-useless-computed-key': 'error',
+    // 禁止不必要的计算性能键对象的文字
+    'no-useless-computed-key': 2,
     // 禁止不必要的字符串字面量或模板字面量的连接
     'no-useless-concat': 0,
     // ES2015 会提供默认的类构造函数。因此,没有必要提供一个空构造函数或一个简单地委托给它的父类的构造函数,
@@ -512,6 +485,8 @@ module.exports = defineConfig({
     'no-useless-rename': 2,
     // 多余的return语句。
     'no-useless-return': 0,
+    // 要求使用 let 或 const 而不是 var
+    'no-var': 0,
     // 禁用 void 操作符
     'no-void': 2,
     // 禁止在注释中使用特定的警告术语
@@ -545,9 +520,9 @@ module.exports = defineConfig({
     // 要求使用箭头函数作为回调
     'prefer-arrow-callback': 0,
     // 要求使用 const 声明那些声明后不再被修改的变量
-    'prefer-const': 'error',
-    // 只强制对象解构,不强制数组解构
-    'prefer-destructuring': ['error', { object: true, array: false }],
+    'prefer-const': 2,
+    // 采用两组配置对象。第一个对象参数决定了规则适用的解构类型
+    'prefer-destructuring': 0,
     // 禁止调用parseInt()或Number.parseInt()使用两个参数调用:一个字符串; 和2(二进制),8(八进制)或16(十六进制)的基数选项。
     'prefer-numeric-literals': 2,
     // 确保承诺只被Error对象拒绝。
@@ -555,31 +530,31 @@ module.exports = defineConfig({
     // 要求在合适的地方使用 Reflect 方法
     'prefer-reflect': 0,
     // Suggest using the rest parameters instead of arguments
-    'prefer-rest-params': 0,
+    'prefer-rest-params': 2,
     // 要求使用扩展运算符而非 .apply()
     'prefer-spread': 2,
     // 最大属性在新的一行
-    'max-attributes-per-line': 0,
-    'vue/max-attributes-per-line': 0,
+    "max-attributes-per-line": 0,
+    "vue/max-attributes-per-line": 0,
     // 要求使用模板字面量而非字符串连接
     // 老代码或使用习惯
     'prefer-template': 0,
     // 要求对象字面量属性名称用引号括起来
     'quote-props': 0,
     // 强制使用一致的反勾号、双引号或单引号
-    quotes: 0,
+    'quotes': 0,
     // 强制在parseInt()使用基数参数
-    radix: 0,
+    'radix': 0,
     // 异步函数必须具有await表达式
-    'require-await': 0,
+    'require-await': 2,
     // 要求使用 JSDoc 注释
     'require-jsdoc': 0,
     // 要求generator 函数内有 yield
     'require-yield': 2,
     // enforce spacing between rest and spread operators and their expressions
-    'rest-spread-spacing': 'error',
+    'rest-spread-spacing': 0,
     // 要求或禁止使用分号而不是 ASI(这个才是控制行尾部分号的,)
-    semi: 0,
+    'semi': 0,
     // 强制分号之前和之后使用一致的空格
     'semi-spacing': 0,
     // 强制分号位于配置的位置。
@@ -591,11 +566,11 @@ module.exports = defineConfig({
     // 要求同一个声明块中的变量按顺序排列
     'sort-vars': 0,
     // 强制在块之前使用一致的空格
-    'space-before-blocks': [2, 'always'],
+    'space-before-blocks': [2,'always'],
     // 强制在 function的左括号之前使用一致的空格
-    'space-before-function-paren': [0, 'always'],
+    'space-before-function-paren': [0,'always'],
     // 强制在圆括号内使用一致的空格
-    'space-in-parens': [2, 'never'],
+    'space-in-parens': [2,'never'],
     // 要求操作符周围有空格
     'space-infix-ops': 2,
     // 强制在一元操作符前后使用一致的空格
@@ -603,7 +578,7 @@ module.exports = defineConfig({
     // 强制在注释中 // 或 /* 使用一致的空格
     'spaced-comment': 0,
     // 要求或禁止使用严格模式指令
-    strict: 0,
+    'strict': 0,
     // switch语句内的空格
     'switch-colon-spacing': 2,
     // var foo = Symbol("some description"); 一定要有描述
@@ -630,15 +605,6 @@ module.exports = defineConfig({
     // 强制在 yield* 表达式中 * 周围使用空格
     'yield-star-spacing': 2,
     // 要求或禁止 “Yoda” 条件
-    yoda: 0,
-  },
-  overrides: [
-    {
-      files: ['*.vue'],
-      rules: {
-        // 要求组件名称总是多个单词
-        'vue/multi-word-component-names': 0,
-      },
-    },
-  ],
-});
+    'yoda': 0,
+  } 
+}

+ 27 - 20
web/.gitignore

@@ -1,33 +1,40 @@
-# Logs
-logs
-*.log
+.DS_Store
+node_modules/
+node_modules_qt/
+dist
+dist.zip
 npm-debug.log*
 yarn-debug.log*
 yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-temp
-node_modules
-.DS_Store
-dist
-dist-ssr
-ynsp_dev
-*.local
+**/*.log
+.history/
+.git
+
+.env.development
 
-/cypress/videos/
-/cypress/screenshots/
+
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Theme sytlesheet
+dist.min.css
+
+# Demo
+assets/**/demo.css
+assets/**/demo_index.html
 
 # Editor directories and files
 .idea
+.vscode
+.setting
+.prettierrc
 *.suo
 *.ntvs*
 *.njsproj
 *.sln
-*.sw?
+*.local
 
 package-lock.json
-
-components.d.ts
-auto-imports.d.ts
-dist/
-dist.zip
+yarn.lock

+ 3 - 10
web/.npmrc

@@ -1,10 +1,3 @@
-# 私有仓库-外网开发地址
-#registry=http://210.12.198.156:9036/repository/yx-npm-group/
-registry=https://nexus.yangzhiqiang.tech/repository/yx-npm-group/
-# 私有仓库-云桌面开发地址
-#registry=http://192.168.36.21:9018/repository/yx-npm-group/
-# 私有仓库-认证令牌
-//nexus.yangzhiqiang.tech/repository/yx-npm-group/:_auth=eXV4cDp5dXhwJTIwMjE===
-# 始终进行身份验证的配置选项
-always-auth=true
-strict-ssl=false
+registry=http://210.12.198.156:9036/repository/yx-npm-group/
+_auth=eXVzcC1ndWVzdDp5dXNwLWd1ZXN0==
+always-auth=true

+ 7 - 4
web/.postcssrc.js

@@ -1,5 +1,8 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
 module.exports = {
-  plugins: {
-    autoprefixer: {},
-  },
-};
+  "plugins": {
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 0 - 21
web/.prettierignore

@@ -1,21 +0,0 @@
-## OS
-.DS_Store
-.idea
-.editorconfig
-pnpm-lock.yaml
-.npmrc
-
-# Ignored suffix
-*.log
-*.md
-*.svg
-*.png
-*.ico
-*ignore
-
-## Local
-.husky
-
-## Built-files
-.cache
-dist

+ 0 - 43
web/.prettierrc.js

@@ -1,43 +0,0 @@
-module.exports = {
-  // 一行最多 120 字符
-  printWidth: 120,
-  // 使用 2 个空格缩进
-  tabWidth: 2,
-  // 不使用缩进符,而使用空格
-  useTabs: false,
-  // 行尾需要有分号
-  semi: true,
-  // 使用单引号
-  singleQuote: true,
-  // 对象的 key 仅在必要时用引号
-  quoteProps: 'as-needed',
-  // jsx 不使用单引号,而使用双引号
-  jsxSingleQuote: false,
-  // 末尾需要有逗号
-  trailingComma: 'all',
-  // 大括号内的首尾需要空格
-  bracketSpacing: true,
-  // jsx 标签的反尖括号需要换行
-  jsxBracketSameLine: false,
-  // 箭头函数,只有一个参数的时候,也需要括号
-  arrowParens: 'always',
-  // 每个文件格式化的范围是文件的全部内容
-  rangeStart: 0,
-  rangeEnd: Infinity,
-  // 不需要写文件开头的 @prettier
-  requirePragma: false,
-  // 不需要自动在文件开头插入 @prettier
-  insertPragma: false,
-  // 使用默认的折行标准
-  proseWrap: 'preserve',
-  // 根据显示样式决定 html 要不要折行
-  htmlWhitespaceSensitivity: 'css',
-  // vue 文件中的 script 和 style 内不用缩进
-  vueIndentScriptAndStyle: false,
-  // 换行符使用 lf
-  endOfLine: 'auto',
-  // 格式化嵌入的内容
-  embeddedLanguageFormatting: 'auto',
-  // html, vue, jsx 中每个属性占一行
-  singleAttributePerLine: false,
-};

+ 0 - 16
web/.stylelintignore

@@ -1,16 +0,0 @@
-# .stylelintignore
-# 旧的不需打包的样式库
-*.min.css
-
-# 其他类型文件
-*.js
-*.jpg
-*.woff
-
-# 测试和打包目录
-/test/
-/dist/*
-/public/*
-public/*
-/node_modules/
-*.min.js

+ 5 - 0
web/.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: stable
+script: npm run test
+notifications:
+  email: false

+ 0 - 132
web/.xy-tsd.js

@@ -1,132 +0,0 @@
-module.exports = {
-  // 1.全落标:对工程直接替换;2.半落标:增加接口请求获取配置数据,并增加拦截请求方法处理,
-  tsdType: 1,
-  // 基础文件夹路径,如src/
-  basePath: '/src',
-  // 排除处理文件,正则表达式或文件名数组, 默认排除多语言
-  exclude: ['/{api,config,assets,locale,router,store,utils}/**/*.js', '/views/batch/require/*.js', '/views/@xdjf/**/{api,config,assets,locale,router,store,utils}/**/*.js', '/views/framework/Login/index.vue'],
-  // 配置文件路径
-  config: '.xy-tsd.js',
-  // 要处理的文件类型, 可以多个,数组形式,配置参考https://github.com/isaacs/node-glob
-  include: '**/*.@(vue|js)',
-  // 自闭标签列表
-  selfClosingTag: ['img', 'hr', 'br', 'svg-icon', 'input'],
-  // 生成结果目标文件夹
-  output: '/temp',
-  // 映射关系数据来源api/excel,api则调用接口获取数据,excel则解析excel文件类获取映射数据
-  type: 'excel',
-  api: {
-    server: 'http://192.168.50.60:30355',
-    // 默认post请求, 支持对象类型及函数配置
-    rules: '/api/metaChangeStdField/listallchangefield',
-    // 字典映射列表
-    datacodes: '/api/metaChangeDict',
-    // 接口映射列表
-    apis: '/api/metaChangeStdField/listchangeapi',
-  },
-  excel: {
-    // 文件名
-    path: '标准字段差异数据.xlsx',
-    // 类型与excel标签页映射关系  目前仅仅实现了 field data-code 无效
-    types: {
-      field: '差异标准字段',
-      'data-code': '字典映射',
-    },
-    // 该映射关系需要与 config.map 对应上
-    // excel列与字段映射关系
-    map: {
-      field: {
-        // 模块英文名: 'moduleName',
-        // 模块中文名: 'moduleNameCn',
-        // 表名: 'tableName',
-        // 表中文名: 'tableNameCn',
-        '原字段英文名': 'oldName',
-        '新字段英文名': 'newName',
-        '原字段中文名': 'oldNameCn',
-        '新字段中文名': 'newNameCn',
-        // 字段类型: 'oldDbType',
-        // 标准字段类型: 'newDbType',
-        // 字典编号: 'oldCode',
-        // 标准字典编号: 'newCode',
-      },
-      // 'data-code': {
-      //   字典编号: 'oldCode',
-      //   字典中文名: 'oldName',
-      //   选项名称: 'oldItemName',
-      //   选项码值: 'oldItemValue',
-      //   标准字典编号: 'newCode',
-      //   标准字典中文名: 'newName',
-      //   标准选项名称: 'newItemName',
-      //   标准选项码值: 'newItemValue',
-      // },
-    },
-  },
-  // 日志记录配置
-  logs: {
-    path: 'logs/data-standard.log',
-  },
-  // 1.全量字段类型;2.接口类型
-  rulesType: 1,
-  // 规则判断主键
-  rulesPrimarykey: {
-    field: 'oldName',
-    'data-code': 'oldCode',
-  },
-  // 转换规则
-  rules: null,
-  // 是否需要转驼峰
-  isHump: true,
-  // 特殊关键词,指定特殊标记,在template中,内容与特殊关键词相同的,需要进行转换处理,但关键词本身不处理
-  specialKeywords: ['scope.row'],
-  // js代码中替换信息
-  map: {
-    dataCodeMap: ['oldCode', 'newCode'], // 数据字典映射关系
-    jsMap: ['oldName', 'newName'],
-    tempMap: ['oldName', 'newName'], // 模板通用
-    // 表单对应key替换信息,数组第一个为比较值,第二个为更新值
-    xformMap: {
-      label: ['oldNameCn', 'newNameCn'],
-      name: ['oldName', 'newName'],
-      'data-code': ['oldCode', 'newCode'],
-    },
-    // 表格对应key替换信息,数组第一个为比较值,第二个为更新值
-    xtableMap: {
-      label: ['oldNameCn', 'newNameCn'],
-      prop: ['oldName', 'newName'],
-    },
-  },
-  // 数据字典
-  datacodes: null,
-  // 接口映射数据,用于接口路径、接口请求类型修改
-  apis: null,
-  // 添加JavaScript默认解析器
-  jsVisitor: function () {
-    return {};
-  },
-  // js 特殊需要处理过滤器
-  jsFilters: function () {
-    return false;
-  },
-  // js 特殊需要处理过滤器
-  tempFilters: function () {
-    return false;
-  },
-  // 添加模板默认解析器
-  tempVisitor: [
-    {
-      tag: 'yu-xform',
-      childrenTag: 'yu-xform-item',
-      // 先不处理数据字典
-      KEYS: ['label', 'name', 'data-code'],
-      mapKey: 'xformMap',
-    },
-    {
-      tag: 'yu-xtable',
-      childrenTag: 'yu-xtable-column',
-      // KEYS: ['prop', 'data-code'],
-      // 先不处理数据字典
-      KEYS: ['label', 'prop'],
-      mapKey: 'xtableMap',
-    },
-  ],
-};

+ 3 - 4
web/.yarnrc

@@ -1,4 +1,3 @@
-#registry=http://210.12.198.156:9036/repository/yx-npm-group/
-registry=https://nexus.yangzhiqiang.tech/repository/yx-npm-group/
-disable-self-update-check true
-strict-ssl=false
+registry "http://210.12.198.156:9036/repository/yx-npm-group/"
+_auth=eXVzcC1ndWVzdDp5dXNwLWd1ZXN0==
+always-auth=true

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است