From 8676f4cb37ef31fa9fcfe2a7faf5f4c4ea77cc1a Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 29 一月 2026 09:46:05 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbom_dianjiang

---
 server/admin/src/main/java/com/doumee/api/business/CategoryController.java                  |    6 
 server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java    |   26 
 server/web/src/main/java/com/doumee/api/web/ApiController.java                              |    5 
 admin/src/components/business/OperaMemberImportWindow.vue                                   |   86 +
 admin/src/views/business/categoryBusType.vue                                                |   23 
 admin/public/template/casees.xlsx                                                           |    0 
 admin/package-lock.json                                                                     |  169 +-
 server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java                       |   31 
 admin/src/api/business/category.js                                                          |    5 
 server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java              |   21 
 server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java               |   14 
 admin/src/api/business/importRecord.js                                                      |   48 
 admin/src/views/business/categoryLevel.vue                                                  |   21 
 server/services/src/main/java/com/doumee/api/common/PublicController.java                   |  168 ++
 server/services/src/main/java/com/doumee/core/constants/Constants.java                      |   24 
 server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java          |  100 +
 admin/admin/index.html                                                                      |    2 
 server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java                   |  185 +++
 server/services/src/main/java/com/doumee/service/business/MemberService.java                |    5 
 admin/.env.development                                                                      |    3 
 server/services/src/main/java/com/doumee/dao/business/model/Category.java                   |   27 
 server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java |  135 ++
 admin/src/api/business/member.js                                                            |    3 
 .idea/jarRepositories.xml                                                                   |   10 
 admin/admin/favicon.ico                                                                     |    0 
 admin/public/template/member.xlsx                                                           |    0 
 admin/src/views/business/interfaceLog.vue                                                   |  148 ++
 admin/package.json                                                                          |    7 
 admin/src/views/business/category.vue                                                       |   12 
 admin/src/views/business/member.vue                                                         |  246 ++-
 admin/src/views/index.vue                                                                   |    2 
 server/web/src/main/java/com/doumee/api/web/LoginController.java                            |  161 ++
 admin/src/components/common/UploadImage.vue                                                 |  124 -
 server/admin/src/main/java/com/doumee/api/business/MemberController.java                    |   10 
 server/services/src/main/resources/application-pro.yml                                      |   50 
 .idea/compiler.xml                                                                          |    1 
 server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java                  |    1 
 admin/public/index.html                                                                     |    2 
 server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java                  |   36 
 admin/src/components/common/Menu.vue                                                        |    2 
 server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java         |   22 
 server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java         |   17 
 admin/public/favicon.ico                                                                    |    0 
 server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java                       |   24 
 server/services/src/main/resources/application-test.yml                                     |   47 
 admin/src/api/business/interfaceLog.js                                                      |   18 
 server/services/src/main/java/com/doumee/service/business/ImportRecordService.java          |    5 
 admin/src/components/common/UploadAvatarImage.vue                                           |    2 
 server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java             |   11 
 admin/src/views/login.vue                                                                   |    2 
 server/services/pom.xml                                                                     |   15 
 server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java               |   12 
 server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java |  191 +++
 server/services/src/main/resources/application-dev.yml                                      |    8 
 server/services/src/main/java/com/doumee/dao/business/model/Multifile.java                  |    6 
 server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java               |   98 +
 server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java     |  113 +
 admin/src/components/business/OperaCategoryWindow.vue                                       |   87 
 /dev/null                                                                                   |   54 
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java           |    7 
 server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java                 |   42 
 server/services/lib/zos-sdk.jar                                                             |    0 
 server/pom.xml                                                                              |    5 
 server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java        |  309 +++++
 server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java                         |   28 
 server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |  218 ++
 admin/src/components/business/OperaInterfaceLogWindow.vue                                   |  102 +
 server/web/src/main/resources/application.yml                                               |    8 
 admin/src/views/business/categoryField.vue                                                  |   17 
 server/services/src/main/java/com/doumee/dao/business/model/Member.java                     |   48 
 server/web/src/main/java/com/doumee/DJWebApplication.java                                   |    5 
 admin/src/assets/logo.png                                                                   |    0 
 72 files changed, 2,767 insertions(+), 673 deletions(-)

diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index baa301d..3a29174 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -2,6 +2,7 @@
 <project version="4">
   <component name="CompilerConfiguration">
     <annotationProcessing>
+      <profile default="true" name="Default" enabled="true" />
       <profile name="Maven default annotation processors profile" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 712ab9d..380b522 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -7,6 +7,11 @@
       <option name="url" value="https://repo.maven.apache.org/maven2" />
     </remote-repository>
     <remote-repository>
+      <option name="id" value="nexus" />
+      <option name="name" value="Nexus" />
+      <option name="url" value="http://47.97.118.181:8089/nexus/content/groups/public/" />
+    </remote-repository>
+    <remote-repository>
       <option name="id" value="central" />
       <option name="name" value="Maven Central repository" />
       <option name="url" value="https://repo1.maven.org/maven2" />
@@ -16,5 +21,10 @@
       <option name="name" value="JBoss Community repository" />
       <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://47.97.118.181:8089/nexus/content/groups/public/" />
+    </remote-repository>
   </component>
 </project>
\ No newline at end of file
diff --git a/admin/.env.development b/admin/.env.development
index 8df256e..fafd2c3 100644
--- a/admin/.env.development
+++ b/admin/.env.development
@@ -1,4 +1,3 @@
 # 寮�鍙戠幆澧冮厤缃�
 NODE_ENV = 'development'
-#VUE_APP_API_URL  = 'http://192.168.1.54:10010'
-VUE_APP_API_URL = 'https://jinkuai.832smartfarm.com/jinkuai_admin'
+VUE_APP_API_URL = 'http://localhost:10010'
diff --git a/admin/admin/favicon.ico b/admin/admin/favicon.ico
index 834a418..e7a2ce9 100644
--- a/admin/admin/favicon.ico
+++ b/admin/admin/favicon.ico
Binary files differ
diff --git a/admin/admin/index.html b/admin/admin/index.html
index 4a878cd..df8c58b 100644
--- a/admin/admin/index.html
+++ b/admin/admin/index.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>杩戝揩鍚庡彴绠$悊绯荤粺</title><link href="static/css/app.daf6fc74.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.83e26f0e.js" rel="preload" as="script"><link href="static/js/chunk-vendors.2417847b.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.daf6fc74.css" rel="stylesheet"></head><body><div id="app"></div><script src="static/js/chunk-vendors.2417847b.js"></script><script src="static/js/app.83e26f0e.js"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>蹇楅偊鐐瑰皢鍚庡彴绠$悊绯荤粺</title><link href="static/css/app.daf6fc74.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.83e26f0e.js" rel="preload" as="script"><link href="static/js/chunk-vendors.2417847b.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.daf6fc74.css" rel="stylesheet"></head><body><div id="app"></div><script src="static/js/chunk-vendors.2417847b.js"></script><script src="static/js/app.83e26f0e.js"></script></body></html>
diff --git a/admin/package-lock.json b/admin/package-lock.json
index 9256a01..1bd4443 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -1871,63 +1871,6 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1935,28 +1878,6 @@
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        },
-        "vue-loader-v16": {
-          "version": "npm:vue-loader@16.8.3",
-          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "chalk": "^4.1.0",
-            "hash-sum": "^2.0.0",
-            "loader-utils": "^2.0.0"
           }
         }
       }
@@ -13675,6 +13596,15 @@
       "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
       "dev": true
     },
+    "vue-json-viewer": {
+      "version": "2.2.22",
+      "resolved": "https://registry.npmmirror.com/vue-json-viewer/-/vue-json-viewer-2.2.22.tgz",
+      "integrity": "sha512-3oPH5BxoUWva/qp7wNJj+15FBXyi9Yu5VDW4mCWivjHR1pUpMv34fjqqxML7jh2uOqm1S/3Xks5nQ5JjC5+OWw==",
+      "dev": true,
+      "requires": {
+        "clipboard": "^2.0.4"
+      }
+    },
     "vue-loader": {
       "version": "15.9.7",
       "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.7.tgz",
@@ -13696,6 +13626,87 @@
         }
       }
     },
+    "vue-loader-v16": {
+      "version": "npm:vue-loader@16.8.3",
+      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "loader-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
     "vue-router": {
       "version": "3.5.1",
       "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
diff --git a/admin/package.json b/admin/package.json
index 81a4b79..718c85f 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -37,19 +37,20 @@
     "@vue/cli-service": "~4.5.0",
     "@vue/eslint-config-standard": "^5.1.2",
     "babel-eslint": "^10.1.0",
+    "crypto-js": "^4.2.0",
     "eslint": "^6.7.2",
     "eslint-plugin-import": "^2.20.2",
     "eslint-plugin-node": "^11.1.0",
     "eslint-plugin-promise": "^4.2.1",
     "eslint-plugin-standard": "^4.0.0",
     "eslint-plugin-vue": "^6.2.2",
+    "jsencrypt": "^3.3.2",
     "lint-staged": "^9.5.0",
     "node-sass": "^4.12.0",
     "sass-loader": "^8.0.2",
     "vue-cli-plugin-element-ui": "~1.1.4",
-    "vue-template-compiler": "^2.6.11",
-    "crypto-js": "^4.2.0",
-    "jsencrypt": "^3.3.2"
+    "vue-json-viewer": "^2.2.22",
+    "vue-template-compiler": "^2.6.11"
   },
   "eslintConfig": {
     "root": true,
diff --git a/admin/public/favicon.ico b/admin/public/favicon.ico
index 834a418..e69de29 100644
--- a/admin/public/favicon.ico
+++ b/admin/public/favicon.ico
Binary files differ
diff --git a/admin/public/index.html b/admin/public/index.html
index 339846b..b90b5b8 100644
--- a/admin/public/index.html
+++ b/admin/public/index.html
@@ -5,7 +5,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
-    <title>杩戝揩鍚庡彴绠$悊绯荤粺</title>
+    <title>蹇楅偊鐐瑰皢鍚庡彴绠$悊绯荤粺</title>
   </head>
   <body>
     <div id="app"></div>
diff --git a/admin/public/template/casees.xlsx b/admin/public/template/casees.xlsx
new file mode 100644
index 0000000..38aaf8c
--- /dev/null
+++ b/admin/public/template/casees.xlsx
Binary files differ
diff --git a/admin/public/template/member.xlsx b/admin/public/template/member.xlsx
new file mode 100644
index 0000000..be97d45
--- /dev/null
+++ b/admin/public/template/member.xlsx
Binary files differ
diff --git a/admin/src/api/business/category.js b/admin/src/api/business/category.js
index 3162d80..12abda9 100644
--- a/admin/src/api/business/category.js
+++ b/admin/src/api/business/category.js
@@ -6,6 +6,11 @@
     trim: true
   })
 }
+export function findAll (data) {
+  return request.post('/business/category/list', data, {
+    trim: true
+  })
+}
 
 // 鍒涘缓
 export function create (data) {
diff --git a/admin/src/api/business/importRecord.js b/admin/src/api/business/importRecord.js
new file mode 100644
index 0000000..82a5f2e
--- /dev/null
+++ b/admin/src/api/business/importRecord.js
@@ -0,0 +1,48 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/importRecord/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/importRecord/create', data)
+}
+export function updateStatus (data) {
+  return request.post('/business/importRecord/updateStatus', data)
+}
+
+// 瀵煎嚭Excel
+export function exportExcel (data) {
+  return request.post('/business/importRecord/exportExcel', data, {
+    download: true
+  })
+}
+export function importExcel (data) {
+  return request.post('/business/importRecord/importExcel', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/importRecord/updateById', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/business/importRecord/delete/${id}`)
+}
+export function getById (id) {
+  return request.get(`/business/importRecord/${id}`)
+}
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/business/importRecord/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/api/business/interfaceLog.js b/admin/src/api/business/interfaceLog.js
new file mode 100644
index 0000000..7d6ff29
--- /dev/null
+++ b/admin/src/api/business/interfaceLog.js
@@ -0,0 +1,18 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+export function fetchList (data) {
+  return request.post('/business/interfaceLog/page', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/business/interfaceLog/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/business/interfaceLog/updateById', data)
+}
diff --git a/admin/src/api/business/member.js b/admin/src/api/business/member.js
index 9901389..df77a7f 100644
--- a/admin/src/api/business/member.js
+++ b/admin/src/api/business/member.js
@@ -21,6 +21,9 @@
     download: true
   })
 }
+export function importExcel (data) {
+  return request.post('/business/member/importExcel', data)
+}
 
 // 淇敼
 export function updateById (data) {
diff --git a/admin/src/assets/logo.png b/admin/src/assets/logo.png
index 834a418..271e35f 100644
--- a/admin/src/assets/logo.png
+++ b/admin/src/assets/logo.png
Binary files differ
diff --git a/admin/src/components/business/OperaCategoryWindow.vue b/admin/src/components/business/OperaCategoryWindow.vue
index 326f991..c897b92 100644
--- a/admin/src/components/business/OperaCategoryWindow.vue
+++ b/admin/src/components/business/OperaCategoryWindow.vue
@@ -7,45 +7,34 @@
   >
     <el-form :model="form" ref="form" :rules="rules">
       <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-if="form.type !=3"  v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
-        <el-select v-else  v-model="form.name" placeholder="璇烽�夋嫨璁㈠崟绫诲瀷" v-trim>
-          <el-option :value="'0'" label="鐢ㄥ伐鍗�"></el-option>
-          <el-option :value="'1'" label="璐ц繍鍗�"></el-option>
-          <el-option :value="'2'" label="璁㈤鍗�"></el-option>
-        </el-select>
+        <el-input   v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
       </el-form-item>
-      <el-form-item v-if="form.type ==3 " label="鎵嬬画璐癸紙%锛�" prop="detail">
-        <el-input  type="number"   v-model="form.detail" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
+      <el-form-item label="鎴樺尯缂栫爜" prop="detail"  v-if="form.type ==0" >
+        <el-input v-model="form.detail" placeholder="璇疯緭鍏ユ垬鍖虹紪鐮�" v-trim/>
       </el-form-item>
-      <el-form-item v-if="form.type == 1 || form.type == 2" :label=" form.type == 1?'杞﹁締瑙勬牸':'椁愭爣閰嶇疆锛堝厓锛�'" prop="detailList">
-        <div style="display: flex;flex-direction: column">
-          <div style="position: relative;display: block;width: 100%;" v-for="(item,index) in form.detailList"   >
-            <el-input  :type="form.type == 1?'text':'number'" style="display:inline-block;width: 60%;margin:5px ;float: left" v-model="form.detailList[index]"   placeholder="璇疯緭鍏ュ唴瀹�" v-trim/>
-            <el-button  style="display:inline-block;margin : 5px " @click="del(index)" v-if="form.detailList.length>0">x</el-button>
-          </div>
-          <div style="position: relative;display: block;width: 100%;">
-            <el-button style="width: 100px;margin: 5px;" type="primary" @click="add()">娣诲姞瑙勬牸</el-button>
-          </div>
-        </div>
-      </el-form-item>
-      <el-form-item v-if="form.type == 1" label="鍥炬爣" prop="icon">
+      <el-form-item v-if="form.type == 3" label="鍥炬爣" prop="icon">
         <UploadAvatarImage
             :file="{ imgurlfull: form.iconFull, imgurl: form.icon }"
             :uploadData="uploadData"
             @uploadSuccess="uploadAvatarSuccess"
         />
       </el-form-item>
-      <el-form-item  v-if="form.id ==null && form.type == 1"  label="鏄惁鍥哄畾杞﹁締" prop="isFixed">
-        <el-radio-group v-model="form.isFixed">
-          <el-radio :label="0">闈炲浐瀹�</el-radio>
-          <el-radio :label="1">鍥哄畾杞﹀瀷</el-radio>
-        </el-radio-group>
+      <el-form-item v-if="form.type == 1" label="鎺掕姒滃浘闆�" prop="icon">
+        <UploadImage
+            :fileList="tempfileList"
+            :uploadData="uploadData"
+            @beginUpload="isUploading=true"
+            @endUpload="isUploading=false"/>
+        <p class="tip-warn">
+          寤鸿灏哄锛�750px X 750px锛屼笂闄�6寮�
+          鏀寔png銆乯pg銆乯peg鏍煎紡锛屽ぇ灏忎笉瓒呰繃2M锛屼笂浼犲浘鐗囦笉鍏佽娑夊強鏀挎不鏁忔劅涓庤壊鎯�,
+        </p>
       </el-form-item>
       <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+        <el-input v-model="form.sortnum" type="" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
       </el-form-item>
       <el-form-item label="鎻忚堪" prop="remark">
-        <el-input v-model="form.remark" placeholder="璇疯緭鍏ユ弿杩�" v-trim/>
+        <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ユ弿杩�" v-trim/>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -54,16 +43,17 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import UploadImage from '@/components/common/UploadImage'
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 export default {
   name: 'OperaCategoryWindow',
   extends: BaseOpera,
-  components: { GlobalWindow ,UploadAvatarImage},
+  components: { GlobalWindow, UploadAvatarImage,UploadImage },
   data () {
     return {
       isUploading: false,
       uploadData: {
-        folder: 'category'
+        folder: 'dianjiang/category'
       },
       // 琛ㄥ崟鏁版嵁
       form: {
@@ -74,14 +64,15 @@
         type: null,
         detail: null,
         remark: null,
-        detailList: [''],
+        fileList: [],
         icon: '',
         iconFull: '',
         isFixed: 0
       },
+      tempfileList: [],
       // 楠岃瘉瑙勫垯
       rules: {
-        name: [{ required: true, message: '璇疯緭鍏ラ厤缃悕绉�' }]
+        name: [{ required: true, message: '璇疯緭鍏ュ悕绉�' }]
       }
     }
   },
@@ -91,23 +82,32 @@
       'field.id': 'id'
     })
   },
-  methods:{
-    del(index){
-      if(this.form.detailList.length<=1){
+  methods: {
+    del (index) {
+      if (this.form.detailList.length <= 1) {
         return
       }
-      this.form.detailList.splice(index,1)
+      this.form.detailList.splice(index, 1)
     },
-    add(){
+    add () {
       this.form.detailList.push('')
     },
     uploadAvatarSuccess (file) {
       this.$set(this.form, 'icon', file.imgurl)
       this.$set(this.form, 'iconFull', file.imgurlfull)
     },
-    open(title, target, type) {
+    confirm () {
+      this.form.fileList = this.tempfileList
+      if (this.form[this.configData['field.id']] == null || this.form[this.configData['field.id']] === '') {
+        this.__confirmCreate()
+        return
+      }
+      this.__confirmEdit()
+    },
+    open (title, target, type) {
       this.title = title
       this.visible = true
+      this.tempfileList = []
       this.form = {
         id: null,
         status: 0,
@@ -116,7 +116,7 @@
         detail: null,
         type: type,
         remark: null,
-        detailList: [''],
+        fileList: [],
         icon: '',
         iconFull: '',
         isFixed: 0
@@ -135,9 +135,14 @@
         for (const key in this.form) {
           this.form[key] = target[key]
         }
-        if(this.form.detailList==null){
-          this.form.detailList = ['']
-        }
+        this.form.fileList = this.form.fileList||[]
+        this.form.fileList.forEach(item=>{
+          this.tempfileList.push({
+            fileurl: item.fileurl,
+            name: item.name,
+            url: item.url
+          })
+        })
       })
     }
   }
diff --git a/admin/src/components/business/OperaInterfaceLogWindow.vue b/admin/src/components/business/OperaInterfaceLogWindow.vue
new file mode 100644
index 0000000..1533647
--- /dev/null
+++ b/admin/src/components/business/OperaInterfaceLogWindow.vue
@@ -0,0 +1,102 @@
+<template>
+    <el-dialog
+        :title="title"
+        width="60%"
+        :withFooter="false"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        append-to-body
+        @confirm="confirm"
+    >
+      <div class="codeEditBox">
+        <json-viewer
+            :value="form.formatContent"
+            :expand-depth="5"
+            copyable
+            boxed
+            :expanded="false"
+            @copied="copyText"
+            sort
+            :show-array-index="false"
+            class="w-100%">
+          <template slot="copy">
+            <i class="el-icon-document-copy" title="澶嶅埗">澶嶅埗浠g爜</i>
+          </template>
+        </json-viewer>
+      </div>
+    </el-dialog>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import JsonViewer from 'vue-json-viewer'
+
+export default {
+  name: 'OperaInterfaceLogWindow',
+  extends: BaseOpera,
+  components: { JsonViewer },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      form: {
+        content: '',
+        formatContent: {}
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+      },
+      copyable: { copyText: 'copy', copiedText: 'copied' }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/interfaceLog',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    copyText (val) {
+      this.$message.success('鍐呭宸叉垚鍔熷鍒跺埌鍓垏鏉匡紒')
+    },
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+        try {
+          this.form.formatContent = JSON.parse(this.form.content)
+        } catch (e) {
+          this.form.formatContent = this.form.content
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .codeEditBox {
+      width: 100%;
+      height: 90%;
+      overflow:auto;
+      display: block;
+      border: 1px solid #dcdee2;
+      overflow-y: auto;
+    }
+    ::v-deep .el-dialog__body{height:70vh;overflow-y: auto}
+    ::v-deep .el-dialog{height:78vh;overflow: hidden}
+    .jv-container {
+      //height: 60vh;
+    }
+</style>
diff --git a/admin/src/components/business/OperaMemberImportWindow.vue b/admin/src/components/business/OperaMemberImportWindow.vue
new file mode 100644
index 0000000..4f2c245
--- /dev/null
+++ b/admin/src/components/business/OperaMemberImportWindow.vue
@@ -0,0 +1,86 @@
+<template>
+  <el-dialog
+      class="center-title"
+      :title="title"
+      width="500px"
+      top="30vh"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn"><i class="el-icon-warning"></i>瀵煎叆璇存槑锛�<br>
+      1.璇峰厛涓嬭浇鏂囦欢妯℃澘锛屽苟鎸夌収妯℃澘瑕佸幓濉啓琛ㄦ牸鍐呭;<br>
+    </p>
+    <el-form class="demo-form-inline" >
+      <el-form-item label="鑰佸笀鍚嶅崟" required>
+        <div style="width: 100%;display: flex;align-items: center;">
+          <el-button type="primary" :loading="importing"   @click="clickRef">鐐瑰嚮涓婁紶</el-button>
+          <el-button type="text" @click="exportTemplate">鐐瑰嚮涓嬭浇妯$増.EXCEL</el-button>
+        </div>
+        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
+      </el-form-item>
+    </el-form>
+    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
+    <template   v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { importExcel } from '@/api/business/importRecord'
+export default {
+  name: 'OperaMemberImportWindow',
+  extends: BaseOpera,
+  // eslint-disable-next-line vue/no-unused-components
+  components: { GlobalWindow },
+  data () {
+    return {
+      importing: false,
+      fileName: '',
+      type: 0
+    }
+  },
+  methods: {
+    open (title) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+      this.type = 0
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/member.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      this.importing=true
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      data.append('type', this.type)
+      importExcel(data)
+        .then(res => {
+          this.$message.success('鍚嶅崟宸蹭笂浼犳垚鍔燂紝鍙墠寰�銆愬鍏ヨ褰曘�戣彍鍗曟煡鐪嬩换鍔℃墽琛岃繘搴︺��')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+          this.importing=false
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/common/Menu.vue b/admin/src/components/common/Menu.vue
index 44d89d3..4559e83 100644
--- a/admin/src/components/common/Menu.vue
+++ b/admin/src/components/common/Menu.vue
@@ -2,7 +2,7 @@
   <div class="menu" :class="{collapse: menuData.collapse}">
     <div class="logo">
       <div><img src="@/assets/logo.png"></div>
-      <h1 :class="{hidden: menuData.collapse}">杩戝揩鍚庡彴绠$悊绯荤粺</h1>
+      <h1 :class="{hidden: menuData.collapse}">蹇楅偊鐐瑰皢鍚庡彴绠$悊绯荤粺</h1>
     </div>
     <scrollbar>
       <el-menu
diff --git a/admin/src/components/common/UploadAvatarImage.vue b/admin/src/components/common/UploadAvatarImage.vue
index e39f3e5..e541df7 100644
--- a/admin/src/components/common/UploadAvatarImage.vue
+++ b/admin/src/components/common/UploadAvatarImage.vue
@@ -31,7 +31,7 @@
   data() {
     return {
       loading: null,
-      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/upload'
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
     }
   },
 
diff --git a/admin/src/components/common/UploadImage.vue b/admin/src/components/common/UploadImage.vue
index 8ada0f0..d9237a4 100644
--- a/admin/src/components/common/UploadImage.vue
+++ b/admin/src/components/common/UploadImage.vue
@@ -8,32 +8,13 @@
       accept=".jpg,.png"
       :before-upload="beforeUpload"
       :on-success="uploadSuccess"
+      :on-preview="handlePreview"
+      :on-remove="handleRemove"
       :on-error="fail"
     >
       <i class="el-icon-plus icon"></i>
-      <div slot="file" slot-scope="{file}">
-        <img
-          class="el-upload-list__item-thumbnail"
-          :src="file.url" alt=""
-          style="width: 100px;height: 100px;"
-        >
-        <span class="el-upload-list__item-actions">
-          <span
-            class="el-upload-list__item-preview"
-            @click="handlePictureCardPreview(file)"
-          >
-            <i class="el-icon-zoom-in"></i>
-          </span>
-          <span
-            class="el-upload-list__item-delete"
-            @click="handleRemove(file)"
-          >
-            <i class="el-icon-delete"></i>
-          </span>
-        </span>
-      </div>
     </el-upload>
-    <el-image-viewer
+   <el-image-viewer
       v-if="showViewer"
       :on-close="closeViewer"
       :initialIndex="tempIndex"
@@ -55,79 +36,77 @@
       type: Array,
       default: () => []
     },
-    uploadData: Object,
+    maxNum: {
+      type: Number,
+      default: () => null
+    },
+    uploadData: Object
   },
-  data() {
+  data () {
     return {
-      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/uploadLocal',
+      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
       realList: [],
-      srcList: [],
+      // srcList: [],
       tempIndex: 0,
-      showViewer: false,
+      showViewer: false
+    }
+  },
+  computed:{
+    srcList(){
+      return this.fileList.map(item => { return item.url })
     }
   },
   watch: {
-    fileList: {
-      handler(val) {
-        console.log(val);
-        if (val.length==0) {
-          this.realList = []
-          this.srcList = []
-        }
-      }
-
-    }
   },
   methods: {
-    beforeUpload(file) {
+    handlePreview(file) {
+      // console.log('棰勮鏂囦欢锛�', file,this.fileList);
+      this.tempIndex = this.srcList.findIndex(item => item == file.url)
+      this.showViewer = true
+    },
+    beforeUpload (file) {
       this.$emit('beginUpload')
+      const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png'
+      const isLt2M = file.size / 1024 / 1024 < 1; // 500kb
+      if (!isJPGOrPNG) {
+        this.$message.error('涓婁紶澶村儚鍥剧墖鍙兘鏄� JPG/PNG 鏍煎紡!');
+        return false
+      }
+      if (!isLt2M) {
+        this.$message.error('涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 500KB!');
+        return false
+      }
       return true
     },
-     // 涓婁紶鍥剧墖鎴愬姛
-     uploadSuccess (res, file, fileList) {
-      // console.log('this.fileList', this.fileList);
-      // console.log('fileList', fileList);
-      this.$emit('uploadEnd')
-      this.realList = fileList
-      this.srcList.push(res.data.url)
-      // console.log('file', file);
+    // 涓婁紶鍥剧墖鎴愬姛
+    uploadSuccess (res, file, fileList) {
+      this.$emit('endUpload')
+      console.log('涓婁紶鎴愬姛1锛�',fileList);
       if (res.code === 200) {
-        this.fileList.push(
-          {
-            fileurl: res.data.imgaddr,
-            name: res.data.originname,
-            url: res.data.url
-          }
-        )
+        this.fileList.push({
+          fileurl: res.data.imgaddr,
+          name: res.data.originname,
+          url: res.data.url
+        })
+        console.log('涓婁紶鎴愬姛2锛�', this.fileList);
       } else {
         this.$message.error(res.msg || '涓婁紶澶辫触')
       }
     },
     fail (err, file, fileList) {
-      this.$emit('uploadEnd')
+      this.$emit('endUpload')
       this.$message.error('涓婁紶澶辫触')
     },
-    handlePictureCardPreview(file) {
-      // this.tempIndex = this.srcList.findIndex(item => item == file.response.data.url )
-      // console.log(file);
-      this.tempIndex = this.fileList.findIndex(item => item.url == file.url )
-      // console.log( this.tempIndex);
-      this.srcList = this.fileList.map(item => item.url)
-      this.showViewer = true
-    },
-    closeViewer() {
+    closeViewer () {
       this.showViewer = false
     },
-    handleRemove(file) {
-      console.log(this.fileList);
-      let tempIndex = this.realList.findIndex(item => item.url === file.url)
-      // debugger
-      this.realList.splice(tempIndex, 1)
-      this.fileList.splice(tempIndex, 1)
-      this.srcList.splice(tempIndex, 1)
-
+    handleRemove (file) {
+      const tempIndex = this.fileList.findIndex(item => item.url === file.url)
+      if(tempIndex >= 0){
+        this.fileList.splice(tempIndex, 1)
+      }
     }
-  },
+  }
 }
 </script>
 
@@ -150,4 +129,3 @@
   height: 90px !important;
 }
 </style>
-
diff --git a/admin/src/views/business/category.vue b/admin/src/views/business/category.vue
index 0581cdd..c202c48 100644
--- a/admin/src/views/business/category.vue
+++ b/admin/src/views/business/category.vue
@@ -13,8 +13,9 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍝佺閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鎴樺尯',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:category:create']">鍚屾</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
           :height="tableHeightNew"
@@ -24,7 +25,8 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="鍗曚綅鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鎴樺尯鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="detail" label="鎴樺尯缂栫爜" min-width="100px"></el-table-column>
         <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,8 +44,8 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鏂板缓鍝佺閰嶇疆', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鎴樺尯', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
diff --git a/admin/src/views/business/categoryCb.vue b/admin/src/views/business/categoryBusType.vue
similarity index 79%
copy from admin/src/views/business/categoryCb.vue
copy to admin/src/views/business/categoryBusType.vue
index 38054d1..e952fe4 100644
--- a/admin/src/views/business/categoryCb.vue
+++ b/admin/src/views/business/categoryBusType.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓椁愭爣閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍟嗕笟鍖栫被鍨�',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -24,17 +24,19 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
-        <el-table-column prop="name" label="鐢ㄩ鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column  prop="detail" label="椁愭爣" min-width="200px">
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column  prop="icon" label="鎺掕姒滃浘闆�" min-width="220px">
           <template slot-scope="{row}">
-              <div v-if="row.detailList && row.detailList.length">
-                <span v-for="(item,index) in row.detailList">
-                  {{item || 0}}鍏�
-                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
-                </span>
+            <div style="display: flex; flex-wrap: wrap;width: 200px;"  v-if="row.fileList && row.fileList.length">
+              <div v-for="item in row.fileList" :key="row.id+'_img'+item.id" style=" box-sizing: border-box;  margin-right: 10px; " >
+                <el-image  style="width: 50px; height: 50px;" :src="item.url"
+                          :preview-src-list="[item.url]">
+                </el-image>
               </div>
+            </div>
           </template>
         </el-table-column>
+
         <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +44,7 @@
             </el-switch>
           </template>
         </el-table-column>
+        <el-table-column prop="remark" label="鎻忚堪" min-width="100px"></el-table-column>
         <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
         <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
@@ -52,7 +55,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫椁愭爣閰嶇疆', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫鍟嗕笟鍖栫被鍨�', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
             <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -83,7 +86,7 @@
       // 鎼滅储
       searchForm: {
         name: '',
-        type: 2
+        type: 1
       }
     }
   },
diff --git a/admin/src/views/business/categoryCar.vue b/admin/src/views/business/categoryCar.vue
deleted file mode 100644
index a848f63..0000000
--- a/admin/src/views/business/categoryCar.vue
+++ /dev/null
@@ -1,136 +0,0 @@
-<template>
-  <TableLayout :permissions="['business:category:query']">
-    <!-- 鎼滅储琛ㄥ崟 -->
-    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <section>
-        <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button @click="reset">閲嶇疆</el-button>
-      </section>
-    </el-form>
-    <!-- 琛ㄦ牸鍜屽垎椤� -->
-    <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓璐ц繍閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
-      </ul>
-      <el-table
-          :height="tableHeightNew"
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
-        <el-table-column  prop="icon" label="鍥炬爣" min-width="100px">
-          <template slot-scope="{row}">
-            <el-image v-if="row.iconFull" style="width: 50px; height: 50px; margin-right: 10px" :src="row.iconFull"
-                      :preview-src-list="[row.iconFull]">
-            </el-image>
-          </template>
-        </el-table-column>
-        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column  prop="isFixed" label="鏄惁鍥哄畾杞﹁締" min-width="100px">
-          <template slot-scope="{row}">
-            <span v-if="row.isFixed ==1" >鏄�</span>
-            <span v-else >鍚�</span>
-          </template>
-        </el-table-column>
-        <el-table-column  prop="detail" label="鍙�夎鏍�" min-width="200px">
-          <template slot-scope="{row}">
-              <div v-if="row.detailList && row.detailList.length">
-                <span v-for="(item,index) in row.detailList">
-                  {{item || ''}}
-                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
-                </span>
-              </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="鐘舵��">
-          <template slot-scope="{row}">
-            <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
-            inactive-color="#ff4949" :active-value="0" :inactive-value="1">
-            </el-switch>
-          </template>
-        </el-table-column>
-        <el-table-column prop="remark" label="鎻忚堪" min-width="100px"></el-table-column>
-        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
-          <template slot-scope="{row}">
-            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫鏂板缓璐ц繍閰嶇疆', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-            <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
-    </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
-  </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
-export default {
-  name: 'Category',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        name: '',
-        type: 1
-      }
-    }
-  },
-  created () {
-    this.config({
-      module: '鍒嗙被淇℃伅琛�',
-      api: '/business/category',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.search()
-  },
-  methods: {
-    isChangeSelected(row,index){
-      // if(row.isFixed ==1) {
-      //   return false
-      // }
-      return true
-    },
-    changeStatus (e, row) {
-      this.working = true
-      this.api.updateStatus({ id: row.id, status: e })
-        .then(res => {
-          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
-          this.search()
-        })
-        .catch(e => {
-          this.$tip.apiFailed(e)
-        })
-        .finally(() => {
-          this.working = false
-        })
-    }
-  }
-}
-</script>
diff --git a/admin/src/views/business/categoryFee.vue b/admin/src/views/business/categoryFee.vue
deleted file mode 100644
index 8e5631d..0000000
--- a/admin/src/views/business/categoryFee.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<template>
-  <TableLayout :permissions="['business:category:query']">
-    <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鎵嬬画璐归厤缃�',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
-      </ul>
-      <el-table
-          :height="tableHeightNew"
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
-        <el-table-column prop="name" label="宸ュ崟绫诲瀷" min-width="100px">
-          <template slot-scope="{row}">
-            <span v-if="row.name=='0'">鐢ㄥ伐鍗�</span>
-            <span v-if="row.name=='1'">璐ц繍鍗�</span>
-            <span v-if="row.name=='2'">璁㈤鍗�</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="detail" label="鎵嬬画璐癸紙%锛�" min-width="100px">
-          <template slot-scope="{row}">
-            <span class="yellowstate">{{row.detail||0}}%</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="鐘舵��">
-          <template slot-scope="{row}">
-            <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
-            inactive-color="#ff4949" :active-value="0" :inactive-value="1">
-            </el-switch>
-          </template>
-        </el-table-column>
-        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
-          <template slot-scope="{row}">
-            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫鎵嬬画璐归厤缃�', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-            <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
-    </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
-  </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
-export default {
-  name: 'Category',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        name: '',
-        type: 3
-      }
-    }
-  },
-  created () {
-    this.config({
-      module: '鍒嗙被淇℃伅琛�',
-      api: '/business/category',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.search()
-  },
-  methods: {
-    isChangeSelected(row,index){
-      // if(row.isFixed ==1) {
-      //   return false
-      // }
-      return true
-    },
-    changeStatus (e, row) {
-      this.working = true
-      this.api.updateStatus({ id: row.id, status: e })
-        .then(res => {
-          this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
-          this.search()
-        })
-        .catch(e => {
-          this.$tip.apiFailed(e)
-        })
-        .finally(() => {
-          this.working = false
-        })
-    }
-  }
-}
-</script>
diff --git a/admin/src/views/business/categoryCb.vue b/admin/src/views/business/categoryField.vue
similarity index 85%
copy from admin/src/views/business/categoryCb.vue
copy to admin/src/views/business/categoryField.vue
index 38054d1..3b6135c 100644
--- a/admin/src/views/business/categoryCb.vue
+++ b/admin/src/views/business/categoryField.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓椁愭爣閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鎿呴暱棰嗗煙',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -24,17 +24,7 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
-        <el-table-column prop="name" label="鐢ㄩ鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column  prop="detail" label="椁愭爣" min-width="200px">
-          <template slot-scope="{row}">
-              <div v-if="row.detailList && row.detailList.length">
-                <span v-for="(item,index) in row.detailList">
-                  {{item || 0}}鍏�
-                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
-                </span>
-              </div>
-          </template>
-        </el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +32,7 @@
             </el-switch>
           </template>
         </el-table-column>
+        <el-table-column prop="remark" label="鎻忚堪" min-width="100px"></el-table-column>
         <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
         <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
@@ -52,7 +43,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫椁愭爣閰嶇疆', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫鎿呴暱棰嗗煙', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
             <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
diff --git a/admin/src/views/business/categoryCb.vue b/admin/src/views/business/categoryLevel.vue
similarity index 86%
rename from admin/src/views/business/categoryCb.vue
rename to admin/src/views/business/categoryLevel.vue
index 38054d1..e080855 100644
--- a/admin/src/views/business/categoryCb.vue
+++ b/admin/src/views/business/categoryLevel.vue
@@ -13,7 +13,7 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓椁愭爣閰嶇疆',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鑰佸笀绛夌骇',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
@@ -24,17 +24,15 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
-        <el-table-column prop="name" label="鐢ㄩ鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column  prop="detail" label="椁愭爣" min-width="200px">
+        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column  prop="icon" label="鍥炬爣" min-width="100px">
           <template slot-scope="{row}">
-              <div v-if="row.detailList && row.detailList.length">
-                <span v-for="(item,index) in row.detailList">
-                  {{item || 0}}鍏�
-                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
-                </span>
-              </div>
+            <el-image v-if="row.iconFull" style="width: 50px; height: 50px; margin-right: 10px" :src="row.iconFull"
+                      :preview-src-list="[row.iconFull]">
+            </el-image>
           </template>
         </el-table-column>
+
         <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +40,7 @@
             </el-switch>
           </template>
         </el-table-column>
+        <el-table-column prop="remark" label="鎻忚堪" min-width="100px"></el-table-column>
         <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
         <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
@@ -52,7 +51,7 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫椁愭爣閰嶇疆', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
+            <el-button type="text"   @click="$refs.operaCategoryWindow.open('缂栬緫鑰佸笀绛夌骇', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
             <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -83,7 +82,7 @@
       // 鎼滅储
       searchForm: {
         name: '',
-        type: 2
+        type: 3
       }
     }
   },
diff --git a/admin/src/views/business/categoryOld.vue b/admin/src/views/business/categoryOld.vue
deleted file mode 100644
index 2ff4c1a..0000000
--- a/admin/src/views/business/categoryOld.vue
+++ /dev/null
@@ -1,106 +0,0 @@
-<template>
-  <TableLayout :permissions="['business:category:query']">
-    <!-- 鎼滅储琛ㄥ崟 -->
-    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <section>
-        <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button @click="reset">閲嶇疆</el-button>
-      </section>
-    </el-form>
-    <!-- 琛ㄦ牸鍜屽垎椤� -->
-    <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
-        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('鏂板缓鍒嗙被淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:category:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button></li>
-      </ul>
-      <el-table
-          :height="tableHeightNew"
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="updateUser" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="鍗曚綅鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column label="鐘舵��">
-          <template slot-scope="{row}">
-            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
-                       inactive-color="#ff4949" :active-value="0" :inactive-value="1">
-            </el-switch>
-          </template>
-        </el-table-column>
-        <el-table-column prop="type" label="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱" min-width="100px"></el-table-column>
-        <el-table-column prop="detail" label="鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="icon" label="鍥炬爣锛堣溅杈嗙被鍨嬩娇鐢級" min-width="100px"></el-table-column>
-        <el-table-column prop="isFixed" label="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱" min-width="100px">
-        </el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:category:update', 'business:category:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
-          <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaCategoryWindow.open('缂栬緫鍒嗙被淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:category:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
-    </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaCategoryWindow ref="operaCategoryWindow" @success="handlePageChange"/>
-  </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaCategoryWindow from '@/components/business/OperaCategoryWindow'
-export default {
-  name: 'Category',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaCategoryWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        id: '',
-        deleted: '',
-        status: '',
-        createUser: '',
-        createTime: '',
-        updateUser: '',
-        updateTime: '',
-        remark: '',
-        name: '',
-        type: '',
-        detail: '',
-        icon: '',
-        isFixed: ''
-      }
-    }
-  },
-  created () {
-    this.config({
-      module: '鍒嗙被淇℃伅琛�',
-      api: '/business/category',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.search()
-  }
-}
-</script>
diff --git a/admin/src/views/business/identityInfo.vue b/admin/src/views/business/identityInfo.vue
deleted file mode 100644
index d7c3fd3..0000000
--- a/admin/src/views/business/identityInfo.vue
+++ /dev/null
@@ -1,160 +0,0 @@
-<template>
-  <TableLayout :permissions="['business:identityinfo:query']">
-    <!-- 鎼滅储琛ㄥ崟 -->
-    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="韬唤绫诲瀷" prop="type">
-        <el-select v-model="searchForm.type" clearable placeholder="璇烽�夋嫨韬唤绫诲瀷" @change="search">
-          <el-option :value="0" label="鐢ㄥ伐韬唤"></el-option>
-          <el-option :value="1" label="璐ц繍韬唤"></el-option>
-          <el-option :value="2" label="渚涢韬唤"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="璁よ瘉绫诲瀷 " prop="authType">
-        <el-select v-model="searchForm.authType" clearable placeholder="璇烽�夋嫨璁よ瘉绫诲瀷" @change="search">
-          <el-option :value="0" label="涓汉"></el-option>
-          <el-option :value="1" label="浼佷笟"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鑱旂郴浜�" prop="linkName">
-        <el-input v-model="searchForm.linkName" placeholder="璇疯緭鍏ヨ仈绯讳汉" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鑱旂郴鏂瑰紡" prop="telephone">
-        <el-input v-model="searchForm.telephone" placeholder="璇疯緭鍏ヨ仈绯绘柟寮�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎺ュ崟浣嶇疆" prop="location">
-        <el-input v-model="searchForm.location" placeholder="璇疯緭鍏ユ帴鍗曚綅缃�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍗曚綅鍚嶇О" prop="companyName">
-        <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ュ崟浣嶅悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <section>
-        <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button @click="reset">閲嶇疆</el-button>
-        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">瀵煎嚭</el-button>
-      </section>
-    </el-form>
-    <!-- 琛ㄦ牸鍜屽垎椤� -->
-    <template v-slot:table-wrap>
-<!--      <ul class="toolbar" v-permissions="['business:identityinfo:create', 'business:identityinfo:delete']">
-        <li><el-button type="primary" @click="$refs.operaIdentityInfoWindow.open('鏂板缓浼氬憳韬唤璁よ瘉淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:identityinfo:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:identityinfo:delete']">鍒犻櫎</el-button></li>
-      </ul>-->
-      <el-table
-          :height="tableHeightNew"
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="auditStatus" label="瀹℃牳鐘舵��" min-width="100px" fixed="left">
-          <template slot-scope="{row}">
-            <span class="bluestate" v-if="row.auditStatus ==1">鐢宠涓�</span>
-            <span class="greenstate" v-if="row.auditStatus ==2">宸查�氳繃</span>
-            <span class="redstate" v-if="row.auditStatus ==3">鏈�氳繃</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="openid" label="openid" min-width="180px"  :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="memberName" label="浼氬憳鏄电О" min-width="100px" :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="type" label="绫诲瀷" min-width="100px">
-          <template slot-scope="{row}">
-           <span v-if="row.type ==0">鐢ㄥ伐韬唤</span>
-           <span v-if="row.type ==1">璐ц繍韬唤</span>
-           <span v-if="row.type ==2">渚涢韬唤</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="authType" label="璁よ瘉绫诲瀷" min-width="100px">
-          <template slot-scope="{row}">
-            <span v-if="row.authType ==0">涓汉</span>
-            <span v-if="row.authType ==1">浼佷笟</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="linkName" label="鑱旂郴浜�" min-width="100px" :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="telephone" label="鑱旂郴鏂瑰紡" min-width="100px" :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="location" label="鎺ュ崟浣嶇疆" min-width="180px"  :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="companyName" label="鍗曚綅鍚嶇О" min-width="150px"  :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="createTime" label="鐢宠鏃堕棿" min-width="150px"></el-table-column>
-        <el-table-column prop="editorName" label="瀹℃牳浜�" min-width="100px" :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column prop="auditTime" label="璁よ瘉瀹℃壒鏃堕棿" min-width="150px"></el-table-column>
-        <el-table-column prop="auditRemark" label="璁よ瘉瀹℃壒澶囨敞" min-width="120px"  :show-overflow-tooltip='true'></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:identityinfo:update','business:identityinfo:query'])"
-          label="鎿嶄綔"
-          min-width="160"
-          fixed="right"
-        >
-        <template slot-scope="{row}">
-            <el-button type="text" v-if="row.auditStatus==1" @click="$refs.OperaIdentityDetailWindow.open('鐢ㄦ埛璁よ瘉瀹℃牳', row)" icon="el-icon-edit" v-permissions="['business:identityinfo:update']">瀹℃牳</el-button>
-            <el-button type="text"  @click="$refs.OperaIdentityDetailWindow.open('鐢ㄦ埛璁よ瘉璇︽儏', row)" icon="el-icon-info" >璇︽儏</el-button>
-<!--
-            <el-button type="text" @click="$refs.operaIdentityInfoWindow.open('缂栬緫浼氬憳韬唤璁よ瘉淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:identityinfo:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:identityinfo:delete']">鍒犻櫎</el-button>
--->
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
-    </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaIdentityDetailWindow ref="OperaIdentityDetailWindow" @success="handlePageChange"/>
-  </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaIdentityDetailWindow from '@/components/business/OperaIdentityDetailWindow'
-export default {
-  name: 'IdentityInfo',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaIdentityDetailWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        id: '',
-        deleted: '',
-        createUser: '',
-        createTime: '',
-        updateUser: '',
-        updateTime: '',
-        remark: '',
-        type: '',
-        memberId: '',
-        authType: '',
-        linkName: '',
-        telephone: '',
-        location: '',
-        companyName: '',
-        lat: '',
-        lgt: '',
-        identityFront: '',
-        identityBack: '',
-        businessLicense: '',
-        otherFile: '',
-        transportFile: '',
-        foodBusinessFile: '',
-        healthFile: '',
-        auditStatus: '',
-        auditTime: '',
-        auditRemark: ''
-      }
-    }
-  },
-  created () {
-    this.config({
-      module: '浼氬憳韬唤璁よ瘉淇℃伅琛�',
-      api: '/business/identityInfo',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.search()
-  }
-}
-</script>
diff --git a/admin/src/views/business/interfaceLog.vue b/admin/src/views/business/interfaceLog.vue
new file mode 100644
index 0000000..d31cd1f
--- /dev/null
+++ b/admin/src/views/business/interfaceLog.vue
@@ -0,0 +1,148 @@
+<template>
+  <TableLayout :permissions="['business:interfacelog:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
+      <el-form-item label="鎺ュ彛鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ユ帴鍙e悕绉�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <el-form-item label="绫诲瀷" prop="type">
+        <el-select v-model="searchForm.type" @change="search" placeholder="璇烽�夋嫨">
+          <el-option label="璋冪敤" value="0"></el-option>
+          <el-option label="鎺ㄩ�佹帴鍙�" value="1"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="璧锋鏃堕棿" prop="startDate">
+        <!-- <el-date-picker
+                    @change="seleTime"
+                    v-model="time"
+                    type="datetimerange"
+                    format="yyyy-MM-dd HH:mm:ss"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    range-separator="鑷�"
+                    start-placeholder="寮�濮嬫椂闂�"
+                    end-placeholder="缁撴潫鏃堕棿">
+                </el-date-picker> -->
+        <el-date-picker type="datetime" v-model="searchForm.startDate" value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="璇烽�夋嫨寮�濮嬫椂闂�" @change="changeRadio" />
+        <el-date-picker type="datetime" v-model="searchForm.endDate" value-format="yyyy-MM-dd HH:mm:ss"
+          placeholder="璇烽�夋嫨缁撴潫鏃堕棿" @change="changeRadio" />
+      </el-form-item>
+      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
+        <el-radio-button label="0">褰撳ぉ</el-radio-button>
+        <el-radio-button label="1">杩�7澶�</el-radio-button>
+        <el-radio-button label="2">杩�30澶�</el-radio-button>
+      </el-radio-group>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <el-table :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" stripe>
+        <el-table-column prop="name" label="鎺ュ彛鍚嶇О" min-width="180px"></el-table-column>
+        <el-table-column prop="url" label="鍦板潃淇℃伅" min-width="180px"></el-table-column>
+        <el-table-column label="绫诲瀷" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.type == 0">璋冪敤</span>
+            <span v-if="row.type == 1">鎺ㄩ�佹帴鏀�</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="骞冲彴" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.plat == 0">娴峰悍瀹夐槻骞冲彴</span>
+            <span v-if="row.plat == 1">ERP绯荤粺</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="request" label="璇锋眰鍙傛暟" min-width="100px">
+          <template slot-scope="{row}">
+            <el-button type="text"
+              @click="$refs.operaInterfaceLogWindow.open('璇锋眰鍙傛暟', { content: row.request })">鏌ョ湅</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="repose" label="鍝嶅簲鍙傛暟" min-width="100px">
+          <template slot-scope="{row}">
+            <el-button type="text"
+              @click="$refs.operaInterfaceLogWindow.open('鍝嶅簲鍙傛暟', { content: row.repose })">鏌ョ湅</el-button>
+          </template>
+        </el-table-column>
+        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
+      </el-table>
+      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaInterfaceLogWindow ref="operaInterfaceLogWindow" @success="handlePageChange" />
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaInterfaceLogWindow from '@/components/business/OperaInterfaceLogWindow'
+import { timeForMat } from '@/utils/util'
+export default {
+  name: 'InterfaceLog',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaInterfaceLogWindow },
+  data() {
+    return {
+      // 鎼滅储
+      searchForm: {
+        name: '',
+        type: '',
+        endDate: '',
+        startDate: '',
+        radio: '0'
+      },
+      time: []
+    }
+  },
+  created() {
+    this.config({
+      module: '涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍',
+      api: '/business/interfaceLog',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.changeRadio('0')
+  },
+  methods: {
+    changeRadio(e) {
+      if (e === '0') {
+        this.searchForm.startDate = timeForMat(0)[0]
+        this.searchForm.endDate = timeForMat(0)[1]
+      } else if (e === '1') {
+        this.searchForm.startDate = timeForMat(6)[0]
+        this.searchForm.endDate = timeForMat(6)[1]
+      } else if (e === '2') {
+        this.searchForm.startDate = timeForMat(29)[0]
+        this.searchForm.endDate = timeForMat(29)[1]
+      } else {
+        this.searchForm.radio = ''
+      }
+      if (this.searchForm.startDate && this.searchForm.endDate && new Date(this.searchForm.startDate).getTime() > new Date(this.searchForm.endDate).getTime()) {
+        this.$message.error('寮�濮嬫椂闂翠笉鑳藉ぇ浜庣粨鏉熸椂闂�')
+        this.searchForm.startDate = ''
+        return
+      }
+      this.search()
+    },
+    seleTime(e) {
+      this.searchForm.startDate = e[0]
+      this.searchForm.endDate = e[1]
+      this.searchForm.radio = null
+      this.search()
+    },
+    reset() {
+      this.$refs.searchForm.resetFields()
+      this.searchForm.startDate = ''
+      this.searchForm.endDate = ''
+      this.searchForm.radio = ''
+      this.time = []
+      this.search()
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
index 6e99eef..c89fec6 100644
--- a/admin/src/views/business/member.vue
+++ b/admin/src/views/business/member.vue
@@ -2,42 +2,104 @@
   <TableLayout :permissions="['business:member:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="鎵嬫満鍙�" prop="telephone">
-        <el-input v-model="searchForm.telephone" clearable placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name"  style="width: 150px" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鐪熷疄濮撳悕" prop="name">
-        <el-input v-model="searchForm.name" clearable placeholder="璇疯緭鍏ョ湡瀹炲鍚�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="宸ュ彿" prop="code">
+        <el-input v-model="searchForm.code" style="width: 150px" placeholder="璇疯緭鍏ュ伐鍙�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="绫诲瀷" prop="type">
-        <el-select v-model="searchForm.type" clearable placeholder="璇烽�夋嫨绫诲瀷" @change="search">
-            <el-option :value="0" label="鍏ㄩ儴"></el-option>
-            <el-option :value="1" label="鎺ュ崟鏂�"></el-option>
+      <el-form-item label="鎴樺尯" prop="fieldIdList">
+        <el-select
+            v-model="searchForm.fieldIdList"
+            style="width: 150px"
+            placeholder="鎴樺尯"
+            clearable
+            multiple
+            @change="search"
+        >
+          <el-option
+              v-for="item in cateList"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
         </el-select>
       </el-form-item>
-<!--      <el-form-item label="鐘舵��" prop="status">
-        <el-select v-model="searchForm.status"  @keypress.enter.native="search" clearable placeholder="鐘舵��">
-          <el-option label="鍚敤" value="0"></el-option>
-          <el-option label="绂佺敤" value="1"></el-option>
+      <el-form-item label="鍟嗕笟鍖栫被鍨�" prop="busTypeIdList">
+        <el-select
+            v-model="searchForm.busTypeIdList"
+            style="width: 150px"
+            placeholder="鍟嗕笟鍖栫被鍨�"
+            clearable
+            multiple
+            @change="search"
+        >
+          <el-option
+              v-for="item in cateList1"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
         </el-select>
-      </el-form-item>-->
-      <el-form-item label="娉ㄥ唽鏃堕棿" prop="eventType">
-        <el-date-picker type="datetime" style="width: 120px" v-model="searchForm.startTime" clearable value-format="yyyy-MM-dd HH:mm:ss"
-                        placeholder="寮�濮嬫椂闂�" />-
-        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.endTime" clearable value-format="yyyy-MM-dd HH:mm:ss"
-                        placeholder="缁撴潫鏃堕棿" />
+      </el-form-item>
+      <el-form-item label="鎿呴暱棰嗗煙" prop="levelIdList">
+        <el-select
+            v-model="searchForm.levelIdList"
+            style="width: 150px"
+            placeholder="鎿呴暱棰嗗煙"
+            clearable
+            multiple
+            @change="search"
+        >
+          <el-option
+              v-for="item in cateList2"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鑰佸笀绛夌骇" prop="levelIdList">
+        <el-select
+            v-model="searchForm.levelIdList"
+            style="width: 150px"
+            placeholder="鑰佸笀绛夌骇"
+            clearable
+            multiple
+            @change="search"
+        >
+          <el-option
+              v-for="item in cateList3"
+              :key="item.id"
+              :value="item.id"
+              :label="item.name"
+          ></el-option>
+        </el-select>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-select
+              v-model="searchForm.status"
+              placeholder="鐘舵��"
+              clearable
+              style="width: 150px"
+              @change="search"
+          >
+            <el-option :key="0" :value="0" label="鍚敤"></el-option>
+            <el-option :key="1" :value="1" label="绂佺敤"></el-option>
+          </el-select>
+        </el-form-item>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
         <el-button @click="reset">閲嶇疆</el-button>
-        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">瀵煎嚭</el-button>
       </section>
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-<!--      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
-        <li><el-button type="primary" @click="$refs.operaMemberWindow.open('鏂板缓浼氬憳淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
-      </ul>-->
+      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+        <li><el-button type="primary" @click="$refs.operaMemberWindow.open('鏂板缓鑰佸笀',null)" icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓</el-button></li>
+        <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:member:create']" @click="$refs.OperaMemberImportWindow.open('鑰佸笀瀵煎叆', searchForm.companyType)">鎵归噺瀵煎叆</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
+      </ul>
       <el-table
           :height="tableHeightNew"
         v-loading="isWorking.search"
@@ -46,55 +108,57 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="openid" label="openid" min-width="100px">
+        <el-table-column  prop="imgurl" label="鍥剧墖" min-width="100px">
           <template slot-scope="{row}">
-           <span style="cursor: pointer;color: #2E68EC" @click="openDetail(row)">{{row.openid}}</span>
+            <el-image v-if="row.imgurlfull" style="width: 50px; height: 50px; margin-right: 10px" :src="row.imgurlfull"
+                      :preview-src-list="[row.imgurlfull]">
+            </el-image>
           </template>
         </el-table-column>
-        <el-table-column prop="nickName" label="鏄电О" min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="鐪熷疄濮撳悕" min-width="100px"></el-table-column>
-        <el-table-column prop="telephone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
-        <el-table-column prop="workerIdentity" label="韬唤" min-width="100px">
+        <el-table-column prop="code" label="宸ュ彿" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column prop="sex" label="鎬у埆" min-width="100px">
           <template slot-scope="{row}">
-            鍙戝崟鏂�<span v-if="row.workerIdentity == 2 || row.driverIdentity == 2 || row.chefIdentity == 2">{{'  |  鎺ュ崟鏂�'}}</span>
+            <span v-if="row.sex ==0">鐢�</span>
+            <span v-if="row.sex ==1">濂�</span>
           </template>
         </el-table-column>
-        <el-table-column prop="workerIdentity" label="鎺ュ崟璁よ瘉韬唤"  width="120px">
+        <el-table-column prop="position" label="宀椾綅" min-width="120px"></el-table-column>
+        <el-table-column prop="levelName" label="绛夌骇" min-width="100px"></el-table-column>
+        <el-table-column prop="jobYear" label="浠庝笟骞翠唤" min-width="100px"></el-table-column>
+        <el-table-column prop="serveNum" label="鏈嶅姟鍟嗗満" min-width="100px">
           <template slot-scope="{row}">
-            <div v-if="row.workerIdentity == 2" class="renzhen">宸ヤ汉</div>
-            <div v-if=" row.driverIdentity == 2"  class="renzhen">鍙告満</div>
-            <div v-if="row.chefIdentity == 2"    class="renzhen">渚涢</div>
+            <span v-if="row.serveNum">{{row.serveNum}}涓�</span>
           </template>
         </el-table-column>
-        <el-table-column prop="amount" label="褰撳墠浣欓(鍏�)" min-width="100px">
+        <el-table-column prop="caseNum" label="鏍囨潌妗堜緥" min-width="100px">
           <template slot-scope="{row}">
-            <span class="yellowstate">{{((row.amount || 0)/100).toFixed(2)}}</span>
+            <span v-if="row.caseNum">{{row.caseNum}}涓�</span>
           </template>
         </el-table-column>
-        <el-table-column prop="createTime" label="娉ㄥ唽鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="autoReciveStatus" label="鎺ュ彈鑷姩娲惧崟" min-width="100px">
-            <template slot-scope="{row}">
-              {{row.autoReceiveStatus ==1?"鏄�":"鍚�"}}
-            </template>
-        </el-table-column>
-<!--        <el-table-column label="鐘舵��">
+        <el-table-column prop="busTypeNames" label="鍟嗕笟鍖栫被鍨�" min-width="200px"></el-table-column>
+        <el-table-column prop="areaNames" label="鏈嶅姟鎴樺尯" min-width="200px"></el-table-column>
+        <el-table-column prop="fieldNames" label="鎿呴暱棰嗗煙" min-width="200px"></el-table-column>
+        <el-table-column label="鐘舵��">
           <template slot-scope="{row}">
             <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
-                       inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+            inactive-color="#ff4949" :active-value="0" :inactive-value="1">
             </el-switch>
           </template>
         </el-table-column>
-      <el-table-column
-              v-if="containPermissions(['business:member:update', 'business:member:delete'])"
-              label="鎿嶄綔"
-              min-width="120"
-              fixed="right"
-            >
+        <el-table-column prop="updateUserName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
+        <el-table-column prop="updateTime" label="鏈�杩戞搷浣滄椂闂�" min-width="150px"></el-table-column>
+        <el-table-column
+          v-if="containPermissions(['business:member:update', 'business:member:delete'])"
+          label="鎿嶄綔"
+          min-width="120"
+          fixed="right"
+        >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaMemberWindow.open('缂栬緫浼氬憳淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="$refs.operaMemberWindow.open('缂栬緫鑰佸笀', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:member:update']">缂栬緫</el-button>
+            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button>
           </template>
-        </el-table-column>-->
+        </el-table-column>
       </el-table>
       <pagination
         @size-change="handleSizeChange"
@@ -104,8 +168,8 @@
       </pagination>
     </template>
     <!-- 鏂板缓/淇敼 -->
-    <OperaMemberDetailWindow ref="OperaMemberDetailWindow" />
     <OperaMemberWindow ref="operaMemberWindow" @success="handlePageChange"/>
+    <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -114,51 +178,63 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaMemberWindow from '@/components/business/OperaMemberWindow'
-import OperaMemberDetailWindow from '@/components/business/OperaMemberDetailWindow'
+import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
+import { findAll as cateList } from '@/api/business/category'
 export default {
-  name: 'Member',
+  name: 'Category',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaMemberDetailWindow, OperaMemberWindow },
+  components: { TableLayout, Pagination, OperaMemberWindow ,OperaMemberImportWindow},
   data () {
     return {
       // 鎼滅储
       searchForm: {
-        type: 0,
-        startTime: '',
-        endTime: '',
-        telephone: '',
         name: '',
-        status: ''
-      }
+        code: '',
+        status: null,
+        levelIdList:[],
+        fieldIdList: [],
+        busTypeIdList:[],
+        type: 0
+      },
+      cateList:[],
+      cateList1:[],
+      cateList2:[],
+      cateList3:[],
     }
   },
   created () {
     this.config({
-      module: '浼氬憳淇℃伅琛�',
+      module: '璁插笀淇℃伅琛�',
       api: '/business/member',
       'field.id': 'id',
       'field.main': 'id'
     })
     this.search()
+    cateList({
+      type: 0 , //鎴樺尯
+    }).then(res => {
+      this.cateList = res
+    })
+    cateList({
+      type: 1 , //鍟嗕笟鍖�
+    }).then(res => {
+      this.cateList1 = res
+    })
+    cateList({
+      type: 2 , //鎿呴暱棰嗙敤
+    }).then(res => {
+      this.cateList2 = res
+    })
+    cateList({
+      type: 3 , //绛夌骇
+    }).then(res => {
+      this.cateList3 = res
+    })
   },
   methods: {
-    reset () {
-      this.searchForm = {
-        type: 0,
-        startTime: '',
-        endTime: '',
-        telephone: '',
-        name: '',
-        status: ''
-      }
-      this.search()
-    },
-    openDetail (row) {
-      this.$refs.OperaMemberDetailWindow.open('鐢ㄦ埛璇︽儏', row.id)
-    },
     changeStatus (e, row) {
       this.working = true
-      this.api.updateStatus({ id: row.id, workStatus: e })
+      this.api.updateStatus({ id: row.id, status: e })
         .then(res => {
           this.$tip.apiSuccess(res || '鎿嶄綔鎴愬姛')
           this.search()
@@ -169,19 +245,7 @@
         .finally(() => {
           this.working = false
         })
-        .catch(() => { })
     }
   }
 }
 </script>
-<style  scoped lang="scss">
-.renzhen{
-  margin: 5px;
-  line-height: 30px;
-  color:#67c23a;
-  height: 30px;
-  text-align:center;
-  border-color: #e1f3d8;
-  background-color: #f0f9eb;
-}
-</style>
diff --git a/admin/src/views/business/memberRevenue.vue b/admin/src/views/business/memberRevenue.vue
deleted file mode 100644
index cd8a473..0000000
--- a/admin/src/views/business/memberRevenue.vue
+++ /dev/null
@@ -1,154 +0,0 @@
-<template>
-  <TableLayout :permissions="['business:memberrevenue:query']">
-    <!-- 鎼滅储琛ㄥ崟 -->
-    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="涓婚敭" prop="id">
-        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�" prop="deleted">
-        <el-input v-model="searchForm.deleted" placeholder="璇疯緭鍏ユ槸鍚﹀凡鍒犻櫎 0鏈垹闄� 1宸插垹闄�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="createUser">
-        <el-input v-model="searchForm.createUser" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-        <el-date-picker v-model="searchForm.createTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="updateUser">
-        <el-input v-model="searchForm.updateUser" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="updateTime">
-        <el-date-picker v-model="searchForm.updateTime" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="浼氬憳涓婚敭" prop="memberId">
-        <el-input v-model="searchForm.memberId" placeholder="璇疯緭鍏ヤ細鍛樹富閿�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍙樺姩绫诲瀷:0=鐢ㄥ伐鍗曟敹鍏ワ紱1=璐ц繍鍗曟敹鍏ワ紱2=渚涢鍗曟敹鍏ワ紱3=鎻愮幇鐢宠锛�" prop="type">
-        <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ュ彉鍔ㄧ被鍨�:0=鐢ㄥ伐鍗曟敹鍏ワ紱1=璐ц繍鍗曟敹鍏ワ紱2=渚涢鍗曟敹鍏ワ紱3=鎻愮幇鐢宠锛�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏀舵敮绫诲瀷:1=鏀跺叆锛�-1=鏀嚭锛�" prop="optType">
-        <el-input v-model="searchForm.optType" placeholder="璇疯緭鍏ユ敹鏀被鍨�:1=鏀跺叆锛�-1=鏀嚭锛�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍙樺姩閲戦" prop="amount">
-        <el-input v-model="searchForm.amount" placeholder="璇疯緭鍏ュ彉鍔ㄩ噾棰�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍙樺姩鍓嶉噾棰�" prop="beforeAmount">
-        <el-input v-model="searchForm.beforeAmount" placeholder="璇疯緭鍏ュ彉鍔ㄥ墠閲戦" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍙樺姩鍚庨噾棰�" prop="afterAmount">
-        <el-input v-model="searchForm.afterAmount" placeholder="璇疯緭鍏ュ彉鍔ㄥ悗閲戦" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="涓氬姟璁板綍涓婚敭" prop="objId">
-        <el-input v-model="searchForm.objId" placeholder="璇疯緭鍏ヤ笟鍔¤褰曚富閿�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="涓氬姟绫诲瀷:0=璁㈠崟涓氬姟锛�1=鎻愮幇涓氬姟锛�" prop="objType">
-        <el-input v-model="searchForm.objType" placeholder="璇疯緭鍏ヤ笟鍔$被鍨�:0=璁㈠崟涓氬姟锛�1=鎻愮幇涓氬姟锛�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="涓氬姟鐘舵��:0=鎴愬姛锛�1=澶辫触锛�2=澶勭悊涓紱" prop="status">
-        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ヤ笟鍔$姸鎬�:0=鎴愬姛锛�1=澶辫触锛�2=澶勭悊涓紱" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <section>
-        <el-button type="primary" @click="search">鎼滅储</el-button>
-        <el-button @click="reset">閲嶇疆</el-button>
-      </section>
-    </el-form>
-    <!-- 琛ㄦ牸鍜屽垎椤� -->
-    <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:memberrevenue:create', 'business:memberrevenue:delete']">
-        <li><el-button type="primary" @click="$refs.operaMemberRevenueWindow.open('鏂板缓浼氬憳鏀舵敮璁板綍')" icon="el-icon-plus" v-permissions="['business:memberrevenue:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:memberrevenue:delete']">鍒犻櫎</el-button></li>
-      </ul>
-      <el-table
-          :height="tableHeightNew"
-        v-loading="isWorking.search"
-        :data="tableData.list"
-        stripe
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="deleted" label="鏄惁宸插垹闄� 0鏈垹闄� 1宸插垹闄�" min-width="100px"></el-table-column>
-        <el-table-column prop="createUser" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="updateUser" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="memberId" label="浼氬憳涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="type" label="鍙樺姩绫诲瀷:0=鐢ㄥ伐鍗曟敹鍏ワ紱1=璐ц繍鍗曟敹鍏ワ紱2=渚涢鍗曟敹鍏ワ紱3=鎻愮幇鐢宠锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="optType" label="鏀舵敮绫诲瀷:1=鏀跺叆锛�-1=鏀嚭锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="amount" label="鍙樺姩閲戦" min-width="100px"></el-table-column>
-        <el-table-column prop="beforeAmount" label="鍙樺姩鍓嶉噾棰�" min-width="100px"></el-table-column>
-        <el-table-column prop="afterAmount" label="鍙樺姩鍚庨噾棰�" min-width="100px"></el-table-column>
-        <el-table-column prop="objId" label="涓氬姟璁板綍涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="objType" label="涓氬姟绫诲瀷:0=璁㈠崟涓氬姟锛�1=鎻愮幇涓氬姟锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="涓氬姟鐘舵��:0=鎴愬姛锛�1=澶辫触锛�2=澶勭悊涓紱" min-width="100px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:memberrevenue:update', 'business:memberrevenue:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
-          <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaMemberRevenueWindow.open('缂栬緫浼氬憳鏀舵敮璁板綍', row)" icon="el-icon-edit" v-permissions="['business:memberrevenue:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:memberrevenue:delete']">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        @size-change="handleSizeChange"
-        @current-change="handlePageChange"
-        :pagination="tableData.pagination"
-      >
-      </pagination>
-    </template>
-    <!-- 鏂板缓/淇敼 -->
-    <OperaMemberRevenueWindow ref="operaMemberRevenueWindow" @success="handlePageChange"/>
-  </TableLayout>
-</template>
-
-<script>
-import BaseTable from '@/components/base/BaseTable'
-import TableLayout from '@/layouts/TableLayout'
-import Pagination from '@/components/common/Pagination'
-import OperaMemberRevenueWindow from '@/components/business/OperaMemberRevenueWindow'
-export default {
-  name: 'MemberRevenue',
-  extends: BaseTable,
-  components: { TableLayout, Pagination, OperaMemberRevenueWindow },
-  data () {
-    return {
-      // 鎼滅储
-      searchForm: {
-        id: '',
-        deleted: '',
-        createUser: '',
-        createTime: '',
-        updateUser: '',
-        updateTime: '',
-        remark: '',
-        memberId: '',
-        type: '',
-        optType: '',
-        amount: '',
-        beforeAmount: '',
-        afterAmount: '',
-        objId: '',
-        objType: '',
-        status: ''
-      }
-    }
-  },
-  created () {
-    this.config({
-      module: '浼氬憳鏀舵敮璁板綍',
-      api: '/business/memberRevenue',
-      'field.id': 'id',
-      'field.main': 'id'
-    })
-    this.search()
-  }
-}
-</script>
diff --git a/admin/src/views/index.vue b/admin/src/views/index.vue
index c05ce02..1a09910 100644
--- a/admin/src/views/index.vue
+++ b/admin/src/views/index.vue
@@ -3,7 +3,7 @@
     <div class="home_header">
       <div class="mb10 fs17">涓嬪崍濂斤紝{{ userInfo.realname }}</div>
       <div class="fs13">
-        浠婂ぉ鏄� {{ nowDate }} {{ nowWeek }}锛屾杩庤闂繎蹇悗鍙扮鐞嗙郴缁�
+        浠婂ぉ鏄� {{ nowDate }} {{ nowWeek }}锛屾杩庤闂織閭︾偣灏嗗悗鍙扮鐞嗙郴缁�
       </div>
     </div>
   </div>
diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue
index 9d4a68c..4003310 100644
--- a/admin/src/views/login.vue
+++ b/admin/src/views/login.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="wrap">
     <div class="introduce">
-      <h2>杩戝揩鍚庡彴绠$悊绯荤粺</h2>
+      <h2>蹇楅偊鐐瑰皢鍚庡彴绠$悊绯荤粺</h2>
       <h3></h3>
     </div>
     <div class="login">
diff --git a/server/admin/src/main/java/com/doumee/api/business/CategoryController.java b/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
index e949e2b..6bec36e 100644
--- a/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/CategoryController.java
@@ -85,6 +85,12 @@
     public ApiResponse<PageData<Category>> findPage (@RequestBody PageWrap<Category> pageWrap) {
         return ApiResponse.success(categoryService.findPage(pageWrap));
     }
+    @ApiOperation("鍒楄〃鏌ヨ")
+    @PostMapping("/list")
+    @RequiresPermissions("business:category:query")
+    public ApiResponse<List<Category>> findList (@RequestBody  Category pageWrap) {
+        return ApiResponse.success(categoryService.findList(pageWrap));
+    }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
diff --git a/server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java b/server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java
index 4f83adc..b506794 100644
--- a/server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java
@@ -9,20 +9,23 @@
 import com.doumee.dao.business.model.ImportRecord;
 import com.doumee.core.utils.Utils;
 import com.doumee.service.business.ImportRecordService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 
 import  com.doumee.api.BaseController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+
 /**
  * 鍒嗙被淇℃伅琛–ontroller瀹氫箟
  * @author doumee
  * @date 2026-01-27 16:02:37
  */
-@Api(tags = "tableName鎺ュ彛")
+@Api(tags = "鍒嗙被淇℃伅琛ㄦ帴鍙�")
 @RestController
 @RequestMapping("/business/importRecord")
 public class ImportRecordController extends BaseController {
@@ -82,4 +85,16 @@
     public ApiResponse findById(@PathVariable Integer id) {
         return ApiResponse.success(importRecordService.findById(id));
     }
+
+    @ApiOperation(value = "淇℃伅瀵煎叆" ,notes = "淇濆崟鐢宠")
+    @PostMapping("/importExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+            @ApiImplicitParam(name = "瀵煎叆绫诲瀷 0浜哄憳 1妗堜緥", value = "type", required = true, paramType = "query", dataType = "Integer",example = "0",dataTypeClass = Integer.class),
+    })
+    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @ApiParam(value = "type") Integer type) {
+        ImportRecord importRecord = importRecordService.importBatch(file,type);
+        importRecordService.dealImporTask(importRecord);
+        return ApiResponse.success("鏂囦欢涓婁紶鎴愬姛");
+    }
 }
diff --git a/server/admin/src/main/java/com/doumee/api/business/MemberController.java b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
index c174e23..42bf73a 100644
--- a/server/admin/src/main/java/com/doumee/api/business/MemberController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -9,20 +9,23 @@
 import com.doumee.dao.business.model.Member;
 import com.doumee.core.utils.Utils;
 import com.doumee.service.business.MemberService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 
 import  com.doumee.api.BaseController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+
 /**
  * 浼氬憳淇℃伅琛–ontroller瀹氫箟
  * @author doumee
  * @date 2026-01-27 16:02:37
  */
-@Api(tags = "tableName鎺ュ彛")
+@Api(tags = "浼氬憳淇℃伅琛ㄦ帴鍙�")
 @RestController
 @RequestMapping("/business/member")
 public class MemberController extends BaseController {
@@ -76,6 +79,7 @@
         ExcelExporter.build(Member.class).export(memberService.findPage(pageWrap).getRecords(), "浼氬憳淇℃伅琛�", response);
     }
 
+
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @RequiresPermissions("business:member:query")
diff --git a/server/pom.xml b/server/pom.xml
index 195fccc..4c972ee 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -46,6 +46,11 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+      <version>5.8.40</version>
+    </dependency>
     <!-- Shiro -->
     <dependency>
       <groupId>org.apache.shiro</groupId>
diff --git a/server/services/lib/zos-sdk.jar b/server/services/lib/zos-sdk.jar
new file mode 100644
index 0000000..e4254fb
--- /dev/null
+++ b/server/services/lib/zos-sdk.jar
Binary files differ
diff --git a/server/services/pom.xml b/server/services/pom.xml
index 0c39221..f8eb953 100644
--- a/server/services/pom.xml
+++ b/server/services/pom.xml
@@ -10,6 +10,21 @@
     <version>1.0.0-SNAPSHOT</version>
   </parent>
 
+  <dependencies>
+    <dependency>
+      <groupId>com.tianyiyun</groupId>
+      <artifactId>zob</artifactId>
+      <version>1.0</version>
+      <scope>system</scope>
+      <!--鏈湴鐨刯acob.jar鐨勮矾寰�-->
+      <systemPath>${project.basedir}/lib/zos-sdk.jar</systemPath>
+    </dependency>
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+      <version>5.8.40</version>
+    </dependency>
+  </dependencies>
   <properties>
     <maven.compiler.source>8</maven.compiler.source>
     <maven.compiler.target>8</maven.compiler.target>
diff --git a/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java b/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
deleted file mode 100644
index f4addb1..0000000
--- a/server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
+++ /dev/null
@@ -1,249 +0,0 @@
-package com.doumee.api.common;
-
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.doumee.api.BaseController;
-import com.doumee.biz.system.SystemDictDataBiz;
-import com.doumee.config.annotation.EncryptionReq;
-import com.doumee.config.annotation.EncryptionResp;
-import com.doumee.core.annotation.trace.Trace;
-import com.doumee.core.constants.Constants;
-import com.doumee.core.constants.ResponseStatus;
-import com.doumee.core.exception.BusinessException;
-import com.doumee.core.model.ApiResponse;
-import com.doumee.core.utils.DateUtil;
-import com.doumee.core.utils.FtpUtil;
-import com.doumee.core.utils.azure.AzureBlobUtil;
-import com.doumee.core.utils.huaweiOBS.ObsUtil;
-import com.doumee.core.utils.qiyeweixin.QywxUtil;
-import com.doumee.core.utils.qiyeweixin.model.response.QywxUploadMediaResponse;
-import com.doumee.dao.system.model.SystemDictData;
-import com.doumee.service.common.EmailService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-import org.springframework.web.multipart.MultipartRequest;
-import org.springframework.web.multipart.commons.CommonsMultipartResolver;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.util.*;
-
-/**
- * @author Eva.Caesar Liu
- * @date 2023/02/14 11:14
- */
-@Api(tags = "鍏叡涓婁紶鎺ュ彛")
-@Trace(exclude = true)
-@RestController
-@RequestMapping("/web/public")
-@Slf4j
-public class PublicCloudController extends BaseController {
-    @Autowired
-    private SystemDictDataBiz systemDictDataBiz;
-
-    @ApiOperation(value = "涓婁紶OBS", notes = "涓婁紶OBS", httpMethod = "POST", position = 6)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
-            @ApiImplicitParam(name = "file", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
-    })
-    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
-    @ResponseBody
-    public void upload(HttpServletRequest request, HttpServletResponse response, String folder,String flag) throws Exception {
-        Date d1 = new Date();
-        log.error("鎬诲緱涓婁紶鏂囦欢鎴愬姛=============寮�濮�========="+DateUtil.getPlusTime2(d1));
-        if(Objects.isNull(folder)){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐩爣鏂囦欢澶归敊璇�");
-        }
-        String prefixPath = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode();
-        InputStream is = null;
-        response.setCharacterEncoding("UTF-8");
-        response.setContentType("text/html;charset=UTF-8");
-        Map<String, Object> context = new HashMap<>();
-        try {
-            CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
-            if (multipartResovler.isMultipart(request)) {
-                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-                Iterator<String> it = multipartRequest.getFileNames();
-                while (it.hasNext()) {
-                    MultipartFile file = multipartRequest.getFile(it.next());
-                    System.out.println(file.getSize());
-                    String originname = file.getOriginalFilename();
-                    is = file.getInputStream();
-                    String endType = ".jpg";
-                    if(originname.indexOf(".")>0){
-                        endType=originname.substring(originname.lastIndexOf("."),originname.length());
-                    }
-                    String date = DateUtil.getNowShortDate();
-                    String fName =  date+"/"+ UUID.randomUUID()+endType;
-                    String fileName = folder+"/"+fName;
-                    boolean r =false;
-                    ObsUtil obsUtil = new ObsUtil( systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ACCESSID).getCode(),
-                            systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ACCESSKEY).getCode(),
-                            systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_ENDPOINT).getCode());
-                    r = obsUtil.uploadFile( systemDictDataBiz.queryByCode(Constants.HWY_OBS,Constants.HWY_OBS_BUCKET).getCode(),is,fileName);//涓婁紶
-                    if(r){
-                        context.put("success", true);
-                        context.put("code", 200);
-                        context.put("errno",0);
-                        JSONObject fileJSON = new JSONObject();
-//                        fileJSON.put("prefixPath", prefixPath);
-//                        fileJSON.put("folder", folder);
-                        fileJSON.put("url", prefixPath+fileName);
-                        fileJSON.put("imgaddr", fName);
-                        fileJSON.put("imgname", fileName);
-                        fileJSON.put("originname", originname);
-                        fileJSON.put("flag", flag);
-                        context.put("data",fileJSON);
-                        context.put("message","璇锋眰鎴愬姛");
-                        writerJson(response, context);
-                        Date d2= new Date();
-                        log.error("鎬荤殑涓婁紶鏂囦欢鎴愬姛=============缁撴潫========="+DateUtil.getPlusTime2(d2) +"鑰楁椂绉掞細"+( (d2.getTime()-d1.getTime()) /1000));
-                        return;
-                    }
-                }
-            }
-        } catch (Exception e) {
-            log.error("銆愪笂浼燜TP澶辫触銆�======================"+e.getMessage());
-        }
-        context.put("code", 0);
-        context.put("message", "涓婁紶澶辫触");
-        context.put("errno",0);
-        writerJson(response, context);
-        return;
-    }
-
-
-    public void uploadFileLocal(HttpServletRequest request,  HttpServletResponse response, String rootPath,String dir) throws Exception {
-        response.setCharacterEncoding("UTF-8");
-        response.setContentType("text/html;charset=UTF-8");
-        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
-        Map<String, Object> context = new HashMap<>();
-        if (multipartResovler.isMultipart(request)) {
-            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
-            Iterator<String> it = multipartRequest.getFileNames();
-            while (it.hasNext()) {
-                MultipartFile file = multipartRequest.getFile((String) it.next());
-                if (file != null) {
-                    if (file.getSize() > 200 * 1024 * 1024L) {
-                        context.put("code", 4000);
-                        context.put("message", "涓婁紶鏂囦欢杩囧ぇ");
-                        return;
-                    }
-                    System.out.println(file.getOriginalFilename());
-                    if (file.getOriginalFilename() == null) {
-                        context.put("code", 4000);
-                        context.put("message", "鏂囦欢鍚嶄笉鍙负绌�");
-                        return;
-                    }
-                    String nowDate = DateUtil.getNowShortDate();
-                    String folder = nowDate + "/";
-                    String strDirPath = rootPath + folder;
-                    File dirPath = new File(strDirPath);
-                    if (!dirPath.exists()) {
-                        dirPath.mkdirs();
-                    }
-                    String uploadFileName = file.getOriginalFilename();
-                    String x = UUID.randomUUID().toString().replace("-", "")
-                            + uploadFileName.substring(uploadFileName.lastIndexOf("."));
-                    String fileName = folder + x;
-                    String fileNames = nowDate + "/" + x;
-                    uploadFileName = uploadFileName.replace(" ", "");
-                    uploadFileName = uploadFileName.replace("锛�", ",");
-                    uploadFileName = uploadFileName.replaceAll(",", "-");
-                    String fileAndPath = dir + fileName;
-                    // 鍒ゆ柇濡傛灉涓存椂鐩綍涓瓨鍦ㄧ浉鍚屽悕绉扮殑鏂囦欢鍏堝垹闄わ紝鍦ㄤ笂浼�
-                    File tempFile = new File(rootPath + fileName);
-                    if (tempFile.isFile() && tempFile.exists()) {
-                        tempFile.getAbsoluteFile().delete();
-                    }
-                    // 涓婁紶鍒版湇鍔″櫒涓存椂鏂囦欢澶�
-                    file.transferTo(tempFile);
-                    // 杞Щ鍒癋TP鏈嶅姟鍣�
-                    String nfix = "";
-                    if (null != uploadFileName) {
-                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
-                    }
-
-                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
-                        context.put("code", 4000);
-                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".exe\"涓婁紶鏈夎锛�");
-                        return;
-                    }
-                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
-                        context.put("code", 4000);
-                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".dll\"涓婁紶鏈夎锛�");
-                        return;
-                    }
-
-                    String remoteFileName = fileAndPath;
-
-                    if (true) {
-                        context.put("success", true);
-                        context.put("code", 200);
-                        context.put("errno",0);
-                        JSONObject fileJSON = new JSONObject();
-                        fileJSON.put("url", remoteFileName);
-                        fileJSON.put("imgaddr", fileNames);
-                        fileJSON.put("imgname", uploadFileName);
-                        fileJSON.put("originname", uploadFileName);
-                        context.put("data",fileJSON);
-                        context.put("message","璇锋眰鎴愬姛");
-                        writerJson(response, context);
-                        return;
-                    } else {
-                        // 绉诲姩澶辫触
-                        context.put("code", 0);
-                        context.put("message", "涓婁紶澶辫触");
-                        writerJson(response, context);
-                    }
-                }
-                context.put("code", 0);
-                context.put("message", "涓婁紶澶辫触");
-                writerJson(response, context);
-                return;
-            }
-        }
-        context.put("code", 0);
-        context.put("message", "涓婁紶澶辫触");
-        writerJson(response, context);
-        return;
-    }
-
-
-
-    public static void writerJson(HttpServletResponse response, Object object) {
-        response.setContentType("application/json");
-        writer(response, JSONObject.toJSONString(object));
-    }
-
-    private static void writer(HttpServletResponse response, String str) {
-        try {
-            StringBuffer result = new StringBuffer();
-            //璁剧疆椤甸潰涓嶇紦瀛�
-            response.setHeader("Pragma", "No-cache");
-            response.setHeader("Cache-Control", "no-cache");
-            response.setCharacterEncoding("UTF-8");
-            PrintWriter out = null;
-            out = response.getWriter();
-            out.print(str);
-            out.flush();
-            out.close();
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-    }
-
-}
diff --git a/server/services/src/main/java/com/doumee/api/common/PublicController.java b/server/services/src/main/java/com/doumee/api/common/PublicController.java
new file mode 100644
index 0000000..74591df
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/api/common/PublicController.java
@@ -0,0 +1,168 @@
+package com.doumee.api.common;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.FtpUtil;
+import com.doumee.core.utils.tyyun.TyyZosUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+import javax.imageio.ImageIO;
+import javax.imageio.stream.ImageOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @author Eva.Caesar Liu
+ * @date 2023/02/14 11:14
+ */
+@Api(tags = "鍏叡鎺ュ彛")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/public")
+@Slf4j
+public class PublicController extends BaseController {
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    public static FtpUtil ftp  = null;
+
+    @ApiOperation(value = "涓婁紶", notes = "涓婁紶", httpMethod = "POST", position = 6)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "folder", value = "鏂囦欢澶�", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
+    })
+    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
+    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        upload(multipartRequest, response, folder + "/",
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.BUCKETNAME).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_ID).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_KEY).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode(),
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ENDPOINT).getCode());
+    }
+
+
+    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
+                       String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
+        response.setCharacterEncoding("UTF-8");
+        response.setContentType("text/html;charset=UTF-8");
+        Map<String, Object> context = new HashMap<>();
+        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
+        if (multipartResovler.isMultipart(request)) {
+            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+            Iterator<String> it = multipartRequest.getFileNames();
+            while (it.hasNext()) {
+                MultipartFile file = multipartRequest.getFile((String) it.next());// file
+                // multipartRequest.getFile((String)
+                // it.next());
+                if (file != null) {
+                    // 1銆佷笂浼犲埌鏈嶅姟鍣ㄤ复鏃舵枃浠跺す
+                    String uploadFileName = file.getOriginalFilename();
+                    String originname = uploadFileName;
+                    if (originname.lastIndexOf("/") >= 0) {
+                        originname = originname.substring(originname.lastIndexOf("/") + 1);
+                    }
+                    String nfix = "";// 鍚庣紑鍚�
+                    if (StringUtils.isNotBlank(uploadFileName)) {
+                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".exe\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".dll\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    if (StringUtils.equalsIgnoreCase(nfix, ".so")) {
+                        context.put("code", 4000);
+                        context.put("message", "瀵逛笉璧凤紝鏂囦欢鏍煎紡\".so\"涓婁紶鏈夎锛�");
+                        return;
+                    }
+                    String nowDate = DateUtil.getNowShortDate();// 褰撳墠鏃堕棿锛堝勾鏈堟棩锛�
+                    String fileName = UUID.randomUUID().toString() + nfix;
+                    String tempFileName = nowDate + "/" + fileName;
+                    String key = folder + tempFileName;// 鏂囦欢鍚�
+                    TyyZosUtil obs = new TyyZosUtil(endpoint,access_id, access_key);
+                    if (obs.uploadInputstreamObject(file.getInputStream(),bucketName, key)) {
+                        // 绉诲姩鎴愬姛,杩斿洖鏂囦欢鍚�
+                        // sendSuccessMessage(response, resourcePath+key);
+                        context.put("success", true);
+                        context.put("code", 200);
+                        context.put("errno",0);
+                        JSONObject fileJSON = new JSONObject();
+                        fileJSON.put("url", resourcePath + key);
+                        fileJSON.put("imgaddr", tempFileName);
+                        fileJSON.put("imgname", fileName);
+                        fileJSON.put("originname", originname);
+                        context.put("data",fileJSON);
+                        context.put("message","璇锋眰鎴愬姛");
+                        writerJson(response, context);
+                        return;
+                    } else {
+                        // 绉诲姩澶辫触
+                        context.put("code", 0);
+                        context.put("message", "涓婁紶澶辫触");
+                        writerJson(response, context);
+                        return;
+                    }
+                }
+
+            }
+        }
+        context.put("code", 0);
+        context.put("message", "涓婁紶澶辫触");
+        context.put("errno",0);
+        writerJson(response, context);
+        return;
+    }
+
+    public static void writerJson(HttpServletResponse response, Object object) {
+        response.setContentType("application/json");
+        writer(response, JSONObject.toJSONString(object));
+    }
+
+    private static void writer(HttpServletResponse response, String str) {
+        try {
+            StringBuffer result = new StringBuffer();
+            //璁剧疆椤甸潰涓嶇紦瀛�
+            response.setHeader("Pragma", "No-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            response.setCharacterEncoding("UTF-8");
+            PrintWriter out = null;
+            out = response.getWriter();
+            out.print(str);
+            out.flush();
+            out.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+}
diff --git a/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java b/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
index 2c25530..78ace21 100644
--- a/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
+++ b/server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -34,7 +34,6 @@
      */
     void sort(UpdateSortDTO dto);
 
-    String updateQywxToken();
 
     void updateByIdNew(SystemDictData systemDictData);
     SystemDictData queryByCode(String dicCode, String label);
diff --git a/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java b/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
index a3541d3..8c3ed57 100644
--- a/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
+++ b/server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -5,7 +5,6 @@
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.model.LoginUserInfo;
-import com.doumee.core.utils.qiyeweixin.QywxUtil;
 import com.doumee.dao.common.dto.UpdateSortDTO;
 import com.doumee.dao.system.model.SystemDict;
 import com.doumee.dao.system.model.SystemDictData;
@@ -50,27 +49,6 @@
     @Override
     public void updateById(SystemDictData systemDictData) {
         systemDictDataService.updateById(systemDictData);
-    }
-
-    @Override
-    public     String updateQywxToken(){
-        String corpid = queryByCode(Constants.QYWX,Constants.QYWX_CORPID).getCode();
-        String secret = queryByCode(Constants.QYWX,Constants.QYWX_SECRET).getCode();
-        String token = QywxUtil.getAccessToken(corpid,secret);
-       SystemDictData dictData = queryByCode(Constants.QYWX,Constants.QYWX_TOKEN);
-        if (dictData != null  ) {
-            dictData.setCode(token);
-            dictData.setUpdateTime(new Date());
-            systemDictDataService.updateById(dictData);
-            String ticket = QywxUtil.getJsApiTicket(token);
-            SystemDictData ticketDictData = queryByCode(Constants.QYWX,Constants.QYWX_JS_API_TICKET);
-            if (dictData != null  ) {
-                ticketDictData.setCode(ticket);
-                ticketDictData.setUpdateTime(new Date());
-                systemDictDataService.updateById(ticketDictData);
-            }
-        }
-        return  token;
     }
 
     @Override
diff --git a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
index c065f29..9c0b262 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.core.constants.Constants;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.vo.WebLoginUserVO;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import lombok.extern.slf4j.Slf4j;
@@ -34,23 +35,21 @@
     /**
      * 鐢熸垚token浠ょ墝
      *
-     * @param member 浠ょ墝涓惡甯︾殑闄勫姞淇℃伅
+     * @param webLoginUser 浠ょ墝涓惡甯︾殑闄勫姞淇℃伅
      * @return 浠oken鐗�
      */
-    public String generateToken(Member member) {
-        if(member == null){
+    public String generateToken(WebLoginUserVO webLoginUser) {
+        if(webLoginUser == null){
             return  null;
         }
-        Map<String,Object> map = new HashMap<>();
-        map.put("id",member.getId());
-        return generateTokenDo(member);
+        return generateTokenDo(webLoginUser);
     }
 
 
-    public Member getUserInfoByToken(String token) {
+    public WebLoginUserVO getUserInfoByToken(String token) {
         try {
-            Member member = getClaimsFromToken(token);
-            return member;
+            WebLoginUserVO userVO = getClaimsFromToken(token);
+            return userVO;
         } catch (Exception e) {
            e.printStackTrace();
         }
@@ -97,17 +96,15 @@
      *
      * @return 浠ょ墝
      */
-    private String generateTokenDo(Member member) {
+    private String generateTokenDo(WebLoginUserVO webLoginUser) {
         Map<String, Object> claims = new HashMap<>();
-        claims.put("id",member.getId());
+        claims.put("id",webLoginUser.getId());
         Date expirationDate = new Date(System.currentTimeMillis() + jwtProperties.getExpiration());
         String token = Jwts.builder().setClaims(claims)
                 .setExpiration(expirationDate)
                 .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
                 .compact();
-        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member)
-//                , jwtProperties.getExpiration(), TimeUnit.MILLISECONDS
-        );
+        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(webLoginUser));
         return token;
     }
 
@@ -118,11 +115,11 @@
      * @param token 浠ょ墝
      * @return 鏁版嵁澹版槑
      */
-    private Member getClaimsFromToken(String token) {
-        Member claims;
+    private WebLoginUserVO getClaimsFromToken(String token) {
+        WebLoginUserVO claims;
         try {
             String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
-            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),Member.class);
+            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),WebLoginUserVO.class);
         } catch (Exception e) {
             claims = null;
         }
diff --git a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
index a52062a..0d90178 100644
--- a/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
+++ b/server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
@@ -1,11 +1,10 @@
 package com.doumee.config.jwt;
 
 import com.alibaba.fastjson.JSONObject;
-import com.doumee.core.annotation.LoginRequired;
-import com.doumee.core.constants.Constants;
+import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
-import com.doumee.dao.business.model.Member;
+import com.doumee.dao.vo.WebLoginUserVO;
 import io.jsonwebtoken.JwtException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -79,23 +78,14 @@
     public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
         String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
         try {
-            Member member  = jwtTokenUtil.getUserInfoByToken(token);
-            if(Objects.isNull(member)){
+            WebLoginUserVO webLoginUserVO = jwtTokenUtil.getUserInfoByToken(token);
+            if(Objects.isNull(webLoginUserVO)){
                 throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"闀挎椂闂存湭鎿嶄綔,璇烽噸鏂扮櫥褰�");
             }
-            Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1)  from member where id  = ?", Integer.class, member.getId());
-            if(isDeleted.equals(Constants.ONE)){
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸插垹闄�,璇疯仈绯荤鐞嗗憳");
-            }
-            Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, member.getId());
-            if (count != null && count > 0) {
 //                jwtTokenUtil.refreshToken(token,member);
-                request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member));
-                request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId());
-                return true;
-            }else{
-                throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鐢ㄦ埛淇℃伅鍑洪敊");
-            }
+            request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(webLoginUserVO));
+            request.setAttribute(JwtTokenUtil.MEMBER_ID, webLoginUserVO.getId());
+            return true;
         } catch (IllegalArgumentException | JwtException e) {
             throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"鏈櫥褰�");
         }
diff --git a/server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java b/server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java
deleted file mode 100644
index e406b69..0000000
--- a/server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.doumee.core.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD,ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface LoginRequired {
-
-}
diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
index f8f067c..a1d7252 100644
--- a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -4,6 +4,7 @@
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFPictureData;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,7 +43,7 @@
      * 鏍囬琛屽彿
      */
     private CellType changeType;
-
+    private Map<String, XSSFPictureData> pictureList;
     /**
      * 鏋勯�犲嚱鏁�
      * @param--path 瀵煎叆鏂囦欢锛岃鍙栫涓�涓伐浣滆〃
@@ -161,6 +162,7 @@
         this.sheet = this.wb.getSheetAt(sheetIndex);
         this.headerNum = headerNum;
         this.changeType = cellType;
+        this.pictureList = ExcelPictureUtil.getExcelPictures(in);
         log.debug("Initialize success.");
     }
 
@@ -228,6 +230,9 @@
         }
         return val;
     }
+    public Map<String,XSSFPictureData> getExcelPictures(){
+        return this.pictureList;
+    }
 
     /**
      * 鑾峰彇瀵煎叆鏁版嵁鍒楄〃
diff --git a/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
new file mode 100644
index 0000000..de3c552
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
@@ -0,0 +1,309 @@
+package com.doumee.core.annotation.excel;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.XML;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.map.HashedMap;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.openxml4j.opc.PackagePartName;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.WorkbookFactory;
+import org.apache.poi.xssf.usermodel.*;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+
+/**
+ * @author bianhl
+ * @version 1.0
+ * @description 鑾峰彇鍥剧墖璧勬簮
+ * @date 2024骞�4鏈�28鏃�08:44:42
+ */
+@Slf4j
+public class ExcelPictureUtil {
+
+    public static Map<String, XSSFPictureData> getExcelPictures(InputStream is) {
+        try {
+            byte[] fileData =  getFileStream(is);
+            Map<String, XSSFPictureData> pictures = getPictures(fileData);
+            pictures.forEach((id, xssfPictureData) -> {
+                System.out.println("id锛�" + id);
+                String fileName = xssfPictureData.getPackagePart().getPartName().getName();
+                System.out.println("fileName锛�" + fileName);
+            });
+            return pictures;
+        }catch (Exception e){
+            return  null;
+        }
+
+    }
+
+    /**
+     * 鑾峰彇娴姩鍥剧墖锛屼互 map 褰㈠紡杩斿洖锛岄敭涓鸿鍒楁牸寮� x-y銆�
+     *
+     * @param xssfSheet WPS 宸ヤ綔琛�
+     * @return 娴姩鍥剧墖鐨� map
+     */
+    public static Map<String, XSSFPictureData> getFloatingPictures(XSSFSheet xssfSheet) {
+        Map<String, XSSFPictureData> mapFloatingPictures = new HashMap<>();
+        XSSFDrawing drawingPatriarch = xssfSheet.getDrawingPatriarch();
+        if (drawingPatriarch != null) {
+            List<XSSFShape> shapes = drawingPatriarch.getShapes();
+            for (XSSFShape shape : shapes) {
+                if (shape instanceof XSSFPicture ) {
+                    XSSFPicture picture = (XSSFPicture)shape;
+                    XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
+                    XSSFPictureData pictureData = picture.getPictureData();
+                    String key = anchor.getRow1() + "-" + anchor.getCol1();
+                    mapFloatingPictures.put(key, pictureData);
+                }
+            }
+        }
+        return mapFloatingPictures;
+    }
+
+    /**
+     * 澶勭悊 WPS 鏂囦欢涓殑鍥剧墖鏁版嵁锛岃繑鍥炲浘鐗囦俊鎭� map銆�
+     *
+     * @param stream    杈撳叆娴�
+     * @param mapConfig 閰嶇疆鏄犲皠
+     * @return 鍥剧墖淇℃伅鐨� map
+     * @throws IOException
+     */
+    private static Map<String, XSSFPictureData> processPictures(ByteArrayInputStream stream, Map<String, String> mapConfig) throws IOException {
+        Map<String, XSSFPictureData> mapPictures = new HashedMap<>();
+        Workbook workbook = WorkbookFactory.create(stream);
+        List<XSSFPictureData> allPictures = (List<XSSFPictureData>) workbook.getAllPictures();
+        for (XSSFPictureData pictureData : allPictures) {
+            PackagePartName partName = pictureData.getPackagePart().getPartName();
+            String uri = partName.getURI().toString();
+            if (mapConfig.containsKey(uri)) {
+                String strId = mapConfig.get(uri);
+                mapPictures.put(strId, pictureData);
+            }
+        }
+        return mapPictures;
+    }
+
+    /**
+     * 鑾峰彇 WPS 鏂囨。涓殑鍥剧墖锛屽寘鎷祵鍏ュ紡鍥剧墖鍜屾诞鍔ㄥ紡鍥剧墖銆�
+     *
+     * @param data 浜岃繘鍒舵暟鎹�
+     * @return 鍥剧墖淇℃伅鐨� map
+     * @throws IOException
+     */
+    public static Map<String, XSSFPictureData> getPictures(byte[] data) {
+        try {
+            Map<String, String> mapConfig = processZipEntries(new ByteArrayInputStream(data));
+            Map<String, XSSFPictureData> mapPictures = processPictures(new ByteArrayInputStream(data), mapConfig);
+            Iterator<Sheet> sheetIterator = WorkbookFactory.create(new ByteArrayInputStream(data)).sheetIterator();
+            while (sheetIterator.hasNext()) {
+                mapPictures.putAll(getFloatingPictures((XSSFSheet) sheetIterator.next()));
+            }
+            return mapPictures;
+        } catch (IOException e) {
+            return new HashedMap<>();
+        }
+    }
+
+    /**
+     * 澶勭悊 Zip 鏂囦欢涓殑鏉$洰锛屾洿鏂板浘鐗囬厤缃俊鎭��
+     *
+     * @param stream Zip 杈撳叆娴�
+     * @return 閰嶇疆淇℃伅鐨� map
+     * @throws IOException
+     */
+    private static Map<String, String> processZipEntries(ByteArrayInputStream stream) throws IOException {
+        Map<String, String> mapConfig = new HashedMap<>();
+        ZipInputStream zipInputStream = new ZipInputStream(stream);
+        ZipEntry zipEntry;
+        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
+            try {
+                final String fileName = zipEntry.getName();
+                if ("xl/cellimages.xml".equals(fileName)) {
+                    processCellImages(zipInputStream, mapConfig);
+                } else if ("xl/_rels/cellimages.xml.rels".equals(fileName)) {
+                    return processCellImagesRels(zipInputStream, mapConfig);
+                }
+            } finally {
+                zipInputStream.closeEntry();
+            }
+        }
+        return new HashedMap<>();
+    }
+
+    /**
+     * 澶勭悊 Zip 鏂囦欢涓殑 cellimages.xml 鏂囦欢锛屾洿鏂板浘鐗囬厤缃俊鎭��
+     *
+     * @param zipInputStream Zip 杈撳叆娴�
+     * @param mapConfig      閰嶇疆淇℃伅鐨� map
+     * @throws IOException
+     */
+    private static void processCellImages(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
+        String content = IOUtils.toString(zipInputStream);
+        JSONObject jsonObject = XML.toJSONObject(content);
+        if (jsonObject != null) {
+            JSONObject cellImages = jsonObject.getJSONObject("etc:cellImages");
+            if (cellImages != null) {
+                JSONArray cellImageArray = null;
+                Object cellImage = cellImages.get("etc:cellImage");
+                if (cellImage != null && cellImage instanceof JSONArray) {
+                    cellImageArray = (JSONArray) cellImage;
+                } else if (cellImage != null && cellImage instanceof JSONObject) {
+                    JSONObject cellImageObj = (JSONObject) cellImage;
+                    if (cellImageObj != null) {
+                        cellImageArray = new JSONArray();
+                        cellImageArray.add(cellImageObj);
+                    }
+                }
+                if (cellImageArray != null) {
+                    processImageItems(cellImageArray, mapConfig);
+                }
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊 cellImageArray 涓殑鍥剧墖椤癸紝鏇存柊鍥剧墖閰嶇疆淇℃伅銆�
+     *
+     * @param cellImageArray 鍥剧墖椤圭殑 JSONArray
+     * @param mapConfig      閰嶇疆淇℃伅鐨� map
+     */
+    private static  void processImageItems(JSONArray cellImageArray, Map<String, String> mapConfig) {
+        for (int i = 0; i < cellImageArray.size(); i++) {
+            JSONObject imageItem = cellImageArray.getJSONObject(i);
+            if (imageItem != null) {
+                JSONObject pic = imageItem.getJSONObject("xdr:pic");
+                if (pic != null) {
+                    processPic(pic, mapConfig);
+                }
+            }
+        }
+    }
+
+    /**
+     * 澶勭悊 pic 涓殑鍥剧墖淇℃伅锛屾洿鏂板浘鐗囬厤缃俊鎭��
+     *
+     * @param pic       鍥剧墖鐨� JSONObject
+     * @param mapConfig 閰嶇疆淇℃伅鐨� map
+     */
+    private static  void processPic(JSONObject pic, Map<String, String> mapConfig) {
+        JSONObject nvPicPr = pic.getJSONObject("xdr:nvPicPr");
+        if (nvPicPr != null) {
+            JSONObject cNvPr = nvPicPr.getJSONObject("xdr:cNvPr");
+            if (cNvPr != null) {
+                String name = cNvPr.getStr("name");
+                if (StringUtils.isNotEmpty(name)) {
+                    String strImageEmbed = updateImageEmbed(pic);
+                    if (strImageEmbed != null) {
+                        mapConfig.put(strImageEmbed, name);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇宓屽叆寮忓浘鐗囩殑 embed 淇℃伅銆�
+     *
+     * @param pic 鍥剧墖鐨� JSONObject
+     * @return embed 淇℃伅
+     */
+    private  static String updateImageEmbed(JSONObject pic) {
+        JSONObject blipFill = pic.getJSONObject("xdr:blipFill");
+        if (blipFill != null) {
+            JSONObject blip = blipFill.getJSONObject("a:blip");
+            if (blip != null) {
+                return blip.getStr("r:embed");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 澶勭悊 Zip 鏂囦欢涓殑 relationship 鏉$洰锛屾洿鏂伴厤缃俊鎭��
+     *
+     * @param zipInputStream Zip 杈撳叆娴�
+     * @param mapConfig      閰嶇疆淇℃伅鐨� map
+     * @return 閰嶇疆淇℃伅鐨� map
+     * @throws IOException
+     */
+    private static Map<String, String> processCellImagesRels(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
+        String content = IOUtils.toString(zipInputStream );
+        JSONObject jsonObject = XML.toJSONObject(content);
+        JSONObject relationships = jsonObject.getJSONObject("Relationships");
+        if (relationships != null) {
+            JSONArray relationshipArray = null;
+            Object relationship = relationships.get("Relationship");
+
+            if (relationship != null && relationship instanceof JSONArray) {
+                relationshipArray = (JSONArray) relationship;
+            } else if (relationship != null && relationship instanceof JSONObject  ) {
+                JSONObject relationshipObj = (JSONObject) relationship;
+                if (relationshipObj != null) {
+                    relationshipArray = new JSONArray();
+                    relationshipArray.add(relationshipObj);
+                }
+            }
+            if (relationshipArray != null) {
+                return processRelationships(relationshipArray, mapConfig);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 澶勭悊 relationshipArray 涓殑鍏崇郴椤癸紝鏇存柊閰嶇疆淇℃伅銆�
+     *
+     * @param relationshipArray 鍏崇郴椤圭殑 JSONArray
+     * @param mapConfig         閰嶇疆淇℃伅鐨� map
+     * @return 閰嶇疆淇℃伅鐨� map
+     */
+    private static Map<String, String> processRelationships(JSONArray relationshipArray, Map<String, String> mapConfig) {
+        Map<String, String> mapRelationships = new HashedMap<>();
+        for (int i = 0; i < relationshipArray.size(); i++) {
+            JSONObject relaItem = relationshipArray.getJSONObject(i);
+            if (relaItem != null) {
+                String id = relaItem.getStr("Id");
+                String value = "/xl/" + relaItem.getStr("Target");
+                if (mapConfig.containsKey(id)) {
+                    String strImageId = mapConfig.get(id);
+                    mapRelationships.put(value, strImageId);
+                }
+            }
+        }
+        return mapRelationships;
+    }
+
+    /**
+     * @return {@link byte[]}
+     * @description
+     * @author bianhl
+     * @date 2024/4/26 13:52
+     */
+    private static byte[] getFileStream(InputStream inputStream) {
+            // 鍒涘缓 ByteArrayOutputStream 鏉ユ殏瀛樻祦鏁版嵁
+        try {
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            byte[] buffer = new byte[1024];
+            int length;
+            while ((length = inputStream.read(buffer)) != -1) {
+                byteArrayOutputStream.write(buffer, 0, length);
+            }
+            // 灏� byteArrayOutputStream 鐨勫唴瀹硅幏鍙栦负瀛楄妭鏁扮粍
+            return byteArrayOutputStream.toByteArray();
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/server/services/src/main/java/com/doumee/core/constants/Constants.java b/server/services/src/main/java/com/doumee/core/constants/Constants.java
index 91cd7ad..5fe8c94 100644
--- a/server/services/src/main/java/com/doumee/core/constants/Constants.java
+++ b/server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -19,6 +19,8 @@
     public static final String HWY_OBS_ENDPOINT ="HWY_OBS_ENDPOINT" ;
     public static final String HWY_OBS_BUCKET ="HWY_OBS_BUCKET" ;
     public static final String RESOURCE_PATH ="RESOURCE_PATH" ;
+    public static final String ROLE_CONFIG ="ROLE_CONFIG" ;
+
     public static final String QYWX_CORPID = "QYWX_CORPID";
     public static final String QYWX_SECRET = "QYWX_SECRET";
     public static final String QYWX_TOKEN = "QYWX_TOKEN";
@@ -58,6 +60,14 @@
     public static final String AUTO_CONFIRM ="AUTO_CONFIRM" ;
     public static final String AUTO_CANCEL_WAIT_PAY ="AUTO_CANCEL_WAIT_PAY" ;
 
+
+    public static final String ACCESS_ID="ACCESS_ID";
+    public static final String BUCKETNAME = "BUCKETNAME";
+    public static final String ACCESS_KEY = "ACCESS_KEY";
+    public static final String ENDPOINT = "ENDPOINT";
+
+
+    public static final String UTF = "UTF-8";
     public static final String QYWX = "QYWX";
     public static final  Integer ONE = 1;
     public static final Integer TWO = 2;
@@ -70,6 +80,11 @@
     public static final String MEMBER_FILES = "MEMBER_FILES";
     public static final String CATEGORY_FILES = "CATEGORY_FILES";
     public static final String ORDERS_FILES = "ORDERS_FILES";
+    public static final String ZBOM_PARAM ="ZBOM_PARAM" ;
+    public static final String ZBOM_UK_ERROR_URL ="ZBOM_UK_ERROR_URL" ;
+    public static final String ZBOM_TICKET_LOGIN_URL ="ZBOM_TICKET_LOGIN_URL" ;
+    public static final String OBJCET_STORAGE = "OBJCET_STORAGE";
+    public static final Object OBJECT_TYPE_CASES = "OBJECT_TYPE_CASES";
     public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
     public static  boolean DEALING_COMPANY_SYNC = false ;
     public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -77,10 +92,16 @@
     public static final String WORKORDER_LOG_FILE_PATH ="WORKORDER_LOG_FILE_PATH" ;
 
     public static final String REDIS_TOKEN_KEY = "token_";
+    public static final String CASES_FILES = "CASES_FILES";
 
     public static final String SUCCESS = "SUCCESS";
     public static final String FAIL = "FAIL";
     public static final String CANCELLED = "CANCELLED";
+
+    public interface  ZbomConst{
+       String TICKET_LOGIN = "https://sso.zbom.com/esc-idm/api/v1/getUserInfo";
+       String  TICKET_LOGIN_TEST = "http://testsso.zhibang.com:8080/esc-idm/api/v1/getUserInfo";
+    }
 
 
     public interface   uploadType{
@@ -94,7 +115,8 @@
     interface CacheKey {
     }
     public interface RedisKeys {
-        public static final String ORDER_CODE = "ORDER_CODE";
+       String IMPORTING_RECORD = "IMPORTING_RECORD";
+       String ORDER_CODE = "ORDER_CODE";
     }
     /**
      * 鎿嶄綔绫诲瀷锛岀敤浜庡仛鎺ュ彛楠岃瘉鍒嗙粍
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
deleted file mode 100644
index b2bad0f..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.doumee.core.utils.qiyeweixin;
-
-public class QywxConstant {
-	public final static String MSGCORPSECRET = "WXvaZzwN9A3F-oGTHKY03Rxbl1niz1P_3odjwBdRs8g";//浼佷笟寰俊 娑堟伅鎺ㄩ�丼ECRET
-	public final static String SCHEDULESECRET = "kDucV45wtQaWjRRZoIlvxbBrLp3khHFouJhsDywBe0I";//浼佷笟寰俊 鏃ョ▼SECRET
-	public final static String DOUMIGUANJIA = "1000002";//浼佷笟寰俊 SECRET
-	public final static String PARENTID = "1";//椤剁骇閮ㄩ棬缂栫爜
-	public final static String PASSWORD = "123456";//榛樿瀵嗙爜
-	public final static String CORPID = "wweea8f71b54e3b835";
-	public final static String DMSECRET = "mfmGJpvqj1WNPTwo0Cue42uibhUd5W6_iSWpF39XZQ0";//瀹㈢瀹跺簲鐢� SECRET
-	public final static String CORPSECRET = "8gl5ndGr824OHZ90CkZdcIewUKHoyk13XN4hfxBS_io";
-	public final static String ACCESS_TOKEN = "aOpknXCW7KBBwgGAPuacwfhJRcT1PeIg-IroZicxWamj0JayKJ0rKw2sNXGzpQzK8AMDeDrEJC_kTvPPWTgtefDNLtfsdHS7IpXqBV1P8znLG1EmsYPNgvn78dsQd5bBomLl_qPpOob9hUUsSJJKcEmxXldCNEYVBhKmYnQ4yY8WE8i4xp7aLmm-hRql0AzhzaNhUA7nAzNN5BsgSgbXMA";
-	//鑾峰彇accesstoken,corpid=浼佷笟ID,corpsecret=搴旂敤鐨勫嚟璇佸瘑閽�
-    public final static String[] GET_ACCESS_TOKEN = new String[]{"/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${secret}","鑾峰彇浼佷笟寰俊accesstoken"};
-	//鑾峰彇閮ㄩ棬淇℃伅,閮ㄩ棬id銆傝幏鍙栨寚瀹氶儴闂ㄥ強鍏朵笅鐨勫瓙閮ㄩ棬锛堜互鍙婂強瀛愰儴闂ㄧ殑瀛愰儴闂ㄧ瓑绛夛紝閫掑綊锛夈�� 濡傛灉涓嶅~锛岄粯璁よ幏鍙栧叏閲忕粍缁囨灦鏋�
-    public final static String[]  GET_DEPARTMENT_LIST = new String[]{"/cgi-bin/department/list?access_token=${accesstoken}&id=${id}","鑾峰彇閮ㄩ棬淇℃伅"};
-    public final static String[]  GET_DEPARTMENT_SIMPLELIST = new String[]{"/cgi-bin/department/simplelist?access_token=${accesstoken}&id=${id}","鑾峰彇閮ㄩ棬淇℃伅"};
-    public final static String[]  GET_DEPARTMENT_INFO = new String[]{"/cgi-bin/department/get?access_token=${accesstoken}&id=${id}","鑾峰彇鍗曚釜閮ㄩ棬璇︽儏"};
-	//鑾峰彇閮ㄩ棬鎴愬憳,access_token=璋冪敤鎺ュ彛鍑瘉,department_id=鑾峰彇鐨勯儴闂╥d,fetch_child=	鏄惁閫掑綊鑾峰彇瀛愰儴闂ㄤ笅闈㈢殑鎴愬憳锛�1-閫掑綊鑾峰彇锛�0-鍙幏鍙栨湰閮ㄩ棬
-    public final static String[]  GET_DEPARTMENT_SIMPLE_LIST = new String[]{"/cgi-bin/user/simplelist?access_token=${accesstoken}&department_id=${departmentId}","鑾峰彇閮ㄩ棬鎴愬憳"};
-    public final static String[]  GET_DEPARTMENT_USER_LIST = new String[]{"/cgi-bin/user/list?access_token=${accesstoken}&department_id=${departmentId}","鑾峰彇閮ㄩ棬鎴愬憳"};
-    public final static String[]  GET_MEDIA = new String[]{"/cgi-bin/media/get?access_token=${accesstoken}&media_id=${media_id}","鑾峰彇涓存椂绱犳潗"};
-    public final static String[]  UPLOAD_TEMP_MEDIA = new String[]{"/cgi-bin/media/upload?access_token=${accesstoken}&type=${type}","涓婁紶涓存椂绱犳潗"};
-	//鑾峰彇鎴愬憳璇︽儏,access_token=璋冪敤鎺ュ彛鍑瘉,userid=鎴愬憳UserID
-    public final static String[]  GET_USER_DETAIL =new String[]{ "/cgi-bin/user/get?access_token=${accesstoken}&userid=${id}","鑾峰彇鎴愬憳璇︽儏"};
-	//鍙戦�佸簲鐢ㄦ秷鎭�,access_token=璋冪敤鎺ュ彛鍑瘉  POST璇锋眰锛�
-	public final static String[]  SEND_MSG =new String[]{ "/cgi-bin/message/send?access_token=${accesstoken}","鍙戦�佹帹閫佹秷鎭�"};
-	public final static String[]  GET_USER_BY_AUTH_CODE =new String[]{ "/cgi-bin/auth/getuserinfo?access_token=${accesstoken}&code=${code}","鑾峰彇鐢ㄦ埛鐧诲綍韬唤"};
-	public final static String[]  GET_JSAPI_TICKET =new String[]{ "/cgi-bin/get_jsapi_ticket?access_token=${accesstoken}","鑾峰彇浼佷笟 jsapi_ticket"};
-
-
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
deleted file mode 100644
index a501b01..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package com.doumee.core.utils.qiyeweixin;
-
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
-import com.doumee.biz.system.SystemDictDataBiz;
-import com.doumee.core.utils.HttpsUtil;
-import com.doumee.core.utils.qiyeweixin.model.request.QywxSendMsgRequest;
-import com.doumee.core.utils.qiyeweixin.model.response.*;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-
-@Component
-@Slf4j
-public class QywxUtil {
-    private static JSONObject json = new JSONObject();
-
-
-
-    private static QywxUtil qyUtil;
-
-    @Value("${qiwei.serviceurl}")
-    private    String qiweiUrl;
-
-    @PostConstruct
-    private void init() {
-        qyUtil = this;
-//        QywxUtil.qiweiUrl =  serviceurl;
-    }
-
-
-    public static String create(Map<String, Object> map, String url, String token) throws IOException {
-        //  String token = getToken(QY_Constant.CORPID, QY_Constant.SCHEDULESECRET);
-        String postData = createPostData(map);
-        String response = HttpsUtil.post(url + token, postData,  "application/json", false);
-        System.out.println("鑾峰彇鍒扮殑token======>" + token);
-        System.out.println("璇锋眰鏁版嵁======>" + postData);
-        System.out.println("鍙戦�佸井淇$殑鍝嶅簲鏁版嵁======>" + response);
-        return response;
-    }
-
-    private static String createPostData(Map<String, Object> map) {
-        System.out.println("杩涘叆createPostData鏂规硶-------------------------");
-        return JSONObject.toJSONString(map);
-    }
-
-
-    public static String getAccessToken(String corpId, String corpSecret)  {
-        String[] interfaceUrl = QywxConstant.GET_ACCESS_TOKEN;
-        String url = interfaceUrl[0].replace("${corpid}",corpId).replace("${secret}",corpSecret);
-        QywxBaseResponse response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<String>>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response.getAccess_token();
-        }
-        return null;
-    }
-    public static List<QywxDepartInfoResponse> getDepartmentAll(String token)   {
-        String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_LIST;
-        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}","");
-        QywxBaseResponse<List<QywxDepartInfoResponse>> response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<List<QywxDepartInfoResponse>>>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response.getData();
-        }
-        return null;
-    }
-    public static QywxDepartInfoResponse getDepartmentInfo(String token,String departid)  {
-        String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_INFO;
-        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}",departid);
-        QywxBaseResponse<QywxDepartInfoResponse> response = sendHttpRequest(url,interfaceUrl[1],""
-                ,new TypeReference< QywxBaseResponse<QywxDepartInfoResponse>>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response.getData();
-        }
-        return null;
-    }
-    public static QywxSendMsgResponse sendMsg(String token, QywxSendMsgRequest param)  {
-        try{
-            String[] interfaceUrl = QywxConstant.SEND_MSG;
-            String url = interfaceUrl[0].replace("${accesstoken}",token);
-            QywxSendMsgResponse response = sendHttpRequestSingle(url,interfaceUrl[1],JSONObject.toJSONString(param)
-                    ,new TypeReference<QywxSendMsgResponse>(){});
-            log.error("鎺ㄩ�佹秷鎭粨鏋渰}",JSONObject.toJSONString(response));
-            if(response.getErrcode()!=null && response.getErrcode() ==0){
-                return response;
-            }
-        }catch (Exception e){
-
-        }
-
-        return null;
-    }
-    public static List<QywxUserListResponse> getUserList(String token,String depatId)   {
-        try {
-            String[] interfaceUrl = QywxConstant.GET_DEPARTMENT_USER_LIST;
-            String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${departmentId}",depatId);
-            QywxBaseResponse<List<QywxUserListResponse>> response = sendHttpRequest(url,interfaceUrl[1],"",new TypeReference<QywxBaseResponse<List<QywxUserListResponse>>>(){});
-            if(response.getErrcode()!=null && response.getErrcode() ==0){
-                return response.getData();
-            }
-        }catch (Exception e){
-            e.printStackTrace();
-        }
-
-        return null;
-    }
-    public static InputStream getMediaInputstream(String token, String media)   {
-        try {
-            String[] interfaceUrl = QywxConstant.GET_MEDIA;
-            String url = qyUtil.qiweiUrl+interfaceUrl[0].replace("${accesstoken}",token).replace("${media_id}",media);
-            log.info("浼佷笟寰俊涓存椂绱犳潗鑾峰彇url=========="+url);
-            return  HttpsUtil.connectionInputsteam(url,"GET",null,null);
-        }catch (Exception e){
-            e.printStackTrace();
-            log.error("浼佷笟寰俊涓存椂绱犳潗鑾峰彇error=========="+e.getMessage());
-        }
-
-        return null;
-    }
-    public static QywxUserInfoResponse getUserInfo(String token,String id)  {
-        String[] interfaceUrl = QywxConstant.GET_USER_DETAIL;
-        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${id}",id);
-        QywxUserInfoResponse response = sendHttpRequestSingle(url,interfaceUrl[1],""
-                ,new TypeReference<QywxUserInfoResponse>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response;
-        }
-        return null;
-    }
-
-    /**
-     *
-     * @param token
-     * @param type 	濯掍綋鏂囦欢绫诲瀷锛屽垎鍒湁鍥剧墖锛坕mage锛夈�佽闊筹紙voice锛夈�佽棰戯紙video锛夛紝鏅�氭枃浠讹紙file锛�
-     * @return
-     */
-    public static QywxUploadMediaResponse uploadMedia(String token,String type,String imgurl)  {
-        String[] interfaceUrl = QywxConstant.UPLOAD_TEMP_MEDIA;
-        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${type}",type);
-        QywxUploadMediaResponse response = sendHttpRequestMultifile(url,interfaceUrl[1],imgurl
-                ,new TypeReference<QywxUploadMediaResponse>(){});
-        if(response !=null && response.getErrcode()!=null && response.getErrcode() ==0){
-            return response;
-        }
-        return null;
-    }
-    public static QywxBaseResponse<String> getUserInfoByCode(String token,String code)  {
-        String[] interfaceUrl = QywxConstant.GET_USER_BY_AUTH_CODE;
-        String url = interfaceUrl[0].replace("${accesstoken}",token).replace("${code}",code);
-        QywxBaseResponse<String> response = sendHttpRequest(url,interfaceUrl[1],""
-                ,new TypeReference<QywxBaseResponse<String>>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response;
-        }
-        return null;
-    }
-
-
-    public static String getJsApiTicket(String token)  {
-        String[] interfaceUrl = QywxConstant.GET_JSAPI_TICKET;
-        String url = interfaceUrl[0].replace("${accesstoken}",token);
-        QywxBaseResponse<String> response = sendHttpRequest(url,interfaceUrl[1],""
-                ,new TypeReference<QywxBaseResponse<String>>(){});
-        if(response.getErrcode()!=null && response.getErrcode() ==0){
-            return response.getTicket();
-        }
-        return null;
-    }
-
-
-    /**
-     * 鍙戣捣wms鎺ュ彛璇锋眰
-     * @param url
-     * @param name
-     * @param param
-     * @param typeReference
-     * @return
-     * @param <T>
-     */
-    public static   <T> QywxBaseResponse<T> sendHttpRequest(String url, String name, String param, TypeReference<QywxBaseResponse<T>> typeReference){
-        log.info("銆�"+name+"銆�================寮�濮�===="+url+"\nparam==========================:"+ JSONObject.toJSONString(param));
-        if ( StringUtils.isNotBlank(url)) {
-            String res = null;
-            try {
-                Map<String,String> headers = new HashMap<>();
-                res = HttpsUtil.postJson(qyUtil.qiweiUrl+url,param);
-                QywxBaseResponse result = JSONObject.parseObject(res, typeReference.getType());
-                logResult(result,name);
-                return  result;
-            }catch (Exception e){
-                e.printStackTrace();
-                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
-            }
-        }
-        return  null;
-    }
-    public static  <T extends QywxBaseSingleResponse>  T sendHttpRequestMultifile(String url, String name, String imgUrl  , TypeReference<T> typeReference){
-        log.info("銆�"+name+"銆�================寮�濮�===="+ imgUrl);
-        if ( StringUtils.isNotBlank(url)) {
-            String res = null;
-            try {
-                 res = HttpsUtil.uploadTempMedia (qyUtil.qiweiUrl+url,imgUrl);
-                log.info("浠庝紒寰帴鍙�:{}----涓婁紶涓存椂绱犳潗缁撴灉:{}",url,res);
-                JSONObject jsonObject = JSONObject.parseObject(res);
-                T result = JSONObject.parseObject(res, typeReference.getType());
-                return  result;
-            }catch (Exception e){
-                e.printStackTrace();
-                log.error("銆�"+name+"銆�================澶辫触===="+ imgUrl);
-            }
-        }
-        return  null;
-    }
-    public static  <T extends QywxBaseSingleResponse>  T sendHttpRequestSingle(String url, String name, String param, TypeReference<T> typeReference){
-        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
-        if ( StringUtils.isNotBlank(url)) {
-            String res = null;
-            try {
-                Map<String,String> headers = new HashMap<>();
-                res = HttpsUtil.postJson(qyUtil.qiweiUrl+url,param);
-                T result = JSONObject.parseObject(res, typeReference.getType());
-//                logResult(result,name);
-                return  result;
-            }catch (Exception e){
-                e.printStackTrace();
-                log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
-            }
-        }
-        return  null;
-    }
-    private static void logResult(QywxBaseResponse res,String name) {
-        if( res.getErrcode() !=null && res.getErrcode().equals(0)){
-            log.info("銆愪紒涓氬井淇℃帴鍙o細"+name+"銆�================鎴愬姛====\n"+ JSONObject.toJSONString(res));
-        }else{
-            log.error("銆愪紒涓氬井淇℃帴鍙o細"+name+"銆�================澶辫触====锛歕n"+  JSONObject.toJSONString(res));
-        }
-    }
-}
-
-
-
-
-
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
deleted file mode 100644
index a689d33..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.request;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("wms璇锋眰鍏叡鍙傛暟")
-public class QywxBaseRequest<T> {
-
-    @ApiModelProperty(value = "data"  )
-    private List<T> data;
-    private List<Integer> jobIdList;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
deleted file mode 100644
index 05e9597..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.request;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鏂囦欢鍗$墖娑堟伅璇锋眰鍙傛暟")
-public class QywxSendMsgRequest {
-    @ApiModelProperty(value = "鎴愬憳ID鍒楄〃锛堟秷鎭帴鏀惰�咃紝澶氫釜鎺ユ敹鑰呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�1000涓級銆傜壒娈婃儏鍐碉細鎸囧畾涓篅all锛屽垯鍚戝叧娉ㄨ浼佷笟搴旂敤鐨勫叏閮ㄦ垚鍛樺彂閫�")
-    private String touser;//
-    @ApiModelProperty(value = "閮ㄩ棬ID鍒楄〃锛屽涓帴鏀惰�呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�100涓�傚綋touser涓篅all鏃跺拷鐣ユ湰鍙傛暟 ")
-    private String toparty;//
-    @ApiModelProperty(value = "鏍囩ID鍒楄〃锛屽涓帴鏀惰�呯敤鈥榺鈥欏垎闅旓紝鏈�澶氭敮鎸�100涓�傚綋touser涓篅all鏃跺拷鐣ユ湰鍙傛暟")
-    private String totag;//
-    @ApiModelProperty(value = "娑堟伅绫诲瀷锛屾鏃跺浐瀹氫负锛歵extcard")
-    private String msgtype;//
-    @ApiModelProperty(value = "浼佷笟搴旂敤鐨刬d锛屾暣鍨嬨�備紒涓氬唴閮ㄥ紑鍙戯紝鍙湪搴旂敤鐨勮缃〉闈㈡煡鐪嬶紱绗笁鏂规湇鍔″晢锛屽彲閫氳繃鎺ュ彛 鑾峰彇浼佷笟鎺堟潈淇℃伅 鑾峰彇璇ュ弬鏁板��")
-    private String agentid;//
-    @ApiModelProperty(value = "鏂囨湰鍗$墖娑堟伅瀵硅薄")
-    private QywxTextCardMsgRequest textcard;//
-    @ApiModelProperty(value = "琛ㄧず鏄惁寮�鍚痠d杞瘧锛�0琛ㄧず鍚︼紝1琛ㄧず鏄紝榛樿0")
-    private String enable_id_trans;//
-    @ApiModelProperty(value = "琛ㄧず鏄惁寮�鍚噸澶嶆秷鎭鏌ワ紝0琛ㄧず鍚︼紝1琛ㄧず鏄紝榛樿0")
-    private String enable_duplicate_check;//
-    @ApiModelProperty(value = "琛ㄧず鏄惁閲嶅娑堟伅妫�鏌ョ殑鏃堕棿闂撮殧锛岄粯璁�1800s锛屾渶澶т笉瓒呰繃4灏忔椂")
-    private String duplicate_check_interval;//
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
deleted file mode 100644
index 8171fd9..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.request;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鏂囦欢鍗$墖娑堟伅璇锋眰鍙傛暟")
-public class QywxTextCardMsgRequest {
-    @ApiModelProperty(value = "鏍囬锛屼笉瓒呰繃128涓瓧绗︼紝瓒呰繃浼氳嚜鍔ㄦ埅鏂紙鏀寔id杞瘧锛�")
-    private String title;//
-    @ApiModelProperty(value = "鎻忚堪锛屼笉瓒呰繃512涓瓧绗︼紝瓒呰繃浼氳嚜鍔ㄦ埅鏂紙鏀寔id杞瘧锛�")
-    private String description;//
-    @ApiModelProperty(value = "鐐瑰嚮鍚庤烦杞殑閾炬帴銆傛渶闀�2048瀛楄妭锛岃纭繚鍖呭惈浜嗗崗璁ご(http/https)")
-    private String url;//
-    @ApiModelProperty(value = "鎸夐挳鏂囧瓧銆� 榛樿涓衡�滆鎯呪�濓紝 涓嶈秴杩�4涓枃瀛楋紝瓒呰繃鑷姩鎴柇銆�")
-    private String btntxt;//
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
deleted file mode 100644
index f0e02e8..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鎺ュ彛澶勭悊杩斿洖鍙傛暟")
-public class QywxBaseResponse<T> {
-    public static final String CODE_SUCCESS = "1";
-    @ApiModelProperty(value = "杩斿洖鍙傛暟"  )
-    @JSONField(name="records",alternateNames = {"department","userlist","userid"})
-    private T data;
-    @ApiModelProperty(value = "鍑洪敊杩斿洖鐮侊紝涓�0琛ㄧず鎴愬姛锛岄潪0琛ㄧず璋冪敤澶辫触")
-    private Integer errcode;
-
-    @ApiModelProperty(value = "杩斿洖鐮佹彁绀鸿")
-    private String errmsg;
-    @ApiModelProperty(value = "鑾峰彇鍒扮殑鍑瘉锛屾渶闀夸负512瀛楄妭")
-    private String access_token;
-    @ApiModelProperty(value = "鑾峰彇鍒扮殑鍑瘉锛屾渶闀夸负512瀛楄妭")
-    private String ticket;
-
-    @ApiModelProperty(value = "鍑瘉鐨勬湁鏁堟椂闂�")
-    private Long expires_in;
-
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
deleted file mode 100644
index 1b71cd7..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鎺ュ彛澶勭悊杩斿洖鍙傛暟(鐙珛绫诲瀷锛�")
-public class QywxBaseSingleResponse {
-    @ApiModelProperty(value = "鍑洪敊杩斿洖鐮侊紝涓�0琛ㄧず鎴愬姛锛岄潪0琛ㄧず璋冪敤澶辫触")
-    private Integer errcode;
-
-    @ApiModelProperty(value = "杩斿洖鐮佹彁绀鸿")
-    private String errmsg;
-
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
deleted file mode 100644
index 345c235..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊閮ㄩ棬鍒楄〃杩斿洖鍙傛暟")
-public class QywxDepartInfoResponse {
-    @ApiModelProperty(value = "鍒涘缓鐨勯儴闂╥d")
-    private String id;
-    @ApiModelProperty(value = "閮ㄩ棬鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖name锛岃繑鍥炵殑name瀛楁浣跨敤id浠f浛锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず閮ㄩ棬鍚嶇О")
-    private String name;
-    @ApiModelProperty(value = "鑻辨枃鍚嶇О锛屾瀛楁浠�2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖璇ュ瓧娈�")
-    private String name_en;
-    @ApiModelProperty(value = "閮ㄩ棬璐熻矗浜虹殑UserID锛涚涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇")
-    private List<String> department_leader;
-    @ApiModelProperty(value = "鐖堕儴闂╥d銆傛牴閮ㄩ棬涓�1")
-    private String parentid;
-    @ApiModelProperty(value = "鍦ㄧ埗閮ㄩ棬涓殑娆″簭鍊笺�俹rder鍊煎ぇ鐨勬帓搴忛潬鍓嶃�傚�艰寖鍥存槸[0, 2^32)")
-    private String order;
-
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
deleted file mode 100644
index ac450fe..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛璇︽儏杩斿洖鍙傛暟")
-public class QywxSendMsgResponse extends QywxBaseSingleResponse {
-    @ApiModelProperty(value = "涓嶅悎娉曠殑userid锛屼笉鍖哄垎澶у皬鍐欙紝缁熶竴杞负灏忓啓")
-    private String invaliduser;
-    @ApiModelProperty(value = "涓嶅悎娉曠殑partyid")
-    private String invalidparty;
-    @ApiModelProperty(value = "涓嶅悎娉曠殑鏍囩id")
-    private String invalidtag;
-    @ApiModelProperty(value = "娌℃湁鍩虹鎺ュ彛璁稿彲")
-    private String unlicenseduser;
-    @ApiModelProperty(value = "娑堟伅id锛岀敤浜庢挙鍥炲簲鐢ㄦ秷鎭�")
-    private String msgid;
-    @ApiModelProperty(value = "浠呮秷鎭被鍨嬩负鈥滄寜閽氦浜掑瀷鈥濓紝鈥滄姇绁ㄩ�夋嫨鍨嬧�濆拰鈥滃椤归�夋嫨鍨嬧�濈殑妯℃澘鍗$墖娑堟伅杩斿洖锛屽簲鐢ㄥ彲浣跨敤response_code璋冪敤鏇存柊妯$増鍗$墖娑堟伅鎺ュ彛锛�72灏忔椂鍐呮湁鏁堬紝涓斿彧鑳戒娇鐢ㄤ竴娆�")
-    private String response_code;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java
deleted file mode 100644
index 42d01fb..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊涓婁紶绱犳潗杩斿洖鍙傛暟")
-public class QywxUploadMediaResponse extends QywxBaseSingleResponse {
-    @ApiModelProperty(value = "濯掍綋鏂囦欢绫诲瀷锛屽垎鍒湁鍥剧墖锛坕mage锛夈�佽闊筹紙voice锛夈�佽棰戯紙video锛夛紝鏅�氭枃浠�(file)")
-    private String type;//
-    @ApiModelProperty(value = "濯掍綋鏂囦欢涓婁紶鍚庤幏鍙栫殑鍞竴鏍囪瘑锛�3澶╁唴鏈夋晥")
-    private String media_id	;//
-    @ApiModelProperty(value = "濯掍綋鏂囦欢涓婁紶鏃堕棿鎴�")
-    private String created_at;//
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
deleted file mode 100644
index eb88955..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import com.alibaba.fastjson.JSONObject;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁杩斿洖鍙傛暟")
-public class QywxUserAttrInfoResponse {
-    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
-    private String type;//: 0,
-    @ApiModelProperty(value = "鏂囨湰鍚嶇О")
-    private String name;//: 0,
-    @ApiModelProperty(value = "鏂囨湰鍊�")
-    private String value;//: 0,
-    @ApiModelProperty(value = "鏂囨湰")
-    private QywxUserAttrValResponse text;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
deleted file mode 100644
index 666465d..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁value杩斿洖鍙傛暟")
-public class QywxUserAttrValResponse {
-    @ApiModelProperty(value = "value")
-    private String value;//: 0,
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
deleted file mode 100644
index b232926..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛鎵╁睍瀛楁杩斿洖鍙傛暟")
-public class QywxUserExtAttrResponse {
-    @ApiModelProperty(value = "鎵╁睍瀛楁闆嗗悎")
-    private List<QywxUserAttrInfoResponse> attrs;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
deleted file mode 100644
index 45fe549..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛璇︽儏杩斿洖鍙傛暟")
-public class QywxUserInfoResponse extends QywxBaseSingleResponse {
-    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
-    private String userid;
-    @ApiModelProperty(value = "鎴愬憳鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず鍚嶅瓧")
-    private String name;
-    @ApiModelProperty(value = "鎴愬憳鎵�灞為儴闂ㄥ垪琛ㄣ�傚垪琛ㄩ」涓洪儴闂↖D锛�32浣嶆暣鍨�")
-    private List<String> department;
-    @ApiModelProperty(value = "閮ㄩ棬鍐呯殑鎺掑簭鍊硷紝榛樿涓�0")
-    private List<String> order;
-    @ApiModelProperty(value = "鍏ㄥ眬鍞竴銆傚浜庡悓涓�涓湇鍔″晢锛屼笉鍚屽簲鐢ㄨ幏鍙栧埌浼佷笟鍐呭悓涓�涓垚鍛樼殑open_userid鏄浉鍚岀殑锛屾渶澶�64涓瓧鑺傘�備粎绗笁鏂瑰簲鐢ㄥ彲鑾峰彇")
-    private String open_userid;
-    @ApiModelProperty(value = "鎵嬫満鍙风爜")
-    private String mobile;
-    @ApiModelProperty(value = "鑱屽姟淇℃伅")
-    private String position;
-    @ApiModelProperty(value = "鎬у埆銆�0琛ㄧず鏈畾涔夛紝1琛ㄧず鐢锋�э紝2琛ㄧず濂虫�с��")
-    private Integer gender;
-    @ApiModelProperty(value = "婵�娲荤姸鎬�: 1=宸叉縺娲伙紝2=宸茬鐢紝4=鏈縺娲伙紝5=閫�鍑轰紒涓氥��")
-    private Integer status;
-    @ApiModelProperty(value = "閭")
-    private String email;
-    @ApiModelProperty(value = "鍛樺伐涓汉浜岀淮鐮侊紝鎵弿鍙坊鍔犱负澶栭儴鑱旂郴浜�(娉ㄦ剰杩斿洖鐨勬槸涓�涓猽rl锛屽彲鍦ㄦ祻瑙堝櫒涓婃墦寮�璇rl浠ュ睍绀轰簩缁寸爜)")
-    private String qr_code;
-    @ApiModelProperty(value = "浼佷笟閭")
-    private String biz_mail;
-    @ApiModelProperty(value = "琛ㄧず鍦ㄦ墍鍦ㄧ殑閮ㄩ棬鍐呮槸鍚︿负閮ㄩ棬璐熻矗浜恒��0-鍚︼紱1-鏄�傛槸涓�涓垪琛紝鏁伴噺蹇呴』涓巇epartment涓�鑷淬��")
-    private List<String> is_leader_in_dept;
-    @ApiModelProperty(value = "鐩村睘涓婄骇UserID")
-    private List<String> direct_leader;
-    @ApiModelProperty(value = "鍍弖rl")
-    private String avatar;
-    @ApiModelProperty(value = "澶村儚缂╃暐鍥緐rl")
-    private String thumb_avatar;
-    @ApiModelProperty(value = "搴ф満")
-    private String telephone;
-    @ApiModelProperty(value = "鍒悕")
-    private String alias;
-    @ApiModelProperty(value = "鎵╁睍灞炴��")
-    private QywxUserExtAttrResponse extattr;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java b/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
deleted file mode 100644
index 34ed301..0000000
--- a/server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.doumee.core.utils.qiyeweixin.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * @author 姹熻箘韫�
- * @date 2023/11/23 14:03
- */
-@Data
-@ApiModel("浼佷笟寰俊鐢ㄦ埛鍒楄〃杩斿洖鍙傛暟")
-public class QywxUserListResponse {
-    @ApiModelProperty(value = "鎴愬憳UserID銆傚搴旂鐞嗙鐨勮处鍙�")
-    private String userid;
-    @ApiModelProperty(value = "鎴愬憳鍚嶇О锛屼唬寮�鍙戣嚜寤哄簲鐢ㄩ渶瑕佺鐞嗗憳鎺堟潈鎵嶈繑鍥烇紱姝ゅ瓧娈典粠2019骞�12鏈�30鏃ヨ捣锛屽鏂板垱寤虹涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛�2020骞�6鏈�30鏃ヨ捣锛屽鎵�鏈夊巻鍙茬涓夋柟搴旂敤涓嶅啀杩斿洖鐪熷疄name锛屼娇鐢╱serid浠f浛name锛屽悗缁涓夋柟浠呴�氳褰曞簲鐢ㄥ彲鑾峰彇锛屾湭杩斿洖鍚嶇О鐨勬儏鍐甸渶瑕侀�氳繃閫氳褰曞睍绀虹粍浠舵潵灞曠ず鍚嶅瓧")
-    private String name;
-    @ApiModelProperty(value = "鎴愬憳鎵�灞為儴闂ㄥ垪琛ㄣ�傚垪琛ㄩ」涓洪儴闂↖D锛�32浣嶆暣鍨�")
-    private List<String> department;
-    @ApiModelProperty(value = "閮ㄩ棬鍐呯殑鎺掑簭鍊硷紝榛樿涓�0")
-    private List<String> order;
-    @ApiModelProperty(value = "鍏ㄥ眬鍞竴銆傚浜庡悓涓�涓湇鍔″晢锛屼笉鍚屽簲鐢ㄨ幏鍙栧埌浼佷笟鍐呭悓涓�涓垚鍛樼殑open_userid鏄浉鍚岀殑锛屾渶澶�64涓瓧鑺傘�備粎绗笁鏂瑰簲鐢ㄥ彲鑾峰彇")
-    private String open_userid;
-    @ApiModelProperty(value = "鎵嬫満鍙风爜")
-    private String mobile;
-    @ApiModelProperty(value = "鑱屽姟淇℃伅")
-    private String position;
-    @ApiModelProperty(value = "鎬у埆銆�0琛ㄧず鏈畾涔夛紝1琛ㄧず鐢锋�э紝2琛ㄧず濂虫�с��")
-    private Integer gender;
-    @ApiModelProperty(value = "婵�娲荤姸鎬�: 1=宸叉縺娲伙紝2=宸茬鐢紝4=鏈縺娲伙紝5=閫�鍑轰紒涓氥��")
-    private Integer status;
-    @ApiModelProperty(value = "閭")
-    private String email;
-    @ApiModelProperty(value = "鍛樺伐涓汉浜岀淮鐮侊紝鎵弿鍙坊鍔犱负澶栭儴鑱旂郴浜�(娉ㄦ剰杩斿洖鐨勬槸涓�涓猽rl锛屽彲鍦ㄦ祻瑙堝櫒涓婃墦寮�璇rl浠ュ睍绀轰簩缁寸爜)")
-    private String qr_code;
-    @ApiModelProperty(value = "浼佷笟閭")
-    private String biz_mail;
-    @ApiModelProperty(value = "琛ㄧず鍦ㄦ墍鍦ㄧ殑閮ㄩ棬鍐呮槸鍚︿负閮ㄩ棬璐熻矗浜恒��0-鍚︼紱1-鏄�傛槸涓�涓垪琛紝鏁伴噺蹇呴』涓巇epartment涓�鑷淬��")
-    private List<Integer> is_leader_in_dept;
-    @ApiModelProperty(value = "鐩村睘涓婄骇UserID")
-    private List<String> direct_leader;
-    @ApiModelProperty(value = "鍍弖rl")
-    private String avatar;
-    @ApiModelProperty(value = "澶村儚缂╃暐鍥緐rl")
-    private String thumb_avatar;
-    @ApiModelProperty(value = "搴ф満")
-    private String telephone;
-    @ApiModelProperty(value = "鍒悕")
-    private String alias;
-    @ApiModelProperty(value = "鎵╁睍灞炴��")
-    private QywxUserExtAttrResponse extattr;
-}
diff --git a/server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java b/server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
new file mode 100644
index 0000000..81bff86
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
@@ -0,0 +1,185 @@
+package com.doumee.core.utils.tyyun;
+
+import com.amazonaws.ClientConfiguration;
+import com.amazonaws.Protocol;
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
+import com.amazonaws.services.s3.model.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.net.URL;
+
+@Slf4j
+public class TyyZosUtil {
+
+    private AmazonS3 client;
+
+    // public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
+
+    public TyyZosUtil(String END_POINT, String ACCESS_KEY, String SECRET_KEY) {
+        try {
+            AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY,SECRET_KEY);
+            ClientConfiguration awsClientConfig = new ClientConfiguration();
+            awsClientConfig.setSignerOverride("AWSS3V4SignerType");
+            awsClientConfig.setProtocol(Protocol.HTTP);
+
+            client = AmazonS3ClientBuilder.standard()
+                    .withCredentials(new
+                            AWSStaticCredentialsProvider(credentials))
+                    .withClientConfiguration(awsClientConfig)
+                    .withEndpointConfiguration(new
+                            AwsClientBuilder.EndpointConfiguration(END_POINT, ""))
+                    .disableChunkedEncoding()
+                    .enablePathStyleAccess()
+                    .build();
+        }catch (Exception e){
+                log.error("瀵硅薄瀛樺偍====================杩炴帴澶╃考浜慫OS澶辫触"+e.getMessage());
+        }
+    }
+
+    /**
+     * 涓婁紶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        閲嶆柊鍛藉悕鐨勬枃浠跺悕
+     * @param filepath   灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @throws FileNotFoundException
+     */
+
+    public void uploadObject(String bucketName, String key, String filepath,
+                             String mime){
+        try {
+            File file= new File(filepath);
+            PutObjectRequest request = new PutObjectRequest(bucketName, key, file);
+            PutObjectResult result = client.putObject(request);
+        }catch (Exception e){
+            log.error("瀵硅薄瀛樺偍===================="+filepath+"鏂囦欢涓婁紶澶辫触"+e.getMessage());
+        }finally {
+            shutDown();
+        }
+    }
+
+    /**
+     * 璁瞜ey鏂囦欢瀛樺偍鍦ㄦ湰鍦癴ilename鐩爣鏂囦欢涓�
+     * @param bucketName
+     * @param key
+     * @param filename
+     */
+    public void getObject(String bucketName, String key, String filename ){
+        try {
+            GetObjectRequest request = new GetObjectRequest(bucketName, key);
+            S3Object result = client.getObject(request);
+            System.out.print("=====request success=====\n");
+            try {
+                InputStream in = result.getObjectContent();
+                File outputFile = new File(filename);
+                FileOutputStream outputStream = new
+                        FileOutputStream(outputFile);
+                byte[] read_buf = new byte[1024 * 1024];
+                int read_len = 0;
+                while ((read_len = in.read(read_buf)) > 0) {
+                    outputStream.write(read_buf, 0, read_len);
+                }
+                in.close();
+                outputStream.close();
+            } catch (IOException e){
+                e.printStackTrace();
+            }
+        }catch (Exception e){
+            log.error("瀵硅薄瀛樺偍===================="+filename+"鏂囦欢璇诲彇澶辫触"+e.getMessage());
+        }finally {
+            shutDown();
+        }
+    }
+    public void deleteObject(String bucketName, String key  ){
+        try {
+            DeleteObjectRequest request = new DeleteObjectRequest(bucketName, key);
+            client.deleteObject(request);
+            System.out.print("=====request deleteObject success=====");
+        }catch (Exception e){
+            log.error("瀵硅薄瀛樺偍===================="+key+"鏂囦欢鍒犻櫎澶辫触"+e.getMessage());
+        }finally {
+            shutDown();
+        }
+    }
+
+
+    /**
+     * 鍏抽棴
+     *
+     * @throws FileNotFoundException
+     */
+
+    public void shutDown() {
+        if (client != null) {
+            // 鍏抽棴client
+            client.shutdown();
+        }
+    }
+
+    public static void main(String[] args) {
+        TyyZosUtil aLiYunUtil = new TyyZosUtil("", "uc4nnpsqep1i9fijqr37nokh",
+                "/rp41xCx/XdGEVCptdH6v7xpc9w=");
+        // aLiYunUtil.uploadObject("pongto", "work/li2.txt", "D://鍝�.txt",
+        // ".html,.html text/html");D://瑁呮満杞欢/鍔炲叕瀛︿範
+        // aLiYunUtil.partUploadObject("pongto", "work/ps.exe",
+        // "D://瑁呮満杞欢/鍔炲叕瀛︿範/Adobe_Illustrator_CS6_XiaZaiBa.exe",
+        // ".html,.html text/html");
+        // aLiYunUtil.deleteBucket("pongto");
+    }
+
+    /**
+     * 涓婁紶缃戠粶鏂囦欢
+     *
+     * @param bucketName 浜戠瀛樻斁bucket鍚嶇О
+     * @param key        閲嶆柊鍛藉悕鐨勬枃浠跺悕
+     *                   灏嗚涓婁紶鐨勬枃浠跺悕绉�
+     * @throws IOException
+     */
+
+    public boolean uploadOnlineObject(String url, String bucketName, String key )     {
+        try {
+
+            InputStream inputStream = new URL(url).openStream();
+            if (inputStream != null) {
+                ObjectMetadata metadata = new ObjectMetadata();
+                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
+                PutObjectResult result = client.putObject(request);
+            }else {
+                log.error("瀵硅薄瀛樺偍===================="+url+"缃戠粶鏂囦欢涓婁紶澶辫触锛岀綉缁滄枃浠惰鍙栧け璐�");
+            }
+        }catch (Exception e){
+            log.error("瀵硅薄瀛樺偍===================="+url+"缃戠粶鏂囦欢涓婁紶澶辫触"+e.getMessage());
+        }finally {
+            shutDown();
+        }
+        return false;
+
+    }
+    public boolean uploadInputstreamObject(InputStream inputStream, String bucketName, String key )     {
+        try {
+
+            if (inputStream != null) {
+                ObjectMetadata metadata = new ObjectMetadata();
+                metadata.setContentLength(inputStream.available());
+
+                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
+                request.setCannedAcl(CannedAccessControlList.PublicRead);
+                PutObjectResult result = client.putObject(request);
+                return true;
+            }
+        }catch (Exception e){
+            log.error("瀵硅薄瀛樺偍==================== 鏂囦欢涓婁紶澶辫触"+e.getMessage());
+        }finally {
+            shutDown();
+        }
+        return false;
+
+    }
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java b/server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
new file mode 100644
index 0000000..5626f4b
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.InterfaceLog;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface InterfaceLogMapper extends BaseMapper<InterfaceLog> {
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java b/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
new file mode 100644
index 0000000..9589699
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
@@ -0,0 +1,36 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 鍛樺伐淇℃伅瀵煎叆琛�
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("鍛樺伐淇℃伅瀵煎叆")
+public class CasesImport {
+
+//    @ExcelColumn(name="搴忓彿",value = "sn")
+    private Integer sn;
+
+    @ExcelColumn(name="濮撳悕",value = "name",index = 1)
+    private String name;
+    @ExcelColumn(name="鎵嬫満鍙�",value = "phone",index = 2)
+    private String phone;
+
+    @ExcelColumn(name="韬唤璇佸彿",value = "idcardNo",index = 3)
+    private String idcardNo;
+
+    @ExcelColumn(name="缁勭粐鍚嶇О" , value = "companyName" ,index = 4)
+    private String companyName;
+
+    @ExcelColumn(name="宸ュ彿" , value = "code")
+    private String code;
+
+    @ExcelColumn(name="宀椾綅" , value = "code")
+    private String positionName;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java b/server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java
new file mode 100644
index 0000000..e2c5e1a
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java
@@ -0,0 +1,17 @@
+package com.doumee.dao.business.dto;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class LoginRequestNewParam {
+	private String appid;// 1 O 鎵嬫満鍙风爜
+	private String user_name;// 1 M 鐢ㄦ埛鍚岻d
+	private String rediUrl;// 1 M 鐧诲綍璐︽埛锛�
+	private String account_no	;//String	璐﹀彿
+	private String scode;//String	鐢ㄦ埛瀵瑰簲鍔犵洘鍟哠code
+	private List<RoleRequestParam> roles;// 1 M 鐧诲綍瀵嗙爜
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java b/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
new file mode 100644
index 0000000..6b1e4e2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
@@ -0,0 +1,42 @@
+package com.doumee.dao.business.dto;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 鍛樺伐淇℃伅瀵煎叆琛�
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("鍛樺伐淇℃伅瀵煎叆")
+public class MemberImport {
+    @ExcelColumn(name="宸ュ彿",value = "code",index = 1)
+    private String code;
+    @ExcelColumn(name="濮撳悕",value = "name",index = 2)
+    private String name;
+    @ExcelColumn(name="鑱屼笟鐓�",value = "imgurl",index = 3)
+    private String imgurl;
+    @ExcelColumn(name="绛夌骇",value = "levelName",index = 4)
+    private String levelName;
+    @ExcelColumn(name="鎬у埆" , value = "sex" ,index = 5)
+    private String sex;
+    @ExcelColumn(name="宀椾綅" , value = "position",index = 6)
+    private String position;
+    @ExcelColumn(name="浠庝笟骞翠唤(骞�)" , value = "jobYear",index = 7)
+    private String jobYear;
+    @ExcelColumn(name="鏈嶅姟鎴樺尯", value = "zqNames",index = 8)
+    private String zqNames;
+    @ExcelColumn(name="鍟嗕笟鍖栫被鍨�", value = "typeNames",index = 9)
+    private String typeNames;
+    @ExcelColumn(name="鎿呴暱棰嗗煙", value = "fieldNames",index = 10)
+    private String fieldNames;
+    @ExcelColumn(name="鏈嶅姟鍟嗗満鏁�(涓�)", value = "serveNum",index = 11)
+    private String serveNum;
+    @ExcelColumn(name="璐圭敤鏍囧噯(鍏�/鍛�)", value = "fee",index = 12)
+    private String fee;
+    @ExcelColumn(name="鑰佸笀绠�浠�", value = "fee",index = 13)
+    private String info;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java b/server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java
new file mode 100644
index 0000000..cbd021e
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java
@@ -0,0 +1,11 @@
+package com.doumee.dao.business.dto;
+
+import lombok.Data;
+
+@Data
+public class RoleRequestParam {
+	private String code;//瑙掕壊缂栫爜
+	private String name;// 瑙掕壊鍚嶇О
+	private String id;//缂栫爜锛�
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Category.java b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
index 06048b0..9868a8d 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Category.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -1,16 +1,15 @@
 package com.doumee.dao.business.model;
 
-import com.alibaba.fastjson.JSONArray;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.doumee.core.annotation.excel.ExcelColumn;
-import com.doumee.core.model.LoginUserInfo;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
+import com.doumee.core.annotation.excel.ExcelColumn;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.util.Date;
 import java.util.List;
 
@@ -63,8 +62,8 @@
     @ExcelColumn(name="鍗曚綅鍚嶇О")
     private String name;
 
-    @ApiModelProperty(value = "绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱", example = "1")
-    @ExcelColumn(name="绫诲瀷:0=鍝佺閰嶇疆锛�1=杞﹁締绫诲瀷閰嶇疆锛�2=椁愭爣閰嶇疆锛�3=鎵嬬画璐归厤缃紱")
+    @ApiModelProperty(value = "绫诲瀷:0=鎴樺尯;1=鍟嗕笟鍖�;2=鎿呴暱棰嗗煙;3=璁插笀绛夌骇;", example = "1")
+    @ExcelColumn(name="绫诲瀷:0=鎴樺尯;1=鍟嗕笟鍖�;2=鎿呴暱棰嗗煙;3=璁插笀绛夌骇;")
     private Integer type;
 
     @ApiModelProperty(value = "鍐呭锛堣溅杈嗚鏍笺�侀鏍囥�佹墜缁垂姣斾緥锛�")
@@ -78,15 +77,15 @@
     @ExcelColumn(name="鎺掑簭鐮侊紙鍗囧簭锛�")
     private Integer sortnum;
 
-    @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
-    @ExcelColumn(name="鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱")
+    @ApiModelProperty(value = "鏄惁鍥哄畾锛�:0=鍚︼紱1=鏄紱", example = "1")
+    @ExcelColumn(name="鏄惁鍥哄畾 :0=鍚︼紱1=鏄紱")
     private Integer isFixed;
-    @ApiModelProperty(value = "鏄惁鍥哄畾杞﹁締锛堣溅杈嗙被鍨嬩娇鐢級:0=鍚︼紱1=鏄紱", example = "1")
+    @ApiModelProperty(value = "鏈�鍚庢搷浣滀汉鍛橈紱", example = "1")
     @TableField(exist = false)
     private String updateUserName;
-    @ApiModelProperty(value = "椁愭爣绛夐厤缃」闆嗗悎", example = "1")
+    @ApiModelProperty(value = "鍟嗕笟鍖栧浘闆嗛檮浠堕泦鍚�", example = "1")
     @TableField(exist = false)
-    private JSONArray detailList;
+    private List<Multifile> fileList;
     @ApiModelProperty(value = "鍥炬爣鍏ㄨ矾寰�")
     @TableField(exist = false)
     private String iconFull;
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java b/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
index ec27b08..c301749 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
@@ -2,6 +2,8 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.dao.business.dto.CasesImport;
+import com.doumee.dao.business.dto.MemberImport;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -9,8 +11,12 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.poi.ss.usermodel.PictureData;
+
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * 鍒嗙被淇℃伅琛∕odel瀹氫箟
  * @author doumee
@@ -76,4 +82,12 @@
     @ApiModelProperty("瀵煎叆澶辫触璁板綍鏁�")
     @ExcelColumn(name="瀵煎叆澶辫触璁板綍鏁�",index=18 ,width=10)
     private Integer errorNum;
+    @TableField(exist = false)
+    private List<CasesImport> caseList;
+    @TableField(exist = false)
+    private List<MemberImport> memberList;
+    @TableField(exist = false)
+    private  List<PictureData> pictureDataList;
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java b/server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
new file mode 100644
index 0000000..e2914ac
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
@@ -0,0 +1,98 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍")
+@TableName("`interface_log`")
+public class InterfaceLog{
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭", example = "1")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "绫诲瀷 0璋冪敤 1鎺ㄩ�佹帴鍙�", example = "1")
+    @ExcelColumn(name="绫诲瀷 0璋冪敤 1鎺ㄩ�佹帴鍙�")
+    private Integer type;
+
+    @ApiModelProperty(value = "鎺ュ彛鍚嶇О")
+    @ExcelColumn(name="鎺ュ彛鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "鍦板潃淇℃伅")
+    @ExcelColumn(name="鍦板潃淇℃伅")
+    private String url;
+
+    @ApiModelProperty(value = "璇锋眰鍙傛暟")
+    @ExcelColumn(name="璇锋眰鍙傛暟")
+    private String request;
+
+    @ApiModelProperty(value = "鍝嶅簲鍙傛暟")
+    @ExcelColumn(name="鍝嶅簲鍙傛暟")
+    private String repose;
+
+    @ApiModelProperty(value = "璋冪敤缁撴灉 0鎴愬姛 1澶辫触", example = "1")
+    @ExcelColumn(name="璋冪敤缁撴灉 0鎴愬姛 1澶辫触")
+    private Integer success;
+
+    @ApiModelProperty(value = "骞冲彴 0娴峰悍瀹夐槻骞冲彴 1ERP绯荤粺", example = "1")
+    @ExcelColumn(name="骞冲彴 0娴峰悍瀹夐槻骞冲彴 1ERP绯荤粺")
+    private Integer plat;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷  0缁勭粐 1浜哄憳 2闂ㄧ浜嬩欢 3璁惧", example = "1")
+    @ExcelColumn(name="鍏宠仈瀵硅薄绫诲瀷  0缁勭粐 1浜哄憳 2闂ㄧ浜嬩欢 3璁惧")
+    private Integer objType;
+
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄缂栫爜锛堝涓敤鑻辨枃閫楀彿闅斿紑锛�")
+    @ExcelColumn(name="鍏宠仈瀵硅薄缂栫爜锛堝涓敤鑻辨枃閫楀彿闅斿紑锛�")
+    private String objId;
+
+
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @TableField(exist = false)
+    private Date startDate;
+
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @TableField(exist = false)
+    private Date endDate;
+
+}
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Member.java b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
index cdc5bed..405d4ab 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -11,6 +11,8 @@
 import com.fasterxml.jackson.annotation.JsonFormat;
 import java.util.Date;
 import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * 浼氬憳淇℃伅琛∕odel瀹氫箟
  * @author doumee
@@ -70,6 +72,10 @@
     @ApiModelProperty("鍟嗕笟鍖栫被鍨嬬紪鐮侀泦鍚堬紙[1],[2],...]锛�")
     @ExcelColumn(name="鍟嗕笟鍖栫被鍨嬬紪鐮侀泦鍚堬紙[1],[2],...]锛�",index=16 ,width=10)
     private String bustypeIds;
+    @ApiModelProperty("鎿呴暱棰嗗煙闆嗗悎锛圼1],[2],...]锛�")
+    private String fieldIds;
+    @ApiModelProperty("宸ュ彿")
+    private String code;
     @ApiModelProperty("璁插笀绛夌骇缂栫爜锛堝叧鑱攃ategory锛�")
     @ExcelColumn(name="璁插笀绛夌骇缂栫爜锛堝叧鑱攃ategory锛�",index=17 ,width=10)
     private Integer levelId;
@@ -106,4 +112,46 @@
     @ApiModelProperty("瀵煎叆璁板綍缂栫爜锛堝叧鑱攊mport_record)")
     @ExcelColumn(name="瀵煎叆璁板綍缂栫爜锛堝叧鑱攊mport_record)",index=28 ,width=10)
     private Integer importId;
+
+    @ApiModelProperty("宸ヤ綔骞存暟")
+    @TableField(exist = false)
+    private Integer workYears;
+
+    @ApiModelProperty("鎿呴暱棰嗗煙鍚嶇О")
+    @TableField(exist = false)
+    private String fieldNames;
+
+    @ApiModelProperty("宸ヤ綔宀椾綅鍚嶇О")
+    @TableField(exist = false)
+    private String promotionName;
+
+    @ApiModelProperty("绾у埆鍚嶇О")
+    @TableField(exist = false)
+    private String levelName;
+
+    @ApiModelProperty("鎴樺尯缂栫爜 - 鏌ヨ")
+    @TableField(exist = false)
+    private String queryZQCode;
+
+    @ApiModelProperty("鎺掑簭淇℃伅锛�0=鏀惰垂浠庨珮鍒颁綆锛�1=鏀惰垂浠庝綆鍒伴珮锛�2=绛夌骇浠庨珮鍒颁綆锛�3=绛夌骇浠庝綆鍒伴珮锛�4=鏈嶅姟鏁颁粠楂樺埌浣�")
+    @TableField(exist = false)
+    private Integer orderByType;
+
+    @ApiModelProperty("璇佷欢鐓у叏璺緞")
+    @TableField(exist = false)
+    private String fullImgurl;
+
+    @ApiModelProperty("鏌ヨ鐢ㄦ埛绫诲瀷")
+    @TableField(exist = false)
+    private String queryUserRole;
+
+    @ApiModelProperty("鎿呴暱棰嗗煙")
+    @TableField(exist = false)
+    private List<Category> fieldList;
+
+    @ApiModelProperty("妗堜緥淇℃伅")
+    @TableField(exist = false)
+    private List<Cases> casesList;
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java b/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
index cb1df32..6985a4c 100644
--- a/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
+++ b/server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -53,9 +53,7 @@
     @ApiModelProperty(value = "绫诲瀷0鍥剧墖 1瑙嗛 2鍏朵粬", example = "1")
     private Integer type;
 
-//    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1璺岀粖婊戜笂鎶� 2璺岀粖婊戝鐞� 3璺岀粖婊戝垎閰嶇墿涓氫富绠� 4璺岀粖婊戝垎閰嶅鐞嗕汉 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊 7DCA宸ュ崟鍥剧墖", example = "1")
-//    @ExcelExportColumn(name="鍏宠仈瀵硅薄绫诲瀷 0SHE涓婃姤 1璺岀粖婊戜笂鎶� 2璺岀粖婊戝鐞� 3璺岀粖婊戝垎閰嶇墿涓氫富绠� 4璺岀粖婊戝垎閰嶅鐞嗕汉 5DCA椋庨櫓涓婃姤 6DCA椋庨櫓澶勭悊 7DCA宸ュ崟鍥剧墖")
-    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0韬唤鐢宠璧勬枡 1璁㈠崟闄勪欢", example = "1")
+    @ApiModelProperty(value = "鍏宠仈瀵硅薄绫诲瀷 0鍟嗕笟鍖栫被鍨嬪鍥� 1妗堜緥", example = "1")
     private Integer objType;
 
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
@@ -66,7 +64,7 @@
   
     @ApiModelProperty(value = "鏂囦欢鍦板潃")
     @TableField(exist = false)
-    private String fileurlFull;
+    private String url;
 
 
     @ApiModelProperty(value = "鍐呯綉鏂囦欢鍦板潃")
diff --git a/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java b/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
new file mode 100644
index 0000000..e9cd3f1
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
@@ -0,0 +1,28 @@
+package com.doumee.dao.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2026/1/28 10:43
+ */
+@Data
+@ApiModel("H5鐢ㄦ埛璇锋眰杩斿洖瀵硅薄绫�")
+public class WebLoginUserVO {
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭")
+    private String id;
+
+    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊锛�")
+    private String roleType;
+
+    @ApiModelProperty(value = "鎴樺尯缂栫爜")
+    private String zhanqu;
+
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java b/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
index 813b65d..cadb3da 100644
--- a/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
+++ b/server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
@@ -3,6 +3,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.ImportRecord;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 /**
@@ -94,4 +96,7 @@
      * @return long
      */
     long count(ImportRecord model);
+    ImportRecord importBatch(MultipartFile file, int type );
+
+    void dealImporTask(ImportRecord importRecord);
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java b/server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java
new file mode 100644
index 0000000..8063537
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java
@@ -0,0 +1,100 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.InterfaceLog;
+
+import java.util.List;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍Service瀹氫箟
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface InterfaceLogService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(InterfaceLog interfaceLog);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     */
+    void delete(InterfaceLog interfaceLog);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     */
+    void updateById(InterfaceLog interfaceLog);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param interfaceLogs 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<InterfaceLog> interfaceLogs);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return InterfaceLog
+     */
+    InterfaceLog findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return InterfaceLog
+     */
+    InterfaceLog findOne(InterfaceLog interfaceLog);
+    void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type);
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return List<InterfaceLog>
+     */
+    List<InterfaceLog> findList(InterfaceLog interfaceLog);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<InterfaceLog>
+     */
+    PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param interfaceLog 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(InterfaceLog interfaceLog);
+
+    void clearThreeMonthLog();
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/MemberService.java b/server/services/src/main/java/com/doumee/service/business/MemberService.java
index f955039..bc604e3 100644
--- a/server/services/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -3,6 +3,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Member;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 /**
@@ -94,4 +96,7 @@
      * @return long
      */
     long count(Member model);
+
+    Member findDetailById(Integer id,String queryUserRole);
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
index 56d9001..0ce16ed 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -11,7 +11,9 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.MultifileMapper;
 import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Multifile;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.CategoryService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -28,6 +30,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -42,6 +45,8 @@
 
     @Autowired
     private CategoryMapper categoryMapper;
+    @Autowired
+    private MultifileMapper multifileMapper;
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
@@ -49,12 +54,11 @@
     @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public Integer create(Category category) {
+//        绫诲瀷:0=鎴樺尯;1=鍟嗕笟鍖�;2=鎿呴暱棰嗗煙;3=璁插笀绛夌骇;
         if(Objects.isNull(category)
         || Objects.isNull(category.getType())
         || Objects.isNull(category.getName())
-        || (!Constants.equalsInteger(category.getType(),Constants.ZERO)&& CollectionUtils.isEmpty(category.getDetailList()))
-        || (Constants.equalsInteger(category.getType(),Constants.ONE) && (Objects.isNull(category.getIcon())||Objects.isNull(category.getIsFixed())) )
-        ){
+        || (Constants.equalsInteger(category.getType(),Constants.ZERO)&& StringUtils.isBlank(category.getDetail()))   ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
@@ -63,22 +67,40 @@
         category.setCreateUser(loginUserInfo.getId());
         category.setUpdateTime(new Date());
         category.setUpdateUser(loginUserInfo.getId());
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())
-                && !Constants.equalsInteger(category.getType(),Constants.THREE)){
-            category.setDetail(category.getDetailList().toJSONString());
-        }
-        if(!Constants.equalsInteger(category.getType(),Constants.ONE)){
-            category.setIsFixed(Constants.ZERO);
-        }
         categoryMapper.insert(category);
+        dealBatchMultiFiles(category, category.getFileList(), loginUserInfo,false);
         return category.getId();
     }
-
+    public void dealBatchMultiFiles(Category category, List<Multifile> fileList, LoginUserInfo user,boolean update) {
+        Date today = new Date();
+        //娓呯┖鍘熸湁鐨�
+        if(update){
+            multifileMapper.delete(new UpdateWrapper<Multifile>().lambda()
+                    .eq(Multifile::getIsdeleted,Constants.ZERO)
+                    .eq(Multifile::getObjType,Constants.ZERO)
+                    .eq(Multifile::getObjId,category.getId()));
+        }
+        if(fileList!=null && fileList.size()>0){
+            List<Multifile> multifileList = new ArrayList<>();
+            fileList.stream().forEach(s -> {
+                if(StringUtils.isNotBlank(s.getFileurl())){
+                    s.setIsdeleted(Constants.ZERO);
+                    s.setCreator(user.getId());
+                    s.setCreateDate(today);
+                    s.setObjId(category.getId());
+                    s.setType(Constants.ZERO);
+                    s.setObjType(Constants.ZERO);
+                    multifileList.add(s);
+                }
+            });
+            if(multifileList.size()>0){
+                multifileMapper.insert(multifileList);
+            }
+        }
+    }
     @Override
     public void deleteById(Integer id) {
         categoryMapper.update(new UpdateWrapper<Category>().lambda().set(Category::getDeleted,Constants.ONE).eq(Category::getId,id));
-
-//        categoryMapper.deleteById(id);
     }
 
     @Override
@@ -102,8 +124,6 @@
                 || Objects.isNull(category.getId())
                 || Objects.isNull(category.getType())
                 || Objects.isNull(category.getName())
-                || (!Constants.equalsInteger(category.getType(),Constants.ZERO)&& CollectionUtils.isEmpty(category.getDetailList()))
-                || (Constants.equalsInteger(category.getType(),Constants.ONE) && (Objects.isNull(category.getIcon())||Objects.isNull(category.getIsFixed())) )
         ){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
@@ -111,25 +131,18 @@
         category.setUpdateTime(new Date());
         category.setIsFixed(null);
         category.setUpdateUser(loginUserInfo.getId());
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())
-                && !Constants.equalsInteger(category.getType(),Constants.THREE)){
-            category.setDetail(category.getDetailList().toJSONString());
-        }
         categoryMapper.updateById(category);
+        dealBatchMultiFiles(category, category.getFileList(), loginUserInfo,true);
     }
     @Override
     public void updateStatus(Category category) {
-        if(Objects.isNull(category)
-                || Objects.isNull(category.getId())){
+        if(Objects.isNull(category) || Objects.isNull(category.getId())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST);
         }
         LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         category.setUpdateTime(new Date());
         category.setIsFixed(null);
         category.setUpdateUser(loginUserInfo.getId());
-        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())){
-            category.setDetail(category.getDetailList().toJSONString());
-        }
         categoryMapper.updateById(category);
     }
 
@@ -149,12 +162,9 @@
         if(Objects.isNull(category)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
-        if(StringUtils.isNotBlank(category.getDetail())){
-            category.setDetailList(JSONArray.parseArray(category.getDetail()));
-        }
         if(StringUtils.isNotBlank(category.getIcon())){
-            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+            String path  = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CATEGORY_FILES).getCode();
             category.setIconFull(path + category.getIcon());
         }
         return category;
@@ -168,6 +178,7 @@
 
     @Override
     public List<Category> findList(Category category) {
+        category.setDeleted(Constants.ZERO);
         QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
         return categoryMapper.selectList(wrapper);
     }
@@ -225,22 +236,38 @@
         queryWrapper.orderByAsc(Category::getSortnum);
         PageData<Category> result =PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper));
         if(result!=null && result.getRecords()!=null){
-            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
-                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
+            String path  = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()
+                    +systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CATEGORY_FILES).getCode();
             for(Category cate : result.getRecords()){
-                try {
-                    if(StringUtils.isNotBlank(cate.getDetail())){
-                        cate.setDetailList(JSONArray.parseArray(cate.getDetail()));
-                    }
-                    if(StringUtils.isNotBlank(cate.getIcon())){
-                        cate.setIconFull(path + cate.getIcon());
-                    }
-                }catch (Exception e){
-
+                if(Constants.equalsInteger(cate.getType(),Constants.ONE) ){
+                    initMultifileList(cate);
+                }
+                if(StringUtils.isNotBlank(cate.getIcon())){
+                    cate.setIconFull(path + cate.getIcon());
                 }
             }
         }
         return result;
+    }
+
+    private void initMultifileList(Category cate) {
+        String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode()
+                + systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
+
+        Multifile find = new Multifile();
+        find.setObjId(cate.getId());
+        find.setObjType(Constants.ZERO);
+        find.setIsdeleted(Constants.ZERO);
+        List<Multifile> fileList=  multifileMapper.selectList(new QueryWrapper<>(find));
+        if(fileList!=null){
+            for(Multifile f : fileList){
+                if(StringUtils.isNotBlank(f.getFileurl())){
+                        f.setUrl(path+f.getFileurl());
+                }
+
+            }
+        }
+        cate.setFileList(fileList);
     }
 
     @Override
@@ -259,12 +286,12 @@
             String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                     +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
             for (Category category:categoryList) {
-                if(StringUtils.isNotBlank(category.getDetail())){
-                    category.setDetailList(JSONArray.parseArray(category.getDetail()));
-                }
                 if(StringUtils.isNotBlank(category.getIcon())){
                     category.setIconFull(path + category.getIcon());
                 }
+                if(Constants.equalsInteger(category.getType(),Constants.ONE) ){
+                    initMultifileList(category);
+                }
             }
         }
         return categoryList;
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
index d3ca1de..074a1db 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
@@ -1,20 +1,41 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.core.annotation.excel.ExcelImporter;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.dto.CasesImport;
+import com.doumee.dao.business.dto.MemberImport;
 import com.doumee.dao.business.model.ImportRecord;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.ImportRecordMapper;
+import com.doumee.dao.business.model.Member;
 import com.doumee.service.business.ImportRecordService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 鍒嗙被淇℃伅琛⊿ervice瀹炵幇
@@ -26,9 +47,21 @@
 
     @Autowired
     private ImportRecordMapper importRecordMapper;
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
 
     @Override
     public Integer create(ImportRecord importRecord) {
+        if(StringUtils.isBlank(importRecord.getImgurl())){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+        importRecord.setDeleted(Constants.ZERO);
+        importRecord.setStatus(Constants.ZERO);
+        importRecord.setCreateTime(new Date());
+        importRecord.setCreateUser(loginUserInfo.getId());
+        importRecord.setUpdateTime(new Date());
+        importRecord.setUpdateUser(loginUserInfo.getId());
         importRecordMapper.insert(importRecord);
         return importRecord.getId();
     }
@@ -134,4 +167,106 @@
         QueryWrapper<ImportRecord> wrapper = new QueryWrapper<>(importRecord);
         return importRecordMapper.selectCount(wrapper);
     }
+    @Override
+    public ImportRecord importBatch(MultipartFile file,int type ){
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_RECORD);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_RECORD,true,30, TimeUnit.MINUTES);
+        try {
+            ImportRecord model = new ImportRecord();
+            LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            model.setDeleted(Constants.ZERO);
+            model.setStatus(Constants.ONE);//寮傛澶勭悊涓�
+            model.setCreateTime(new Date());
+            model.setCreateUser(loginUserInfo.getId());
+            model.setUpdateTime(model.getCreateTime());
+            model.setUpdateUser(loginUserInfo.getId());
+            model.setType(type);
+            model.setTitle((type==1?"妗堜緥淇℃伅鎵归噺瀵煎叆":"鑰佸笀淇℃伅鎵归噺瀵煎叆")+ DateUtil.getPlusTime2(model.getCreateTime()));
+            model.setTotalNum(0);
+            ExcelImporter ie= new ExcelImporter(file,0,0, CellType.STRING); // 纭繚鍗曞厓鏍肩被鍨嬩负瀛楃涓�);
+            if(type == 1) {
+              model.setCaseList(ie.getDataList(CasesImport.class,null));
+              if(model.getCaseList() ==null || model.getCaseList().size()==0){
+                  throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵煎叆鏂囦欢妗堜緥淇℃伅鍐呭涓虹┖锛�");
+              }
+              model.setTotalNum(model.getCaseList().size());
+            }else{
+              model.setMemberList(ie.getDataList(MemberImport.class,null));
+              if(model.getMemberList() ==null || model.getMemberList().size()==0){
+                  throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵煎叆鏂囦欢鑰佸笀淇℃伅鍐呭涓虹┖锛�");
+              }
+              model.setTotalNum(model.getMemberList().size());
+            }
+//            model.setPictureDataList(ie);
+            importRecordMapper.insert(model);
+            return model;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏂囦欢淇℃伅璇诲彇澶辫触锛岃妫�鏌ユ枃浠跺唴瀹瑰悗閲嶈瘯锛�");
+        }finally {
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_RECORD);
+        }
+    }
+
+    /**
+     * 寮傛鎵ц鏂囦欢浠诲姟
+     * @param importRecord
+     */
+    @Override
+    @Async
+    public void dealImporTask(ImportRecord importRecord){
+        int success = 0;
+        if(Constants.equalsInteger(importRecord.getType(),0)){
+           dealUserImportBiz(importRecord);
+        }else{
+            dealCaseImportBiz(importRecord);
+        }
+        importRecord.setStatus(Constants.TWO);
+        importRecord.setUpdateTime(new Date());
+        importRecordMapper.updateById(importRecord);
+
+    }
+
+    /**
+     * 澶勭悊妗堜緥瀵煎叆浠诲姟
+     * @param importRecord
+     */
+
+    private int dealCaseImportBiz(ImportRecord importRecord) {
+        int success=0;
+        String msg ="";
+        try {
+            for(CasesImport param:importRecord.getCaseList()){
+
+            }
+        }catch (Exception e){
+
+        }
+        importRecord.setDoneNum(success);
+        importRecord.setErrorNum(importRecord.getTotalNum() - success);
+        return success;
+    }
+
+    /**
+     * 澶勭悊浜哄憳瀵煎叆璁板綍
+     * @param importRecord
+     */
+    private int dealUserImportBiz(ImportRecord importRecord) {
+        int success=0;
+        String msg = "";
+        try {
+            for(MemberImport param:importRecord.getMemberList()){
+
+            }
+        }catch (Exception e){
+
+        }
+        importRecord.setDoneNum(success);
+        importRecord.setErrorNum(importRecord.getTotalNum() - success);
+        importRecord.setDetail(msg);
+
+        return success;
+    }
 }
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
new file mode 100644
index 0000000..215d0b2
--- /dev/null
+++ b/server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
@@ -0,0 +1,191 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.InterfaceLogMapper;
+import com.doumee.dao.business.model.InterfaceLog;
+import com.doumee.service.business.InterfaceLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓夋柟骞冲彴鎺ュ彛浜や簰璁板綍Service瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class InterfaceLogServiceImpl implements InterfaceLogService {
+
+    @Autowired
+    private InterfaceLogMapper interfaceLogMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Override
+    public Integer create(InterfaceLog interfaceLog) {
+        interfaceLogMapper.insert(interfaceLog);
+        return interfaceLog.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        interfaceLogMapper.deleteById(id);
+    }
+
+    @Override
+    public void delete(InterfaceLog interfaceLog) {
+        UpdateWrapper<InterfaceLog> deleteWrapper = new UpdateWrapper<>(interfaceLog);
+        interfaceLogMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        interfaceLogMapper.deleteBatchIds(ids);
+    }
+
+    @Override
+    public void updateById(InterfaceLog interfaceLog) {
+        interfaceLogMapper.updateById(interfaceLog);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<InterfaceLog> interfaceLogs) {
+        if (CollectionUtils.isEmpty(interfaceLogs)) {
+            return;
+        }
+        for (InterfaceLog interfaceLog: interfaceLogs) {
+            this.updateById(interfaceLog);
+        }
+    }
+
+    @Override
+    public InterfaceLog findById(Integer id) {
+        return interfaceLogMapper.selectById(id);
+    }
+
+    @Override
+    public InterfaceLog findOne(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectOne(wrapper);
+    }
+    @Override
+    public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type){
+        if(interfaceLogMapper ==null){
+            return;
+        }
+        InterfaceLog log = new InterfaceLog();
+        log.setCreateDate(new Date());
+        log.setUrl(url);
+        log.setEditDate(log.getCreateDate());
+        log.setPlat(Constants.ZERO);
+        log.setName(name);
+        log.setIsdeleted(Constants.ZERO);
+        log.setRequest(param);
+        log.setType(type);
+        log.setSuccess(success);
+        log.setRepose(respone);
+        interfaceLogMapper.insert(log);
+    }
+
+    @Override
+    public List<InterfaceLog> findList(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap) {
+        IPage<InterfaceLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<InterfaceLog> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        if (pageWrap.getModel().getId() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getId, pageWrap.getModel().getId());
+        }
+        if (pageWrap.getModel().getCreator() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getCreator, pageWrap.getModel().getCreator());
+        }
+        if (pageWrap.getModel().getCreateDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.lambda().le(InterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+        }
+        if (pageWrap.getModel().getEditor() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getEditor, pageWrap.getModel().getEditor());
+        }
+        if (pageWrap.getModel().getEditDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.lambda().le(InterfaceLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+        }
+
+        if (pageWrap.getModel().getStartDate() != null) {
+            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, pageWrap.getModel().getStartDate());
+        }
+        if (pageWrap.getModel().getEndDate() != null) {
+            queryWrapper.lambda().le(InterfaceLog::getCreateDate, pageWrap.getModel().getEndDate());
+        }
+        if (pageWrap.getModel().getIsdeleted() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
+        }
+        if (pageWrap.getModel().getRemark() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getRemark, pageWrap.getModel().getRemark());
+        }
+        if (pageWrap.getModel().getType() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getType, pageWrap.getModel().getType());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getName, pageWrap.getModel().getName());
+        }
+        if (pageWrap.getModel().getUrl() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getUrl, pageWrap.getModel().getUrl());
+        }
+        if (pageWrap.getModel().getRequest() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getRequest, pageWrap.getModel().getRequest());
+        }
+        if (pageWrap.getModel().getRepose() != null) {
+            queryWrapper.lambda().like(InterfaceLog::getRepose, pageWrap.getModel().getRepose());
+        }
+        if (pageWrap.getModel().getSuccess() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getSuccess, pageWrap.getModel().getSuccess());
+        }
+        if (pageWrap.getModel().getPlat() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getPlat, pageWrap.getModel().getPlat());
+        }
+        if (pageWrap.getModel().getObjType() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getObjType, pageWrap.getModel().getObjType());
+        }
+        if (pageWrap.getModel().getObjId() != null) {
+            queryWrapper.lambda().eq(InterfaceLog::getObjId, pageWrap.getModel().getObjId());
+        }
+        queryWrapper.lambda().orderByDesc(InterfaceLog::getCreateDate);
+        return PageData.from(interfaceLogMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(InterfaceLog interfaceLog) {
+        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
+        return interfaceLogMapper.selectCount(wrapper);
+    }
+
+    @Override
+    public void clearThreeMonthLog() {
+         int days =15;
+         try {
+//             days = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HK_LOG_DEL_DAYS_LIMIT).getCode());
+         }catch (Exception e){}
+          interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
+                  .apply("to_days(create_date)+"+days+" < to_days(now())") );
+    }
+}
diff --git a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 1a1f3c0..1733407 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1,20 +1,35 @@
 package com.doumee.service.business.impl;
 
-import com.doumee.core.model.PageData;
-import com.doumee.core.model.PageWrap;
-import com.doumee.dao.business.model.Member;
-import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.service.business.MemberService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CasesMapper;
+import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.MultifileMapper;
+import com.doumee.dao.business.model.Cases;
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.Multifile;
+import com.doumee.service.business.MemberService;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 浼氬憳淇℃伅琛⊿ervice瀹炵幇
@@ -26,6 +41,18 @@
 
     @Autowired
     private MemberMapper memberMapper;
+
+    @Autowired
+    private CategoryMapper categoryMapper;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private CasesMapper casesMapper;
+
+    @Autowired
+    private MultifileMapper multifileMapper;
 
     @Override
     public Integer create(Member member) {
@@ -87,58 +114,147 @@
     @Override
     public PageData<Member> findPage(PageWrap<Member> pageWrap) {
         IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-               queryWrapper.lambda().eq(pageWrap.getModel().getId() != null,Member::getId, pageWrap.getModel().getId());
-               queryWrapper.lambda().eq(pageWrap.getModel().getDeleted() != null,Member::getDeleted, pageWrap.getModel().getDeleted());
-               queryWrapper.lambda().eq(pageWrap.getModel().getCreateUser() != null,Member::getCreateUser, pageWrap.getModel().getCreateUser());
-             if (pageWrap.getModel().getId() != null) {
-                  queryWrapper.lambda().ge(Member::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
-                  queryWrapper.lambda().le(Member::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
-             }
-               queryWrapper.lambda().eq(pageWrap.getModel().getUpdateUser() != null,Member::getUpdateUser, pageWrap.getModel().getUpdateUser());
-             if (pageWrap.getModel().getId() != null) {
-                  queryWrapper.lambda().ge(Member::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
-                  queryWrapper.lambda().le(Member::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
-             }
-               queryWrapper.lambda().eq(pageWrap.getModel().getRemark() != null,Member::getRemark, pageWrap.getModel().getRemark());
-               queryWrapper.lambda().eq(pageWrap.getModel().getImgurl() != null,Member::getImgurl, pageWrap.getModel().getImgurl());
-               queryWrapper.lambda().eq(pageWrap.getModel().getDingdingId() != null,Member::getDingdingId, pageWrap.getModel().getDingdingId());
-               queryWrapper.lambda().eq(pageWrap.getModel().getPhone() != null,Member::getPhone, pageWrap.getModel().getPhone());
-               queryWrapper.lambda().eq(pageWrap.getModel().getName() != null,Member::getName, pageWrap.getModel().getName());
-               queryWrapper.lambda().eq(pageWrap.getModel().getSex() != null,Member::getSex, pageWrap.getModel().getSex());
-               queryWrapper.lambda().eq(pageWrap.getModel().getJobYear() != null,Member::getJobYear, pageWrap.getModel().getJobYear());
-               queryWrapper.lambda().eq(pageWrap.getModel().getPositon() != null,Member::getPositon, pageWrap.getModel().getPositon());
-               queryWrapper.lambda().eq(pageWrap.getModel().getZhanquIds() != null,Member::getZhanquIds, pageWrap.getModel().getZhanquIds());
-               queryWrapper.lambda().eq(pageWrap.getModel().getBustypeIds() != null,Member::getBustypeIds, pageWrap.getModel().getBustypeIds());
-               queryWrapper.lambda().eq(pageWrap.getModel().getLevelId() != null,Member::getLevelId, pageWrap.getModel().getLevelId());
-               queryWrapper.lambda().eq(pageWrap.getModel().getStatus() != null,Member::getStatus, pageWrap.getModel().getStatus());
-               queryWrapper.lambda().eq(pageWrap.getModel().getFee() != null,Member::getFee, pageWrap.getModel().getFee());
-               queryWrapper.lambda().eq(pageWrap.getModel().getServeNum() != null,Member::getServeNum, pageWrap.getModel().getServeNum());
-               queryWrapper.lambda().eq(pageWrap.getModel().getType() != null,Member::getType, pageWrap.getModel().getType());
-               queryWrapper.lambda().eq(pageWrap.getModel().getContent() != null,Member::getContent, pageWrap.getModel().getContent());
-             if (pageWrap.getModel().getId() != null) {
-                  queryWrapper.lambda().ge(Member::getLoginDate, Utils.Date.getStart(pageWrap.getModel().getLoginDate()));
-                  queryWrapper.lambda().le(Member::getLoginDate, Utils.Date.getEnd(pageWrap.getModel().getLoginDate()));
-             }
-               queryWrapper.lambda().eq(pageWrap.getModel().getLoginCount() != null,Member::getLoginCount, pageWrap.getModel().getLoginCount());
-               queryWrapper.lambda().eq(pageWrap.getModel().getSortnum() != null,Member::getSortnum, pageWrap.getModel().getSortnum());
-               queryWrapper.lambda().eq(pageWrap.getModel().getUsername() != null,Member::getUsername, pageWrap.getModel().getUsername());
-               queryWrapper.lambda().eq(pageWrap.getModel().getAddType() != null,Member::getAddType, pageWrap.getModel().getAddType());
-               queryWrapper.lambda().eq(pageWrap.getModel().getImportId() != null,Member::getImportId, pageWrap.getModel().getImportId());
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        Member model = pageWrap.getModel();
+        queryWrapper.selectAll(Member.class)
+                .select(" c1.NAME ", Member::getPromotionName)
+                .select(" c2.NAME ", Member::getLevelName)
+                .leftJoin(" category c1 on t.POSITON = c1.id ")
+                .leftJoin(" category c2 on t.LEVEL_ID = c2.id ")
+                .apply(Objects.nonNull(model.getBustypeIds())," find_in_set( '["+model.getBustypeIds()+"]', t.BUSTYPE_IDS ) ")
+                .like(StringUtils.isNotBlank(model.getName()),Member::getName, model.getName())
+                .eq(Objects.nonNull(model.getStatus()),Member::getStatus, model.getStatus())
+                .orderByAsc(Objects.isNull(model.getOrderByType()),"c2.DETAIL")
+                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.ZERO),Member::getFee)
+                .orderByAsc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.ONE),Member::getFee)
+                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.TWO),"c2.DETAIL")
+                .orderByAsc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.THREE),"c2.DETAIL")
+                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.FOUR),Member::getServeNum)
+        ;
+        if(StringUtils.isNotBlank(model.getFieldIds())){
+            String [] fieldIds = model.getFieldIds().split(",");
+            for (String s:fieldIds) {
+                queryWrapper.apply("find_in_set( '["+s+"]' , t.FIELD_IDS )");
             }
         }
-        return PageData.from(memberMapper.selectPage(page, queryWrapper));
+        if (StringUtils.isNotBlank(model.getQueryZQCode())) {
+            Category zhanqu = categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
+                    .eq(Category::getDeleted,Constants.ZERO)
+                    .eq(Category::getStatus,Constants.ZERO)
+                    .eq(Category::getDetail,model.getQueryZQCode())
+                    .last(" limit 1")
+            );
+            if(Objects.nonNull(zhanqu)){
+                queryWrapper.apply(" find_in_set( '["+zhanqu.getId()+"]', t.ZHANQU_IDS ) ");
+            }
+        }
+        IPage<Member> memberIPage  = memberMapper.selectJoinPage(page, Member.class, new MPJLambdaWrapper<>());
+        if(CollectionUtils.isNotEmpty(memberIPage.getRecords())){
+            List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                    .eq(Category::getDeleted, Constants.ZERO)
+                    .eq(Category::getType,Constants.TWO)
+                    .orderByAsc(Category::getSortnum)
+            );
+            String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode() +
+                    systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
+            String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
+            for (Member member:memberIPage.getRecords()) {
+                if(CollectionUtils.isNotEmpty(categoryList)){
+                    dealMemberField(member,categoryList);
+                }
+                member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(path + member.getImgurl()):"");
+                if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(model.getQueryUserRole())
+                || !roleConfig.contains(model.getQueryUserRole())){
+                    member.setFee(null);
+                }
+               if(member.getJobYear()!=null){
+                    member.setWorkYears(DateUtil.getCurrentYear( ) - member.getJobYear()+1);
+                }
+            }
+        }
+        return PageData.from(memberIPage);
     }
+
+
+    @Override
+    public Member findDetailById(Integer id,String queryUserRole) {
+        Member member = memberMapper.selectJoinOne(Member.class, new MPJLambdaWrapper<Member>()
+                .selectAll(Member.class)
+                .select(" c1.NAME ", Member::getPromotionName)
+                .select(" c2.NAME ", Member::getLevelName)
+                .select(" TIMESTAMPDIFF(YEAR, CONCAT(t.JOB_YEAR , '-01-01'), now()) ",Member::getWorkYears)
+                .leftJoin(" category c1 on t.POSITON = c1.id ")
+                .leftJoin(" category c2 on t.LEVEL_ID = c2.id ")
+                .eq(Member::getId, id)
+                .last(" limit 1 "));
+       if(Objects.isNull(member)){
+           throw new BusinessException(ResponseStatus.DATA_EMPTY);
+       }
+       if(StringUtils.isNotBlank(member.getFieldIds())){
+           member.setFieldList(
+                   categoryMapper.selectList(new QueryWrapper<Category>().lambda()
+                           .eq(Category::getDeleted, Constants.ZERO)
+                           .eq(Category::getType,Constants.TWO)
+                           .apply(" find_in_set(CONCAT('[',id,']'),'"+member.getFieldIds()+"') ")
+                           .orderByAsc(Category::getSortnum)
+            )
+           );
+       }
+
+        String resourcePath = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode();
+        String path =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
+        String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
+        member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(resourcePath  + path + member.getImgurl()):"");
+        List<Cases> casesList = casesMapper.selectList(new QueryWrapper<Cases>().lambda()
+                .eq(Cases::getMemberId,member.getId())
+                .eq(Cases::getDeleted,Constants.ZERO)
+                .orderByDesc(Cases::getId)
+        );
+        if(CollectionUtils.isNotEmpty(casesList)){
+            String casePath =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CASES_FILES).getCode();
+            for (Cases cases:casesList) {
+                List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
+                        .eq(Multifile::getObjId,cases.getId())
+                        .eq(Multifile::getObjType,Constants.ONE)
+                        .eq(Multifile::getIsdeleted,Constants.ZERO)
+                        .orderByDesc(Multifile::getId)
+                );
+                multifileList.forEach(multifile -> {
+                    multifile.setUrl(StringUtils.isNotBlank(multifile.getFileurl())?(resourcePath  + casePath + multifile.getFileurl()):"");
+                });
+            }
+            member.setCasesList(casesList);
+        }
+        if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(queryUserRole)
+                || !roleConfig.contains(queryUserRole)){
+            member.setFee(null);
+        }
+        return member;
+    }
+
+
+
+
+    public void dealMemberField(Member member,List<Category> categoryList){
+        if(CollectionUtils.isNotEmpty(categoryList)){
+            return;
+        }
+        String fieldNames = "";
+        for (Category category:categoryList) {
+            if(member.getFieldIds().contains("["+category.getId()+"]")){
+                fieldNames = fieldNames + (StringUtils.isNotBlank(fieldNames)?",":"") + category.getName();
+            }
+        }
+        member.setFieldNames(fieldNames);
+    }
+
 
     @Override
     public long count(Member member) {
         QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
         return memberMapper.selectCount(wrapper);
     }
+
+
 }
diff --git a/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java b/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
index ba21070..8f1b81f 100644
--- a/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -10,6 +10,7 @@
 import com.doumee.service.system.SystemLoginLogService;
 import com.doumee.service.system.SystemLoginService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.UsernamePasswordToken;
@@ -27,6 +28,11 @@
 
     @Value("${project.version}")
     private String systemVersion;
+    /**
+     *   # 鐜锛岀敓浜х幆澧僷roduction锛屽紑鍙戠幆澧僤evelopment
+     */
+    @Value("${project.env}")
+    private String projectEnv;
 
     @Autowired
     private CaptchaService captchaService;
@@ -46,15 +52,17 @@
         loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
         loginLog.setOsInfo(Utils.User_Client.getOS(request));
         loginLog.setServerIp(Utils.Server.getIP());
-        // 鏍¢獙楠岃瘉鐮�
-        try {
-            captchaService.check(dto.getUuid(), dto.getCode());
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
-            loginLog.setSuccess(Boolean.FALSE);
-            systemLoginLogService.create(loginLog);
-            throw e;
+        if(StringUtils.equals(projectEnv,"development")){
+            // 鏍¢獙楠岃瘉鐮�
+            try {
+                captchaService.check(dto.getUuid(), dto.getCode());
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
+                loginLog.setSuccess(Boolean.FALSE);
+                systemLoginLogService.create(loginLog);
+                throw e;
+            }
         }
         // 鏍¢獙鐢ㄦ埛鍚嶅拰瀵嗙爜
         Subject subject = SecurityUtils.getSubject();
diff --git a/server/services/src/main/resources/application-dev.yml b/server/services/src/main/resources/application-dev.yml
index a93f2ff..492ab94 100644
--- a/server/services/src/main/resources/application-dev.yml
+++ b/server/services/src/main/resources/application-dev.yml
@@ -69,9 +69,6 @@
     username: admin
     password: 111111
 
-qiwei:
-  serviceurl: https://qyapi.weixin.qq.com
-
 aes:
   encrypt:
     open: true # 鏄惁寮�鍚姞瀵� true  or  false
@@ -83,5 +80,10 @@
 upload:
   type: ftp
 
+project:
+  # 鐜锛岀敓浜х幆澧僷roduction锛屽紑鍙戠幆澧僤evelopment
+  env: development
+  # 妯″紡锛宼esting娴嬭瘯妯″紡
+  mode: testing
 
 
diff --git a/server/services/src/main/resources/application-pro.yml b/server/services/src/main/resources/application-pro.yml
index 1e4659f..a8a65fe 100644
--- a/server/services/src/main/resources/application-pro.yml
+++ b/server/services/src/main/resources/application-pro.yml
@@ -1,9 +1,9 @@
 spring:
   # 鏁版嵁婧愰厤缃�
   datasource:
-    url: jdbc:mysql://b66cc1a382964a6a9d46a522f2dfe672in01.internal.cn-south-1.mysql.rds.myhuaweicloud.com:3306/jinkuai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://192.168.0.211:3306/zbom_dianjiang?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
     username: root
-    password: Jinkuai!@#$%^
+    password: Doumee@168
     driver-class-name: com.mysql.cj.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource
   redis:
@@ -49,46 +49,12 @@
     enable: true
     username: admin
     password: doumee@168
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-wx:
-  pay:
-    #鏈嶅姟鍟�---------start------- 鍙傛暟璇﹁В鍦板潃 https://pay.weixin.qq.com/doc/v3/partner/4013080340
-    mchId: 1700071922    #鏈嶅姟鍟嗗湪寰俊鏀粯渚х殑鍞竴韬唤鏍囪瘑
-    appId: wx6cc1087ca79db7f6    #鏈嶅姟鍟嗗湪寰俊寮�鏀惧钩鍙帮紙绉诲姩搴旂敤锛夋垨鍏紬骞冲彴锛堝叕浼楀彿/灏忕▼搴忥級涓婄敵璇风殑涓�涓敮涓�鏍囪瘑
-    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #鏈嶅姟鍟嗚瘉涔﹀簭鍒楀彿
-    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
-    notifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxPayNotify
-    refundNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxRefundNotify
-    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
-    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
-    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
-    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #鍟嗘埛鏀粯鍏挜
-
-    #鏈嶅姟鍟�-------------end---
-
-    #鍟嗘埛淇℃伅
-    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
-    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #鍟嗘埛鏀粯鍏挜
-    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #鍟嗘埛绉侀挜
-    wechatNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wechat/transferNotify #鍟嗘埛杞处鍥炶皟鍦板潃
-    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-
-
-    existsSub: 1
-    appSecret:
-    #瀛愬晢鎴�------------start----
-    subMchId: 1723326069    #瀛愬晢鎴峰彿
-    subAppId: wx332441ae5b12be7d #灏忕▼搴廼d
-    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #灏忕▼搴忕閽�
-    #瀛愬晢鎴�------------end----
-    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    typeId: jinkuai
-
 upload:
   type: blob
 
-qiwei:
-  serviceurl: https://wecom-qyapi.unilever-china.com/
\ No newline at end of file
+
+project:
+  # 鐜锛岀敓浜х幆澧僷roduction锛屽紑鍙戠幆澧僤evelopment
+  env: production
+  # 妯″紡锛宼esting娴嬭瘯妯″紡
+  mode: production
\ No newline at end of file
diff --git a/server/services/src/main/resources/application-test.yml b/server/services/src/main/resources/application-test.yml
index cbd34a7..d4f309f 100644
--- a/server/services/src/main/resources/application-test.yml
+++ b/server/services/src/main/resources/application-test.yml
@@ -69,48 +69,13 @@
     username: admin
     password: 111111
 
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-wx:
-  pay:
-    #鏈嶅姟鍟�---------start------- 鍙傛暟璇﹁В鍦板潃 https://pay.weixin.qq.com/doc/v3/partner/4013080340
-    mchId: 1700071922    #鏈嶅姟鍟嗗湪寰俊鏀粯渚х殑鍞竴韬唤鏍囪瘑
-    appId: wx6cc1087ca79db7f6    #鏈嶅姟鍟嗗湪寰俊寮�鏀惧钩鍙帮紙绉诲姩搴旂敤锛夋垨鍏紬骞冲彴锛堝叕浼楀彿/灏忕▼搴忥級涓婄敵璇风殑涓�涓敮涓�鏍囪瘑
-    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #鏈嶅姟鍟嗚瘉涔﹀簭鍒楀彿
-    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
-    notifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxPayNotify
-    refundNotifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxRefundNotify
-    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
-    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
-    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
-    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #鍟嗘埛鏀粯鍏挜
-
-    #鏈嶅姟鍟�-------------end---
-
-    #鍟嗘埛淇℃伅
-    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
-    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #鍟嗘埛/骞冲彴鏀粯鍏挜id
-    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #鍟嗘埛鏀粯鍏挜
-    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #鍟嗘埛绉侀挜
-    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #鍟嗘埛杞处鍥炶皟鍦板潃
-    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
-
-
-    existsSub: 1
-    appSecret:
-    #瀛愬晢鎴�------------start----
-    subMchId: 1723326069    #瀛愬晢鎴峰彿
-    subAppId: wx332441ae5b12be7d #灏忕▼搴廼d
-    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #灏忕▼搴忕閽�
-    #瀛愬晢鎴�------------end----
-    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    typeId: jinkuai
 
 upload:
   type: blob
 
-qiwei:
-  serviceurl: https://qyapi.weixin.qq.com
\ No newline at end of file
+
+project:
+  # 鐜锛岀敓浜х幆澧僷roduction锛屽紑鍙戠幆澧僤evelopment
+  env: production
+  # 妯″紡锛宼esting娴嬭瘯妯″紡
+  mode: testing
\ No newline at end of file
diff --git a/server/web/src/main/java/com/doumee/DJWebApplication.java b/server/web/src/main/java/com/doumee/DJWebApplication.java
index 92fb2f4..59dae4c 100644
--- a/server/web/src/main/java/com/doumee/DJWebApplication.java
+++ b/server/web/src/main/java/com/doumee/DJWebApplication.java
@@ -22,9 +22,4 @@
         ApplicationContext context = SpringApplication.run(DJWebApplication.class);
         context.getEnvironment();
     }
-
-//    @Override
-//    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
-//        return builder.sources(JKWebApplication.class) ;
-//    }
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/ApiController.java b/server/web/src/main/java/com/doumee/api/web/ApiController.java
index c9eb82a..b6e10cb 100644
--- a/server/web/src/main/java/com/doumee/api/web/ApiController.java
+++ b/server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -3,6 +3,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.config.jwt.JwtTokenUtil;
 import com.doumee.dao.business.model.Member;
+import com.doumee.dao.vo.WebLoginUserVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.request.RequestContextHolder;
@@ -39,10 +40,10 @@
      * 鑾峰彇鐧诲綍鐢ㄦ埛瀵硅薄淇℃伅
      * @return
      */
-    protected Member getMemberResponse(){
+    protected WebLoginUserVO getMemberResponse(){
         Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_INFO);
         if(obj != null){
-            return JSONObject.parseObject(obj.toString(),Member.class);
+            return JSONObject.parseObject(obj.toString(), WebLoginUserVO.class);
         }
         return null;
     }
diff --git a/server/web/src/main/java/com/doumee/api/web/LoginController.java b/server/web/src/main/java/com/doumee/api/web/LoginController.java
new file mode 100644
index 0000000..e4a8040
--- /dev/null
+++ b/server/web/src/main/java/com/doumee/api/web/LoginController.java
@@ -0,0 +1,161 @@
+package com.doumee.api.web;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.config.annotation.LoginRequired;
+import com.doumee.config.jwt.JwtTokenUtil;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.annotation.trace.Trace;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.business.dto.LoginRequestNewParam;
+import com.doumee.dao.business.model.Category;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.system.model.SystemJob;
+import com.doumee.dao.vo.WebLoginUserVO;
+import com.doumee.service.business.CategoryService;
+import com.doumee.service.business.MemberService;
+import com.sun.deploy.net.HttpUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2025/07/09 12:00
+ */
+@Api(tags = "web鐧诲綍鐩稿叧鎺ュ彛")
+@Trace(exclude = true)
+@RestController
+@RequestMapping("/web/login")
+@Slf4j
+public class LoginController extends ApiController {
+
+    @Autowired
+    private CategoryService categoryService;
+
+    @Autowired
+    private JwtTokenUtil jwtTokenUtil;
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private MemberService memberService;
+
+
+    @ApiOperation("UK鍗曠偣鐧诲綍")
+    @GetMapping("/ukLogin")
+    public void ukLogin(String tick, Object obj, HttpServletRequest request, HttpServletResponse response) throws Exception  {
+        LoginRequestNewParam requestParam = new LoginRequestNewParam();
+        /*// UK_ERROR_URL = "http://u.zhibang.com/sso/web/token/error";
+        String errorUrl =systemDictDataBiz.queryByCode(Constants.ZBOM_PARAM,Constants.ZBOM_UK_ERROR_URL).getCode();
+        try {
+            log.error("璇锋眰鍙傛暟TICK鏈�鍘熷===========锛�" + tick);
+            JSONObject urlParams = new JSONObject();
+            log.info("璇锋眰鍙傛暟锛�" + JSON.toJSONString(urlParams));
+            //TICKET_LOGIN_TEST = "http://testsso.zhibang.com:8080/esc-idm/api/v1/getUserInfo";
+            //TICKET_LOGIN = "https://sso.zbom.com/esc-idm/api/v1/getUserInfo";
+            String url  = systemDictDataBiz.queryByCode(Constants.ZBOM_PARAM,Constants.ZBOM_TICKET_LOGIN_URL).getCode() + "?tick=" +  URLEncoder.encode(tick,Constants.UTF);
+            String post =  HttpsUtil.get(url,true);
+            log.info("杩斿洖鍙傛暟锛�" + post);
+            JSONObject json = JSONObject.parseObject(post);
+            if (StringUtils.equals(json.getString("code"), "0")) {
+                JSONObject userInfo = json.getJSONObject("data");
+                requestParam = JSONObject.toJavaObject(userInfo, LoginRequestNewParam.class);
+            } else {
+                log.error("妗堜緥搴撶郴缁熷崟鐐圭櫥褰曞け璐� 閿欒鍘熷洜鑾峰彇tick澶辫触" + json.getString("message"));
+                response.sendRedirect(errorUrl + "?title=" + enCode("鐧婚檰閿欒") + "&msg="+ enCode(json.getString("message")));
+                return;
+            }
+        } catch (Exception e) {
+            log.error("ticket鎺ュ彛璇锋眰閿欒锛�" + e.getMessage());
+            response.sendRedirect(errorUrl + "?title=" + enCode("鐧婚檰閿欒") + "&msg=" + enCode("绯荤粺绻佸繖锛岃绋嶅悗閲嶈瘯~"));
+            return;
+        }*/
+        requestParam.setRediUrl("http://localhost:10087/#/login");
+        WebLoginUserVO loginUserVO = new WebLoginUserVO();
+        loginUserVO.setId("123");
+        loginUserVO.setRoleType("admin");
+        loginUserVO.setZhanqu("1");
+        String token = jwtTokenUtil.generateToken(loginUserVO);
+        response.sendRedirect(requestParam.getRediUrl()+"?token="+token);
+    }
+
+
+    private String enCode(String string) {
+        // TODO Auto-generated method stub
+        String str = "";
+        try {
+            str = java.net.URLEncoder.encode(string, "utf-8");
+        } catch (UnsupportedEncodingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    @LoginRequired
+    @ApiOperation("鑰佸笀鍒嗛〉鏌ヨ")
+    @PostMapping("/memberPage")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<PageData<Member>> memberPage(@RequestBody PageWrap<Member> pageWrap) {
+        WebLoginUserVO loginUserVO = this.getMemberResponse();
+        pageWrap.getModel().setQueryUserRole(loginUserVO.getRoleType());
+        pageWrap.getModel().setQueryZQCode(loginUserVO.getZhanqu());
+        return ApiResponse.success(memberService.findPage(pageWrap));
+    }
+
+
+
+    @LoginRequired
+    @ApiOperation("鑰佸笀璇︽儏")
+    @GetMapping("/memberDetail")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<Member> memberPage(@RequestParam Integer id) {
+        WebLoginUserVO loginUserVO = this.getMemberResponse();
+        return ApiResponse.success(memberService.findDetailById(id,loginUserVO.getRoleType()));
+    }
+
+
+    @LoginRequired
+    @ApiOperation("鍒嗙被淇℃伅鏌ヨ")
+    @GetMapping("/categoryList")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true),
+    })
+    public ApiResponse<List<Category>> categoryList(@RequestParam Integer type) {
+        return ApiResponse.success(categoryService.getCategoryList(type));
+    }
+
+
+
+}
diff --git a/server/web/src/main/resources/application.yml b/server/web/src/main/resources/application.yml
index 28dea6f..04b0236 100644
--- a/server/web/src/main/resources/application.yml
+++ b/server/web/src/main/resources/application.yml
@@ -3,16 +3,12 @@
   port: 10011
 # 椤圭洰淇℃伅閰嶇疆
 project:
-  name: 杩戝揩
+  name: 蹇楅偊鐐瑰皢
   version: 1.0.0
-  # 鐜锛岀敓浜х幆澧僷roduction锛屽紑鍙戠幆澧僤evelopment
-  env: development
-  # 妯″紡锛宼esting娴嬭瘯妯″紡
-  mode: testing
 
 spring:
   profiles:
-    active: pro
+    active: dev
   # JSON杩斿洖閰嶇疆
   jackson:
     # 榛樿鏃跺尯

--
Gitblit v1.9.3