From d72cdefc313e6000c5f7f0ad37686fb63a7fbdbe Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期三, 10 七月 2024 16:53:04 +0800
Subject: [PATCH] 提交

---
 server/service/src/main/java/com/doumee/service/business/SegmentsService.java                 |    3 
 admin/src/components/business/OperaFcodeImportWindow.vue                                      |    3 
 server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class      |    0 
 admin/package-lock.json                                                                       |  416 +++++++
 admin/src/components/system/dict/OperaDictDataWindow.vue                                      |   84 -
 admin/src/components/business/OperaCategoryImportWindow.vue                                   |   82 +
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateShopModel.java                 |  107 ++
 server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java                     |    6 
 server/service/src/main/java/com/doumee/core/utils/Constants.java                             |   42 
 server/service/src/main/java/com/doumee/service/business/InitService.java                     |    9 
 admin/src/api/business/segments.js                                                            |    3 
 admin/src/components/common/RichEditor.vue                                                    |  431 +++++--
 server/service/src/main/java/com/doumee/service/business/ShopService.java                     |    1 
 server/service/src/main/java/com/doumee/dao/business/model/Users.java                         |   17 
 admin/src/filters/index.js                                                                    |    6 
 server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java            |   37 
 server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class                     |    0 
 admin/package.json                                                                            |    5 
 server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class        |    0 
 server/service/service.iml                                                                    |    1 
 server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java               |    2 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamCategoryModel.java                  |   92 +
 server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java                   |   35 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamScodeModel.java                     |   68 +
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUserJobModel.java                   |   26 
 server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java            |  307 +++++
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUserOrgModel.java                   |   42 
 admin/src/api/business/shop.js                                                                |    3 
 server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class          |    0 
 server/service/src/main/java/com/doumee/dao/admin/request/CategoryImport.java                 |   46 
 server/service/target/classes/com/doumee/core/utils/Constants.class                           |    0 
 server/service/src/main/java/com/doumee/dao/business/vo/UnitCodeVo.java                       |   16 
 server/service/target/classes/com/doumee/dao/business/model/Segments.class                    |    0 
 server/zbomyoujia.iml                                                                         |    1 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java            |    5 
 server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java                     |    5 
 admin/public/template/category.xlsx                                                           |    0 
 server/admin/src/main/java/com/doumee/api/business/ShopController.java                        |   26 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamFcodeModel.java                     |   96 +
 server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class                 |    0 
 admin/src/views/business/segments.vue                                                         |   94 -
 server/admin/target/classes/com/doumee/api/business/SegmentsController.class                  |    0 
 server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java |   13 
 server/admin/target/classes/com/doumee/api/business/ShopController.class                      |    0 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java                          |   34 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamShopModel.java                      |   44 
 server/service/src/main/java/com/doumee/dao/business/model/Segments.java                      |   10 
 server/service/src/main/java/com/doumee/dao/business/model/Shop.java                          |    7 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUserTypeModel.java                  |   19 
 admin/src/components/business/OperaShopImportWindow.vue                                       |    2 
 server/admin/src/main/java/com/doumee/api/business/SegmentsController.java                    |    9 
 server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java                            |    3 
 server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java     |   32 
 server/service/target/classes/com/doumee/core/utils/Constants$Status.class                    |    0 
 server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class                       |    0 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java                 |  374 +++++++
 server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class   |    0 
 server/admin/src/main/java/com/doumee/api/business/PushController.java                        |   77 +
 server/web/web.iml                                                                            |    1 
 admin/src/views/business/shop.vue                                                             |   10 
 server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java                           |   17 
 /dev/null                                                                                     |   62 -
 server/service/target/classes/com/doumee/service/business/ShopService.class                   |    0 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateUserModel.java                 |  120 ++
 server/pom.xml                                                                                |    6 
 server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java        |   32 
 server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java                       |    1 
 admin/src/views/business/shopTree.vue                                                         |    7 
 server/admin/admin.iml                                                                        |    1 
 admin/src/components/system/dict/DictDataManagerWindow.vue                                    |   40 
 server/service/src/main/java/com/doumee/biz/zbom/model/IamUserRoleModel.java                  |   26 
 71 files changed, 2,638 insertions(+), 426 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 6efb65e..c33f739 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -1065,6 +1065,22 @@
         "regenerator-runtime": "^0.13.4"
       }
     },
+    "@babel/runtime-corejs3": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.7.tgz",
+      "integrity": "sha512-eytSX6JLBY6PVAeQa2bFlDx/7Mmln/gaEpsit5a3WEvjGfiIytEsgAwuIXCPM0xvw0v0cJn3ilq0/TvXrW0kgA==",
+      "requires": {
+        "core-js-pure": "^3.30.2",
+        "regenerator-runtime": "^0.14.0"
+      },
+      "dependencies": {
+        "regenerator-runtime": {
+          "version": "0.14.1",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+          "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+        }
+      }
+    },
     "@babel/template": {
       "version": "7.12.13",
       "resolved": "https://registry.npm.taobao.org/@babel/template/download/@babel/template-7.12.13.tgz",
@@ -1295,6 +1311,11 @@
       "integrity": "sha1-pTUV2yXYA4N0OBtzryC7Ty5QjYc=",
       "dev": true
     },
+    "@transloadit/prettier-bytes": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
+      "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA=="
+    },
     "@types/anymatch": {
       "version": "1.3.1",
       "resolved": "https://registry.npm.taobao.org/@types/anymatch/download/@types/anymatch-1.3.1.tgz?cache=0&sync_timestamp=1613378060592&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fanymatch%2Fdownload%2F%40types%2Fanymatch-1.3.1.tgz",
@@ -1329,6 +1350,11 @@
         "@types/express-serve-static-core": "*",
         "@types/node": "*"
       }
+    },
+    "@types/event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ=="
     },
     "@types/express": {
       "version": "4.17.11",
@@ -1523,6 +1549,53 @@
           "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
           "dev": true
         }
+      }
+    },
+    "@uppy/companion-client": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
+      "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
+      "requires": {
+        "@uppy/utils": "^4.1.2",
+        "namespace-emitter": "^2.0.1"
+      }
+    },
+    "@uppy/core": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
+      "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
+      "requires": {
+        "@transloadit/prettier-bytes": "0.0.7",
+        "@uppy/store-default": "^2.1.1",
+        "@uppy/utils": "^4.1.3",
+        "lodash.throttle": "^4.1.1",
+        "mime-match": "^1.0.2",
+        "namespace-emitter": "^2.0.1",
+        "nanoid": "^3.1.25",
+        "preact": "^10.5.13"
+      }
+    },
+    "@uppy/store-default": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
+      "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ=="
+    },
+    "@uppy/utils": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
+      "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
+      "requires": {
+        "lodash.throttle": "^4.1.1"
+      }
+    },
+    "@uppy/xhr-upload": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
+      "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
+      "requires": {
+        "@uppy/companion-client": "^2.2.2",
+        "@uppy/utils": "^4.1.2",
+        "nanoid": "^3.1.25"
       }
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
@@ -1919,6 +1992,88 @@
       "resolved": "https://registry.npm.taobao.org/@vue/web-component-wrapper/download/@vue/web-component-wrapper-1.3.0.tgz",
       "integrity": "sha1-trQKdiVCnSvXwigd26YB7QXcfxo=",
       "dev": true
+    },
+    "@wangeditor/basic-modules": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
+      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
+      "requires": {
+        "is-url": "^1.2.4"
+      }
+    },
+    "@wangeditor/code-highlight": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
+      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
+      "requires": {
+        "prismjs": "^1.23.0"
+      }
+    },
+    "@wangeditor/core": {
+      "version": "1.1.19",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
+      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
+      "requires": {
+        "@types/event-emitter": "^0.3.3",
+        "event-emitter": "^0.3.5",
+        "html-void-elements": "^2.0.0",
+        "i18next": "^20.4.0",
+        "scroll-into-view-if-needed": "^2.2.28",
+        "slate-history": "^0.66.0"
+      }
+    },
+    "@wangeditor/editor": {
+      "version": "5.1.23",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
+      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
+      "requires": {
+        "@uppy/core": "^2.1.1",
+        "@uppy/xhr-upload": "^2.0.3",
+        "@wangeditor/basic-modules": "^1.1.7",
+        "@wangeditor/code-highlight": "^1.0.3",
+        "@wangeditor/core": "^1.1.19",
+        "@wangeditor/list-module": "^1.0.5",
+        "@wangeditor/table-module": "^1.1.4",
+        "@wangeditor/upload-image-module": "^1.0.2",
+        "@wangeditor/video-module": "^1.1.4",
+        "dom7": "^3.0.0",
+        "is-hotkey": "^0.2.0",
+        "lodash.camelcase": "^4.3.0",
+        "lodash.clonedeep": "^4.5.0",
+        "lodash.debounce": "^4.0.8",
+        "lodash.foreach": "^4.5.0",
+        "lodash.isequal": "^4.5.0",
+        "lodash.throttle": "^4.1.1",
+        "lodash.toarray": "^4.4.0",
+        "nanoid": "^3.2.0",
+        "slate": "^0.72.0",
+        "snabbdom": "^3.1.0"
+      }
+    },
+    "@wangeditor/editor-for-vue": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
+      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
+    },
+    "@wangeditor/list-module": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
+      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
+    },
+    "@wangeditor/table-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
+      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
+    },
+    "@wangeditor/upload-image-module": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
+      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
+    },
+    "@wangeditor/video-module": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
+      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
     },
     "@webassemblyjs/ast": {
       "version": "1.9.0",
@@ -3717,6 +3872,11 @@
         }
       }
     },
+    "compute-scroll-into-view": {
+      "version": "1.0.20",
+      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+      "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz",
@@ -4025,6 +4185,11 @@
           "dev": true
         }
       }
+    },
+    "core-js-pure": {
+      "version": "3.37.1",
+      "resolved": "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.37.1.tgz",
+      "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA=="
     },
     "core-util-is": {
       "version": "1.0.2",
@@ -4358,6 +4523,15 @@
       "resolved": "https://registry.npm.taobao.org/cyclist/download/cyclist-1.0.1.tgz",
       "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
       "dev": true
+    },
+    "d": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/d/-/d-1.0.2.tgz",
+      "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
+      "requires": {
+        "es5-ext": "^0.10.64",
+        "type": "^2.7.2"
+      }
     },
     "dashdash": {
       "version": "1.14.1",
@@ -4778,6 +4952,14 @@
         }
       }
     },
+    "dom7": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
+      "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
+      "requires": {
+        "ssr-window": "^3.0.0-alpha.1"
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npm.taobao.org/domain-browser/download/domain-browser-1.2.0.tgz?cache=0&sync_timestamp=1604239998047&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomain-browser%2Fdownload%2Fdomain-browser-1.2.0.tgz",
@@ -5077,6 +5259,36 @@
         "is-callable": "^1.1.4",
         "is-date-object": "^1.0.1",
         "is-symbol": "^1.0.2"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.64",
+      "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz",
+      "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "esniff": "^2.0.1",
+        "next-tick": "^1.1.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz",
+      "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
+      "requires": {
+        "d": "^1.0.2",
+        "ext": "^1.7.0"
       }
     },
     "escalade": {
@@ -5596,6 +5808,17 @@
       "integrity": "sha1-MOvR73wv3/AcOk8VEESvJfqwUj4=",
       "dev": true
     },
+    "esniff": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz",
+      "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
+      "requires": {
+        "d": "^1.0.1",
+        "es5-ext": "^0.10.62",
+        "event-emitter": "^0.3.5",
+        "type": "^2.7.2"
+      }
+    },
     "espree": {
       "version": "6.2.1",
       "resolved": "https://registry.npm.taobao.org/espree/download/espree-6.2.1.tgz?cache=0&sync_timestamp=1607143966756&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-6.2.1.tgz",
@@ -5672,6 +5895,15 @@
       "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "dev": true
+    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
     },
     "event-pubsub": {
       "version": "4.3.0",
@@ -5834,6 +6066,14 @@
           "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=",
           "dev": true
         }
+      }
+    },
+    "ext": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
+      "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
+      "requires": {
+        "type": "^2.7.2"
       }
     },
     "extend": {
@@ -6778,6 +7018,11 @@
       "integrity": "sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=",
       "dev": true
     },
+    "html-void-elements": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
+      "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A=="
+    },
     "html-webpack-plugin": {
       "version": "3.2.0",
       "resolved": "https://registry.npm.taobao.org/html-webpack-plugin/download/html-webpack-plugin-3.2.0.tgz?cache=0&sync_timestamp=1615296040860&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtml-webpack-plugin%2Fdownload%2Fhtml-webpack-plugin-3.2.0.tgz",
@@ -6993,6 +7238,14 @@
       "integrity": "sha1-xbHNFPUK6uCatsWf5jujOV/k36M=",
       "dev": true
     },
+    "i18next": {
+      "version": "20.6.1",
+      "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
+      "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
+      "requires": {
+        "@babel/runtime": "^7.12.0"
+      }
+    },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&sync_timestamp=1594184264130&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
@@ -7028,6 +7281,11 @@
       "resolved": "https://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz?cache=0&sync_timestamp=1590809289115&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fignore%2Fdownload%2Fignore-4.0.6.tgz",
       "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=",
       "dev": true
+    },
+    "immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="
     },
     "import-cwd": {
       "version": "2.1.0",
@@ -7510,6 +7768,11 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-hotkey": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
+      "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="
+    },
     "is-negative-zero": {
       "version": "2.0.1",
       "resolved": "https://registry.npm.taobao.org/is-negative-zero/download/is-negative-zero-2.0.1.tgz?cache=0&sync_timestamp=1607123080624&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-negative-zero%2Fdownload%2Fis-negative-zero-2.0.1.tgz",
@@ -7649,6 +7912,11 @@
       "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
+    },
+    "is-url": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
+      "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
     },
     "is-utf8": {
       "version": "0.2.1",
@@ -8416,17 +8684,36 @@
       "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz",
       "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw="
     },
+    "lodash.camelcase": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+      "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+    },
     "lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npm.taobao.org/lodash.debounce/download/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
-      "dev": true
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
     },
     "lodash.defaultsdeep": {
       "version": "4.6.1",
       "resolved": "https://registry.npm.taobao.org/lodash.defaultsdeep/download/lodash.defaultsdeep-4.6.1.tgz",
       "integrity": "sha1-US6b1yHSctlOPTpjZT+hdRZ0HKY=",
       "dev": true
+    },
+    "lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ=="
+    },
+    "lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
     },
     "lodash.kebabcase": {
       "version": "4.1.1",
@@ -8445,6 +8732,16 @@
       "resolved": "https://registry.npm.taobao.org/lodash.memoize/download/lodash.memoize-4.1.2.tgz",
       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
       "dev": true
+    },
+    "lodash.throttle": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw=="
     },
     "lodash.transform": {
       "version": "4.6.0",
@@ -8835,6 +9132,14 @@
       "integrity": "sha1-jLMT5Zll08Bc+/iYkVomevRqM1w=",
       "dev": true
     },
+    "mime-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
+      "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
+      "requires": {
+        "wildcard": "^1.1.0"
+      }
+    },
     "mime-types": {
       "version": "2.1.30",
       "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.30.tgz",
@@ -9032,11 +9337,21 @@
         "thenify-all": "^1.0.0"
       }
     },
+    "namespace-emitter": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
+      "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g=="
+    },
     "nan": {
       "version": "2.14.2",
       "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz?cache=0&sync_timestamp=1602591684976&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.2.tgz",
       "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=",
       "dev": true
+    },
+    "nanoid": {
+      "version": "3.3.7",
+      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
     },
     "nanomatch": {
       "version": "1.2.13",
@@ -9074,6 +9389,11 @@
       "resolved": "https://registry.npm.taobao.org/neo-async/download/neo-async-2.6.2.tgz?cache=0&sync_timestamp=1594317434347&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fneo-async%2Fdownload%2Fneo-async-2.6.2.tgz",
       "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=",
       "dev": true
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
     },
     "nice-try": {
       "version": "1.0.5",
@@ -10611,6 +10931,11 @@
       "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=",
       "dev": true
     },
+    "preact": {
+      "version": "10.22.1",
+      "resolved": "https://registry.npmmirror.com/preact/-/preact-10.22.1.tgz",
+      "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A=="
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz",
@@ -10639,6 +10964,11 @@
         "lodash": "^4.17.20",
         "renderkid": "^2.0.4"
       }
+    },
+    "prismjs": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
+      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
     },
     "process": {
       "version": "0.11.10",
@@ -11632,6 +11962,14 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "scroll-into-view-if-needed": {
+      "version": "2.2.31",
+      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+      "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+      "requires": {
+        "compute-scroll-into-view": "^1.0.20"
+      }
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz",
@@ -11924,6 +12262,38 @@
       "integrity": "sha1-3lUoUaF1nfOo8gZTVEL17E3eq0Q=",
       "dev": true
     },
+    "slate": {
+      "version": "0.72.8",
+      "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
+      "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
+      "requires": {
+        "immer": "^9.0.6",
+        "is-plain-object": "^5.0.0",
+        "tiny-warning": "^1.0.3"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
+    "slate-history": {
+      "version": "0.66.0",
+      "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
+      "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
+      "requires": {
+        "is-plain-object": "^5.0.0"
+      },
+      "dependencies": {
+        "is-plain-object": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
+          "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+        }
+      }
+    },
     "slice-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz?cache=0&sync_timestamp=1618554953055&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslice-ansi%2Fdownload%2Fslice-ansi-2.1.0.tgz",
@@ -11942,6 +12312,11 @@
           "dev": true
         }
       }
+    },
+    "snabbdom": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz",
+      "integrity": "sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q=="
     },
     "snapdragon": {
       "version": "0.8.2",
@@ -12275,6 +12650,11 @@
         "safer-buffer": "^2.0.2",
         "tweetnacl": "~0.14.0"
       }
+    },
+    "ssr-window": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
+      "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA=="
     },
     "ssri": {
       "version": "6.0.2",
@@ -12826,6 +13206,11 @@
       "resolved": "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz",
       "integrity": "sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM="
     },
+    "tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
     "tiptap": {
       "version": "1.32.2",
       "resolved": "https://registry.npmjs.org/tiptap/-/tiptap-1.32.2.tgz",
@@ -13046,6 +13431,11 @@
       "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1581364203962&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz",
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "dev": true
+    },
+    "type": {
+      "version": "2.7.3",
+      "resolved": "https://registry.npmmirror.com/type/-/type-2.7.3.tgz",
+      "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
     },
     "type-check": {
       "version": "0.3.2",
@@ -13681,6 +14071,23 @@
       "version": "2.2.8",
       "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
       "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
+    },
+    "wangeditor": {
+      "version": "4.7.15",
+      "resolved": "https://registry.npmmirror.com/wangeditor/-/wangeditor-4.7.15.tgz",
+      "integrity": "sha512-aPTdREd8BxXVyJ5MI+LU83FQ7u1EPd341iXIorRNYSOvoimNoZ4nPg+yn3FGbB93/owEa6buLw8wdhYnMCJQLg==",
+      "requires": {
+        "@babel/runtime": "^7.11.2",
+        "@babel/runtime-corejs3": "^7.11.2",
+        "tslib": "^2.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.6.3",
+          "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.3.tgz",
+          "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
+        }
+      }
     },
     "watch-size": {
       "version": "2.0.0",
@@ -14415,6 +14822,11 @@
         }
       }
     },
+    "wildcard": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
+      "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
diff --git a/admin/package.json b/admin/package.json
index 5b959a3..40ef6c2 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -11,6 +11,8 @@
   },
   "dependencies": {
     "@riophae/vue-treeselect": "^0.4.0",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^1.0.2",
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
     "echarts": "^5.4.3",
@@ -25,7 +27,8 @@
     "vue-json-viewer": "^2.2.22",
     "vue-router": "^3.5.1",
     "vuescroll": "^4.17.3",
-    "vuex": "^3.4.0"
+    "vuex": "^3.4.0",
+    "wangeditor": "^4.7.15"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "~4.5.0",
diff --git a/admin/public/template/category.xlsx b/admin/public/template/category.xlsx
new file mode 100644
index 0000000..67f1fc5
--- /dev/null
+++ b/admin/public/template/category.xlsx
Binary files differ
diff --git a/admin/src/api/business/segments.js b/admin/src/api/business/segments.js
index b8120e3..ca21c3f 100644
--- a/admin/src/api/business/segments.js
+++ b/admin/src/api/business/segments.js
@@ -29,6 +29,9 @@
 export function deleteById (id) {
   return request.get(`/business/segments/delete/${id}`)
 }
+export function getUnitList () {
+  return request.get(`/business/segments/getUnitList`)
+}
 
 // 鎵归噺鍒犻櫎
 export function deleteByIdInBatch (ids) {
diff --git a/admin/src/api/business/shop.js b/admin/src/api/business/shop.js
index 5b73c37..4110833 100644
--- a/admin/src/api/business/shop.js
+++ b/admin/src/api/business/shop.js
@@ -24,6 +24,9 @@
 export function importFcodeBatch (data) {
   return request.post('/business/shop/importFcodeBatch', data)
 }
+export function importCategoryBatch (data) {
+  return request.post('/business/shop/importCategoryBatch', data)
+}
 // 瀵煎嚭Excel
 export function exportExcel (data) {
   return request.post('/business/shop/exportExcel', data, {
diff --git a/admin/src/components/business/OperaCategoryImportWindow.vue b/admin/src/components/business/OperaCategoryImportWindow.vue
new file mode 100644
index 0000000..36a6a4d
--- /dev/null
+++ b/admin/src/components/business/OperaCategoryImportWindow.vue
@@ -0,0 +1,82 @@
+<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"   @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 {importCategoryBatch} from '@/api/business/shop'
+export default {
+  name: 'OperaShopImportWindow',
+  extends: BaseOpera,
+  // eslint-disable-next-line vue/no-unused-components
+  components: { GlobalWindow },
+  data () {
+    return {
+      importing:false,
+      fileName: '',
+    }
+  },
+  methods: {
+    open (title, companyType) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/category.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      data.append('companyType', this.companyType)
+      importCategoryBatch(data)
+        .then(res => {
+          this.$tip.apiSuccess('鍙戣捣鎵归噺涓婁紶浠诲姟鎴愬姛锛岃绋嶅悗鍒锋柊椤甸潰鏌ョ湅')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/business/OperaFcodeImportWindow.vue b/admin/src/components/business/OperaFcodeImportWindow.vue
index 2bd3438..c36ed02 100644
--- a/admin/src/components/business/OperaFcodeImportWindow.vue
+++ b/admin/src/components/business/OperaFcodeImportWindow.vue
@@ -62,7 +62,8 @@
       data.append('companyType', this.companyType)
       importFcodeBatch(data)
         .then(res => {
-          this.$message.success('瀵煎叆鎴愬姛')
+
+          this.$tip.apiSuccess('鍙戣捣鎵归噺涓婁紶浠诲姟鎴愬姛锛岃绋嶅悗鍒锋柊椤甸潰鏌ョ湅')
           this.$emit('success')
           this.visible = false
         })
diff --git a/admin/src/components/business/OperaShopImportWindow.vue b/admin/src/components/business/OperaShopImportWindow.vue
index 99c7ca4..b9d34b2 100644
--- a/admin/src/components/business/OperaShopImportWindow.vue
+++ b/admin/src/components/business/OperaShopImportWindow.vue
@@ -62,7 +62,7 @@
       data.append('companyType', this.companyType)
       importExcel(data)
         .then(res => {
-          this.$message.success('瀵煎叆鎴愬姛')
+          this.$tip.apiSuccess('鍙戣捣鎵归噺涓婁紶浠诲姟鎴愬姛锛岃绋嶅悗鍒锋柊椤甸潰鏌ョ湅')
           this.$emit('success')
           this.visible = false
         })
diff --git a/admin/src/components/common/RichEditor.vue b/admin/src/components/common/RichEditor.vue
index 4ac38b2..bdcf1bf 100644
--- a/admin/src/components/common/RichEditor.vue
+++ b/admin/src/components/common/RichEditor.vue
@@ -1,158 +1,315 @@
 <template>
-  <div style="border: 1px solid #ccc;">
-    <Toolbar
-      style="border-bottom: 1px solid #ccc"
-      :editor="editor"
-      :defaultConfig="toolbarConfig"
-      :mode="mode"
-    />
-    <Editor
-      style="height: 300px; overflow-y: hidden;"
-      :value="content.content"
-      :mode="mode"
-      :defaultConfig="editorConfig"
-      @onCreated="onCreated"
-      @onChange="onChange"
-      @input="html=$event"
-    />
+  <div :style="styleEditor">
+    <Toolbar style="border-bottom: 1px solid #ccc" :editor="editor" :defaultConfig="toolbarConfig" :mode="mode" />
+    <Editor style="height: 300px; overflow-y: hidden;" v-model="html" :defaultConfig="editorConfig" :mode="mode"
+            @onCreated="onCreated" @onChange="onChange" />
   </div>
 </template>
-
+<style src="@wangeditor/editor/dist/css/style.css"></style>
 <script>
+import Vue from 'vue'
 import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
-export default {
-  name: 'RichEditor',
-  components: { Editor, Toolbar },
+import { Loading } from 'element-ui';
+export default Vue.extend({
   props: {
-    content: {
-      type: Object,
-      default: () => {}
-    }
+    richData: { // 鐖剁粍浠朵紶閫掔殑鏁版嵁
+      type: String,
+      default: ''
+    },
+    styleEditor: '',
+    readonly: false, // 鏄惁鍙互杈撳叆
   },
+  name:'RichEditor',
+  components: { Editor, Toolbar },
   data() {
     return {
       editor: null,
-      html: '<p><br></p>',
-      toolbarConfig: {
-        toolbarKeys: [
-          "headerSelect",
-          "blockquote",
-          "|",
-          "bold",
-          "underline",
-          "italic",
-          {
-              "key": "group-more-style",
-              "title": "鏇村",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M204.8 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M505.6 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M806.4 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path></svg>",
-              "menuKeys": [
-                  "through",
-                  "code",
-                  "sup",
-                  "sub",
-                  "clearStyle"
-              ]
-          },
-          "color",
-          "bgColor",
-          "|",
-          "fontSize",
-          "fontFamily",
-          "lineHeight",
-          "|",
-          "bulletedList",
-          "numberedList",
-          "todo",
-          {
-              "key": "group-justify",
-              "title": "瀵归綈",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>",
-              "menuKeys": [
-                  "justifyLeft",
-                  "justifyRight",
-                  "justifyCenter",
-                  "justifyJustify"
-              ]
-          },
-          {
-              "key": "group-indent",
-              "title": "缂╄繘",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>",
-              "menuKeys": [
-                  "indent",
-                  "delIndent"
-              ]
-          },
-          // "|",
-          "emotion",
-          "insertLink",
-          {
-              "key": "group-image",
-              "title": "鍥剧墖",
-              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>",
-              "menuKeys": [
-                  "insertImage",
-                  "uploadImage"
-              ]
-          },
-          "insertTable",
-          "codeBlock",
-          "divider",
-          "|",
-          "undo",
-          "redo",
-          "|",
-          "fullScreen"
-        ]
-      },
-      editorConfig: {
-        placeholder: '璇疯緭鍏ュ唴瀹�...',
-        MENU_CONF: {
-          uploadImage: {
-            // server: '/api/upload',
-            name: 'file',
-            server: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
-            meta: {
-              folder: 'shop'
-            },
-            onBeforeUpload(file) {    // JS 璇硶
-              // file 閫変腑鐨勬枃浠讹紝鏍煎紡濡� { key: file }
-              // debugger
-              return file
-            },
-            onSuccess(file, res) {
-                console.log(`${file.name} 涓婁紶鎴愬姛`, res)
-            },
-            onError(file, err, res) {
-              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res)
-            },
-          },
+      html: '',
+      toolbarConfig: { // 宸ュ叿鏍忛厤缃�
+        toolbarKeys: this.readonly ? ["fullScreen"]: [ // 鏄剧ず鎸囧畾鐨勮彍鍗曢」
+          "bold", // 绮椾綋
+          "underline", // 涓嬪垝绾�
+          "italic", // 鏂滀綋
+          "through", // 鍒犻櫎绾�
+          "code", // 琛屽唴浠g爜
+          "sub", // 涓嬫爣
+          "sup", // 涓婃爣
+          "clearStyle", // 娓呴櫎鏍煎紡
+          "color", // 瀛椾綋棰滆壊
+          "bgColor", // 鑳屾櫙鑹�
+          "fontSize", // 瀛楀彿
+          "fontFamily", // 瀛椾綋
+          "indent", // 澧炲姞缂╄繘
+          "delIndent", // 鍑忓皯缂╄繘
+          "justifyLeft", // 宸﹀榻�
+          "justifyRight", // 鍙冲榻�
+          "justifyCenter", // 灞呬腑瀵归綈
+          "justifyJustify", // 涓ょ瀵归綈
+          "lineHeight", // 琛岄珮
+          // "viewImageLink", // 鏌ョ湅閾炬帴
+          "divider", // 鍒嗗壊绾�
+          "emotion", // 琛ㄦ儏
+          "insertLink", // 鎻掑叆閾炬帴
+          // "editLink", // 淇敼閾炬帴
+          // "unLink", // 鍙栨秷閾炬帴
+          // "viewLink", // 鏌ョ湅閾炬帴
+          "codeBlock", // 浠g爜鍧�
+          "blockquote", // 寮曠敤
+          "headerSelect", // 鏍囬
+          // "header1", // 鏍囬1
+          // "header2", // 鏍囬2
+          // "header3", // 鏍囬3
+          // "header4", // 鏍囬4
+          // "header5", // 鏍囬5
+          // "todo", // 寰呭姙
+          "redo", // 閲嶅仛
+          "undo", // 鎾ら攢
+          // "enter", // 鍥炶溅
+          // "bulletedList", // 鏃犲簭鍒楄〃
+          // "numberedList", // 鏈夊簭鍒楄〃
+          // "codeSelectLang" // 閫夋嫨璇█
+          // 琛ㄦ牸鍔熻兘鍒嗙粍
+         /* {
+            key: 'table-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '琛ㄦ牸', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              "insertTable", // 鎻掑叆琛ㄦ牸
+              "deleteTable", // 鍒犻櫎琛ㄦ牸
+              "insertTableRow", // 鎻掑叆琛�
+              "deleteTableRow", // 鍒犻櫎琛�
+              "insertTableCol", // 鎻掑叆鍒�
+              "deleteTableCol", // 鍒犻櫎鍒�
+              "tableHeader", // 琛ㄥご
+              "tableFullWidth", // 瀹藉害鑷�傚簲
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+          },*/
+          // 涓婁紶鍥剧墖鍒嗙粍
+         /* {
+            key: 'img-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '鍥剧墖', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              "uploadImage", // 涓婁紶鍥剧墖
+              "insertImage", // 缃戠粶鍥剧墖
+              "deleteImage", // 鍒犻櫎鍥剧墖
+              "editImage", // 缂栬緫鍥剧墖
+              "imageWidth30", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮30
+              "imageWidth50", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮50
+              "imageWidth100", // 鍥剧墖瀹藉害鐩稿浜庣紪杈戝櫒瀹藉害鐨勭櫨鍒嗘瘮100
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+          },*/
+          // 瑙嗛鍒嗙粍
+         /* {
+            key: 'video-style', // 蹇呭~锛岃浠� group 寮�澶�
+            title: '瑙嗛', // 蹇呭~
+            // iconSvg: '<svg>....</svg>', // 鍙��
+            menuKeys: [
+              "insertVideo", // 鎻掑叆缃戠粶瑙嗛
+              "uploadVideo", // 涓婁紶瑙嗛
+              "editVideoSize", // 淇敼瑙嗛灏哄
+            ] // 涓嬬骇鑿滃崟 key 锛屽繀濉�
+          },*/
+          "fullScreen", // 鍏ㄥ睆
+        ],
+        excludeKeys: [ // 闅愯棌鎸囧畾鐨勮彍鍗曢」
+          // 'headerSelect',
+          // 'video-style'
+          // 鎺掗櫎鑿滃崟缁勶紝鍐欒彍鍗曠粍 key 鐨勫�煎嵆鍙�
+        ],
 
+      },
+      editorConfig: { // 缂栬緫鍣ㄩ厤缃�
+        placeholder: '璇疯緭鍏ュ唴瀹�...',
+        readOnly: this.readonly, // 鏄惁鍙锛岄粯璁alse
+        autoFocus: false, // 鏄惁鑷姩focus锛岄粯璁や负true
+        scroll: true, // 閰嶇疆缂栬緫鍣ㄦ槸鍚︽敮鎸佹粴鍔紝榛樿涓� true 銆傛敞鎰忥紝姝ゆ椂涓嶈鍥哄畾 editor-container 鐨勯珮搴︼紝璁剧疆涓�涓� min-height 鍗冲彲銆�
+        maxLength: 20000, // 鏈�澶ч檺鍒讹紝閬垮厤鍐呭杩囧鍗¢】
+        MENU_CONF: {
+          // 鍥剧墖涓婁紶
+          uploadImage: {
+            server: process.env.VUE_APP_BASE_API + "/common/upload",
+            fieldName: 'file',
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 2M
+            maxFileSize: 10 * 1024 * 1024, // 10M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 100
+            maxNumberOfFiles: 10,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['image/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['image/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+            meta: {
+            },
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+            // 鑷畾涔夊鍔� http  header
+            // headers: { Authorization: "Bearer " + getToken() },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 10 绉�
+            timeout: 10 * 1000, //10 绉�
+            // 涓婁紶鍓�
+            onBeforeUpload(files) {
+              Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              });
+              return files;
+            },
+            // 鑷畾涔夋彃鍏ュ浘鐗�
+            customInsert(res, insertFn) {
+              console.log(res);
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              Loading.service({
+                lock: true,
+                text: '涓婁紶涓�...',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+              }).close();
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.url, res.originalFilename, res.newFileName);
+            },
+
+            // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+            onSuccess(file, res) {
+              console.log(`${file.originalFilename} 涓婁紶鎴愬姛`, res);
+            },
+            // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            onFailed(file, res) {
+              console.log(`${file.originalFilename} 涓婁紶澶辫触`, res);
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress(progress) {
+              console.log('progress', progress);
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+            onError(file, err, res) {
+              console.log(`${file.originalFilename} 涓婁紶鍑洪敊`, err, res);
+            }
+          },
+          // 瑙嗛涓婁紶
+          uploadVideo: {
+            fieldName: 'file',
+            server: process.env.VUE_APP_BASE_API + "/common/upload",
+            // 鍗曚釜鏂囦欢鐨勬渶澶т綋绉檺鍒讹紝榛樿涓� 10M
+            maxFileSize: 50 * 1024 * 1024, // 50M
+            // 鏈�澶氬彲涓婁紶鍑犱釜鏂囦欢锛岄粯璁や负 5
+            maxNumberOfFiles: 3,
+            // 閫夋嫨鏂囦欢鏃剁殑绫诲瀷闄愬埗锛岄粯璁や负 ['video/*'] 銆傚涓嶆兂闄愬埗锛屽垯璁剧疆涓� []
+            allowedFileTypes: ['video/*'],
+            // 鑷畾涔変笂浼犲弬鏁帮紝渚嬪浼犻�掗獙璇佺殑 token 绛夈�傚弬鏁颁細琚坊鍔犲埌 formData 涓紝涓�璧蜂笂浼犲埌鏈嶅姟绔��
+            meta: {
+              // token: 'xxx',
+              // otherKey: 'yyy'
+            },
+            // 灏� meta 鎷兼帴鍒� url 鍙傛暟涓紝榛樿 false
+            metaWithUrl: false,
+
+            // 鑷畾涔夊鍔� http  header
+            headers: {
+              // Authorization: "Bearer " + getToken()
+              // otherKey: 'xxx'
+            },
+            // 璺ㄥ煙鏄惁浼犻�� cookie 锛岄粯璁や负 false
+            withCredentials: true,
+            // 瓒呮椂鏃堕棿锛岄粯璁や负 30 绉�
+            timeout: 1000 * 1000, // 1000 绉�,
+            // 涓婁紶涔嬪墠瑙﹀彂
+            onBeforeUpload(file) {
+              return file;
+            },
+            // 鑷畾涔夋彃鍏ヨ棰�
+            customInsert(res, insertFn) {
+              // 鍥犱负鑷畾涔夋彃鍏ュ鑷磑nSuccess涓巓nFailed鍥炶皟鍑芥暟涓嶈捣浣滅敤,鑷繁鎵嬪姩澶勭悊
+              // 鍏堝叧闂瓑寰呯殑Message
+              // Message.closeAll();
+              if (res.code === 200) {
+                // Message.success({
+                //     message: `${res.data.originalName} 涓婁紶鎴愬姛`
+                // });
+              } else {
+                // Message.error({
+                //     message: `${res.data.originalName} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+                // });
+              }
+              insertFn(res.data.link, res.data.link);
+            },
+            // 涓婁紶杩涘害鐨勫洖璋冨嚱鏁�
+            onProgress(progress) {
+              console.log(progress);
+              // onProgress(progress) {       // JS 璇硶
+              // progress 鏄� 0-100 鐨勬暟瀛�
+            },
+            // // 鍗曚釜鏂囦欢涓婁紶鎴愬姛涔嬪悗
+            // onSuccess(file, res) {
+            //   console.log(`${file.name} 涓婁紶鎴愬姛`, res);
+            //   this.successMsg(file);
+            // },
+            // // 鍗曚釜鏂囦欢涓婁紶澶辫触
+            // onFailed(file, res) {
+            //   console.log(`${file.name} 涓婁紶澶辫触`, res);
+            //   this.errorMsg(file);
+            // },
+            // 涓婁紶閿欒锛屾垨鑰呰Е鍙� timeout 瓒呮椂
+            onError(file, err, res) {
+              console.log(`${file.name} 涓婁紶鍑洪敊`, err, res);
+              // Notification.error({
+              //     title: '閿欒',
+              //     message: `${file.name} 涓婁紶澶辫触锛岃閲嶆柊灏濊瘯`
+              // });
+            }
+          }
         }
       },
       mode: 'default', // or 'simple'
     }
   },
+  watch: {
+    richData: function (value) {
+      this.html = value
+    },
+    readonly: function (value) {
+      this.readonly = value
+    },
+    styleEditor: function (value) {
+      this.styleEditor = value
+    },
+  },
+  mounted() {
+    // 闇�瑕佸湪缂栬緫鍣ㄥ垱寤哄畬姣曞悗鍦ㄨ祴鍊�
+    this.$nextTick(()=>{
+      this.html = this.richData
+    })
+  },
+  methods: {
+    // 缂栬緫鍣ㄥ垱寤哄畬姣曟椂鐨勫洖璋冨嚱鏁�
+    onCreated(editor) {
+      this.editor = Object.seal(editor) // 涓�瀹氳鐢� Object.seal() 锛屽惁鍒欎細鎶ラ敊
+    },
+    // 缂栬緫鍣ㄥ唴瀹广�侀�夊尯鍙樺寲鏃剁殑鍥炶皟鍑芥暟
+    onChange(editor) {
+      this.$emit('getWangedditor', editor.getHtml())
+      console.log("onChange", editor.getHtml()); // onChange 鏃惰幏鍙栫紪杈戝櫒鏈�鏂板唴瀹�
+    },
+  },
   beforeDestroy() {
+    // 缂栬緫鍣ㄩ攢姣佹椂鐨勫洖璋冨嚱鏁般�傝皟鐢� editor.destroy() 鍗冲彲閿�姣佺紪杈戝櫒
     const editor = this.editor
     if (editor == null) return
     editor.destroy() // 缁勪欢閿�姣佹椂锛屽強鏃堕攢姣佺紪杈戝櫒
-  },
-  methods: {
-    onCreated (editor) {
-      this.editor = Object.seal(editor)
-    },
-    onChange (editor) {
-      console.log(this.html);
-      // debugger
-      if (!this.html||this.content.content==this.html) {
-        return
-      }
-      this.$emit('edit', this.html)
-    },
-  },
-
-}
+  }
+})
 </script>
-
-<style src="@wangeditor/editor/dist/css/style.css"></style>
+<style lang="scss">
+</style>>
diff --git a/admin/src/components/system/dict/DictDataManagerWindow.vue b/admin/src/components/system/dict/DictDataManagerWindow.vue
index 29ead03..86c092a 100644
--- a/admin/src/components/system/dict/DictDataManagerWindow.vue
+++ b/admin/src/components/system/dict/DictDataManagerWindow.vue
@@ -20,7 +20,14 @@
         >
           <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column prop="label" label="鏁版嵁鏍囩" min-width="100px"></el-table-column>
-          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px" show-overflow-tooltip></el-table-column>
+          <el-table-column prop="code" label="鏁版嵁鍊�" min-width="100px">
+            <template slot-scope="{row}">
+              <div v-if="row.code || row.code.length>500" >
+                <el-button type="text" @click="showCode(row)" >鐐瑰嚮鏌ョ湅</el-button>
+              </div>
+              <div v-else>{{row.code}}</div>
+            </template>
+          </el-table-column>
           <el-table-column prop="disabled" label="鐘舵��" min-width="100px">
             <template slot-scope="{row}">{{row.disabled | disabledText}}</template>
           </el-table-column>
@@ -38,7 +45,7 @@
             fixed="right"
           >
             <template slot-scope="{row}">
-              <el-button type="text" @click="$refs.operaDictDataWindow.open('缂栬緫瀛楀吀鏁版嵁', dictId, row)" icon="el-icon-edit">缂栬緫</el-button>
+              <el-button type="text" @click="$refs.operaDictDataWindow.open('缂栬緫瀛楀吀鏁版嵁', searchForm.dictId, row)" icon="el-icon-edit">缂栬緫</el-button>
               <el-button type="text" @click="deleteById(row)" icon="el-icon-delete">鍒犻櫎</el-button>
             </template>
           </el-table-column>
@@ -51,6 +58,22 @@
       </template>
       <!-- 鏂板缓/淇敼 -->
       <OperaDictDataWindow ref="operaDictDataWindow" @success="handlePageChange(tableData.pagination.pageIndex)"/>
+
+      <el-dialog
+          class="center-title"
+          title="瀛楀吀鍊�"
+          width="70%"
+          height="70%"
+          text="瀛楀吀鍊�"
+          :visible.sync="visible1"
+          append-to-body
+      >
+        <div class="agree-list"  v-html="agreement">
+        </div>
+        <template  v-slot:footer>
+          <el-button @click="visible1=false">杩斿洖</el-button>
+        </template>
+      </el-dialog>
     </TableLayout>
   </GlobalWindow>
 </template>
@@ -68,6 +91,8 @@
   data () {
     return {
       visible: false,
+      visible1: false,
+      agreement: '',
       searchForm: {
         // 瀛楀吀ID
         dictId: null
@@ -83,6 +108,10 @@
       this.dictName = dictName
       this.visible = true
       this.search()
+    },
+    showCode(row){
+      this.agreement=row.code
+      this.visible1=true
     }
   },
   created () {
@@ -95,6 +124,12 @@
 </script>
 
 <style scoped lang="scss">
+.agree-list{
+  height: 550px;
+  //max-height: 50%;
+  overflow: auto;
+}
+
 /deep/ .window__body {
   .table-content {
     padding: 0;
@@ -102,5 +137,6 @@
       padding-top: 0;
     }
   }
+
 }
 </style>
diff --git a/admin/src/components/system/dict/OperaDictDataWindow.vue b/admin/src/components/system/dict/OperaDictDataWindow.vue
index b9ebd40..ec5ba6a 100644
--- a/admin/src/components/system/dict/OperaDictDataWindow.vue
+++ b/admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -9,13 +9,13 @@
       <el-form-item label="鏁版嵁鏍囩" prop="label" required>
         <el-input v-model="form.label" placeholder="璇疯緭鍏ユ暟鎹爣绛�" v-trim maxlength="50"/>
       </el-form-item>
+      <el-form-item label="鏄惁瀵屾枃鏈�" prop="istext" >
+        <el-switch v-model="form.istext" :active-value="true" :inactive-value="false"/>
+        <span class="status-text">{{form.istext | disabledText1}}</span>
+      </el-form-item>
       <el-form-item label="鏁版嵁鍊�" prop="code" required>
-        <el-tiptap
-                v-if="[175].includes(form.id)"
-                v-model="form.code"
-                :extensions="extensions"
-        />
-        <el-input v-else v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim />
+        <el-input v-if="!form.istext" v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim maxlength="50"/>
+        <RichEditor v-else  :richData="form.code" :styleEditor="styleEditor" @getWangedditor="getWangedditor" :readonly="false"/>
       </el-form-item>
       <el-form-item label="鐘舵��" prop="disabled" required class="form-item-status">
         <el-switch v-model="form.disabled" :active-value="false" :inactive-value="true"/>
@@ -28,44 +28,22 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
-import { upload } from '@/api/system/common'
-import {
-  // necessary extensions
-  Doc,
-  Text,
-  Paragraph,
-  Heading,
-  Bold,
-  Underline,
-  Italic,
-  Strike,
-  ListItem,
-  BulletList,
-  OrderedList,
-  Image,
-  Blockquote,
-  TextAlign,
-  Indent,
-  Table,
-  TableHeader,
-  TableCell,
-  TableRow,
-  TextColor,
-  HorizontalRule
-} from 'element-tiptap'
+import RichEditor from '@/components/common/RichEditor'
 export default {
   name: 'OperaDictDataWindow',
   extends: BaseOpera,
-  components: { GlobalWindow },
+  components: { GlobalWindow,RichEditor },
   data () {
     return {
       // 琛ㄥ崟鏁版嵁
+      styleEditor:'border: 1px solid #ccc;display: inline-block;',
       form: {
         id: null,
         dictId: null,
         code: '',
         label: '',
-        disabled: false
+        disabled: false,
+        istext: false
       },
       // 楠岃瘉瑙勫垯
       rules: {
@@ -75,42 +53,13 @@
         code: [
           { required: true, message: '璇疯緭鍏ユ暟鎹��' }
         ]
-      },
-      extensions: [
-        new Doc(),
-        new Text(),
-        new Paragraph(),
-        new Heading({ level: 5 }),
-        new Bold({ bubble: true }),
-        new Underline({ bubble: true, menubar: false }),
-        new Italic(),
-        new Strike(),
-        new ListItem(),
-        new BulletList(),
-        new OrderedList(),
-        new Image({
-          uploadRequest (file) {
-            const fd = new FormData()
-            fd.append('folder', 'visit')
-            fd.append('file', file)
-            return upload(fd).then(res => {
-              return res.url
-            })
-          }
-        }),
-        new Blockquote(),
-        new TextAlign(),
-        new Indent(),
-        new Table(),
-        new TableHeader(),
-        new TableCell(),
-        new TableRow(),
-        new HorizontalRule(),
-        new TextColor()
-      ]
+      }
     }
   },
   methods: {
+    getWangedditor(val){
+      this.form.code =val
+    },
     /**
      * @title 绐楀彛鏍囬
      * @dict 鎵�灞炲瓧鍏窱D
@@ -125,6 +74,7 @@
           this.$refs.form.resetFields()
           this.form.id = null
           this.form.dictId = dictId
+          this.form.istext=false
         })
         return
       }
@@ -132,6 +82,8 @@
       this.$nextTick(() => {
         for (const key in this.form) {
           this.form[key] = target[key]
+          this.form.dictId = dictId
+          this.form.istext=false
         }
       })
     }
diff --git a/admin/src/filters/index.js b/admin/src/filters/index.js
index e854f1e..77559ba 100644
--- a/admin/src/filters/index.js
+++ b/admin/src/filters/index.js
@@ -17,5 +17,11 @@
       }
       return '鍚敤'
     })
+    Vue.filter('disabledText1', (value) => {
+      if (value) {
+        return '鏅�氭枃鏈�'
+      }
+      return '瀵屾枃鏈�'
+    })
   }
 }
diff --git a/admin/src/views/business/segments.vue b/admin/src/views/business/segments.vue
index 14d0402..0c4eb6b 100644
--- a/admin/src/views/business/segments.vue
+++ b/admin/src/views/business/segments.vue
@@ -2,50 +2,26 @@
   <TableLayout :permissions="['business:segments: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="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
-      </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 label="鎵�灞炲搧鐗�" prop="segmentId">
+        <el-select v-model="searchForm.unitCode" @change="search" clearable placeholder="鎵�灞炲搧鐗�">
+           <el-option v-for="(item) in unitList " :key="item.code" :label="item.name" :value="item.code"></el-option>
+        </el-select>
       </el-form-item>
       <el-form-item label="鍖哄煙缂栫爜" prop="segmentId">
-        <el-input v-model="searchForm.segmentId" placeholder="璇疯緭鍏ュ尯鍩熺紪鐮�" @keypress.enter.native="search"></el-input>
+        <el-input v-model="searchForm.segmentId" clearable placeholder="璇疯緭鍏ュ尯鍩熺紪鐮�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="涓婄骇鍖哄煙缂栫爜" prop="parentId">
-        <el-input v-model="searchForm.parentId" placeholder="璇疯緭鍏ヤ笂绾у尯鍩熺紪鐮�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="鐖剁骇鍖哄煙缂栫爜" prop="name">
+        <el-input v-model="searchForm.parentId" placeholder="璇疯緭鍏ョ埗绾у尯鍩熺紪鐮�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鐘舵��" prop="status">
-        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="orderNum">
-        <el-input v-model="searchForm.orderNum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="绫诲瀷 0鎴樺尯 1鐪佸尯 2甯傚尯" prop="type">
-        <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0鎴樺尯 1鐪佸尯 2甯傚尯" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏈�杩戝悓姝ユ椂闂�" prop="syncDate">
-        <el-date-picker v-model="searchForm.syncDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶杩戝悓姝ユ椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏈�杩戝悓姝ュ娉�" prop="syncInfo">
-        <el-input v-model="searchForm.syncInfo" placeholder="璇疯緭鍏ユ渶杩戝悓姝ュ娉�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="绫诲瀷" prop="type">
+        <el-select v-model="searchForm.type" @change="search" clearable placeholder="绫诲瀷" >
+          <el-option label="鎴樺尯" value="0"></el-option>
+          <el-option label="鐪佸尯" value="1"></el-option>
+          <el-option label="鐗囧尯" value="2"></el-option>
+        </el-select>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -66,32 +42,20 @@
         @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="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
-        <el-table-column prop="remark" label="澶囨敞" min-width="100px"></el-table-column>
+        <el-table-column prop="unitCode" label="鍝佺墝code" min-width="100px"></el-table-column>
+        <el-table-column prop="unitName" label="鍝佺墝鍚嶇О" min-width="100px">  </el-table-column>
         <el-table-column prop="segmentId" label="鍖哄煙缂栫爜" min-width="100px"></el-table-column>
         <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
         <el-table-column prop="parentId" label="涓婄骇鍖哄煙缂栫爜" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵��" min-width="100px"></el-table-column>
-        <el-table-column prop="orderNum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="type" label="绫诲瀷 0鎴樺尯 1鐪佸尯 2甯傚尯" min-width="100px"></el-table-column>
-        <el-table-column prop="syncDate" label="鏈�杩戝悓姝ユ椂闂�" min-width="100px"></el-table-column>
-        <el-table-column prop="syncInfo" label="鏈�杩戝悓姝ュ娉�" min-width="100px"></el-table-column>
-        <el-table-column
-          v-if="containPermissions(['business:segments:update', 'business:segments:delete'])"
-          label="鎿嶄綔"
-          min-width="120"
-          fixed="right"
-        >
-          <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaSegmentsWindow.open('缂栬緫蹇楅偊钀ラ攢鍖哄煙淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:segments:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:segments:delete']">鍒犻櫎</el-button>
+        <el-table-column prop="type" label="绫诲瀷" min-width="100px">
+          <template 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="remark" label="绛夌骇璺緞" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
       </el-table>
       <pagination
         @size-change="handleSizeChange"
@@ -133,7 +97,8 @@
         type: '',
         syncDate: '',
         syncInfo: ''
-      }
+      },
+      unitList: []
     }
   },
   created () {
@@ -144,6 +109,15 @@
       'field.main': 'id'
     })
     this.search()
+    this.loadUnitList()
+  },
+  methods: {
+    loadUnitList () {
+      this.api.getUnitList()
+        .then(data => {
+          this.unitList = data
+        })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/shop.vue b/admin/src/views/business/shop.vue
index a52ebe5..2c462bb 100644
--- a/admin/src/views/business/shop.vue
+++ b/admin/src/views/business/shop.vue
@@ -57,6 +57,9 @@
       <el-form-item label="鍝佺被缂栫爜" prop="unitCode">
         <el-input v-model="searchForm.unitCode" placeholder="璇疯緭鍏ュ搧绫荤紪鐮�" @keypress.enter.native="search"></el-input>
       </el-form-item>
+      <el-form-item label="瀹㈡埛绫诲瀷缂栫爜" prop="siteCode">
+        <el-input v-model="searchForm.siteCode" placeholder="璇疯緭鍏ュ鎴风被鍨嬬紪鐮�" @keypress.enter.native="search"></el-input>
+      </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
         <el-button type="primary" :loading="isWorking.export" v-permissions="['business:shop:exportExcel']" @click="exportExcel">瀵煎嚭</el-button>
@@ -65,10 +68,10 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:shop:create', 'business:shop:delete']">
+<!--      <ul class="toolbar" v-permissions="['business:shop:create', 'business:shop:delete']">
         <li><el-button type="primary" @click="$refs.operaShopWindow.open('鏂板缓蹇楅偊缁勭粐淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:shop:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:shop:delete']">鍒犻櫎</el-button></li>
-      </ul>
+      </ul>-->
       <el-table
         v-loading="isWorking.search"
         :data="tableData.list"
@@ -160,7 +163,8 @@
         provinceName: '',
         cityName: '',
         areaName: '',
-        unitCode: ''
+        unitCode: '',
+        siteCode:''
       }
     }
   },
diff --git a/admin/src/views/business/shopTree.vue b/admin/src/views/business/shopTree.vue
index 7bd0426..e024478 100644
--- a/admin/src/views/business/shopTree.vue
+++ b/admin/src/views/business/shopTree.vue
@@ -3,8 +3,9 @@
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:shop:create', 'business:shop:sync','business:shop:sort']">
         <li><el-button type="primary" @click="$refs.OperaShopImportWindow.open('鍒濆鍖栧鍏�')"  icon="el-icon-plus" v-permissions="['business:shop:create']">鍒濆鍖栧鍏�</el-button></li>
-        <li><el-button type="primary" @click="$refs.OperaFcodeImportWindow.open('Fcode淇℃伅瀵煎叆')"  icon="el-icon-plus" v-permissions="['business:shop:create']">Fcode淇℃伅瀵煎叆</el-button></li>
         <li><el-button @click="resetRelations" type="primary" :loading="sorting" icon="el-icon-edit" v-permissions="['business:shop:update']">閲嶇疆涓婁笅绾у叧绯�</el-button></li>
+        <li><el-button type="primary" @click="$refs.OperaFcodeImportWindow.open('Fcode淇℃伅瀵煎叆')"  icon="el-icon-plus" v-permissions="['business:shop:create']">Fcode淇℃伅瀵煎叆</el-button></li>
+        <li><el-button type="primary" @click="$refs.OperaCategoryImportWindow.open('鍝佺被鍒濆鍖栧鍏�')"  icon="el-icon-plus" v-permissions="['business:shop:create']">鍝佺被鍒濆鍖栧鍏�</el-button></li>
         <li><el-button @click="sort('top')" :loading="sorting" icon="el-icon-sort-up" v-permissions="['business:shop:sort']">涓婄Щ</el-button></li>
         <li><el-button @click="sort('bottom')" :loading="sorting" icon="el-icon-sort-down" v-permissions="['business:shop:sort']">涓嬬Щ</el-button></li>
       </ul>
@@ -81,6 +82,7 @@
     <OperaShopWindow ref="OperaShopWindow" :list="list" @success="handlePageChange"/>
     <OperaShopImportWindow ref="OperaShopImportWindow"  @success="handlePageChange"/>
     <OperaFcodeImportWindow ref="OperaFcodeImportWindow"  @success="handlePageChange"/>
+    <OperaCategoryImportWindow ref="OperaCategoryImportWindow"  @success="handlePageChange"/>
   </TableLayout>
 </template>
 
@@ -90,11 +92,12 @@
 import { companySync, sort, resetRelations } from '@/api/business/shop'
 import OperaShopImportWindow from '@/components/business/OperaShopImportWindow'
 import OperaFcodeImportWindow from '@/components/business/OperaFcodeImportWindow'
+import OperaCategoryImportWindow from '@/components/business/OperaCategoryImportWindow'
 import OperaShopWindow from '@/components/business/OperaShopWindow'
 export default {
   name: 'shopTree',
   extends: BaseTable,
-  components: { TableLayout, OperaShopImportWindow, OperaShopWindow, OperaFcodeImportWindow },
+  components: { TableLayout, OperaShopImportWindow, OperaShopWindow, OperaFcodeImportWindow,OperaCategoryImportWindow },
   data () {
     return {
       // 鎼滅储
diff --git a/server/admin/admin.iml b/server/admin/admin.iml
index 16d0893..f57ca7b 100644
--- a/server/admin/admin.iml
+++ b/server/admin/admin.iml
@@ -269,5 +269,6 @@
     <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
     <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.4.0" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/server/admin/src/main/java/com/doumee/api/business/PushController.java b/server/admin/src/main/java/com/doumee/api/business/PushController.java
new file mode 100644
index 0000000..f599904
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/api/business/PushController.java
@@ -0,0 +1,77 @@
+package com.doumee.api.business;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.api.BaseController;
+import com.doumee.biz.zbom.ZbomIAMService;
+import com.doumee.biz.zbom.model.IamUpateShopModel;
+import com.doumee.biz.zbom.model.IamUpateUserModel;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.utils.Constants;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2024/07/04 14:40
+ */
+@Api(tags = "瀵瑰鎻愪緵鎺ュ彛")
+@RestController
+@RequestMapping("/push")
+public class PushController extends BaseController {
+    @Autowired
+    private ZbomIAMService zbomIAMService;
+    @ApiOperation("缁勭粐淇℃伅鏇存柊鎺ㄩ��")
+    @PostMapping("/iam/updateShopInfo")
+    public ApiResponse<String> updateShopInfo(@RequestHeader(name = "token") String token,
+                                      @RequestHeader(name = "uuid") String uuid ,
+                                      @RequestHeader(name = "timestamp") String timestamp,
+                                      @RequestBody List<IamUpateShopModel> shopList,
+                                      HttpServletRequest request ) {
+        int success = Constants.ZERO;
+        ApiResponse<String> r = null;
+        try {
+            zbomIAMService.updateShopInfo(token,uuid,timestamp,shopList);
+            r  = ApiResponse.success("鎿嶄綔鎴愬姛");
+        }catch (BusinessException e){
+            success = Constants.ONE;
+            r = ApiResponse.failed(StringUtils.defaultString(e.getMessage(),"鎿嶄綔澶辫触"));
+        }catch (Exception e){
+            success = Constants.ONE;
+            r = ApiResponse.failed("鎿嶄綔澶辫触");
+        }finally {
+            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo","IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, shopList,success, JSONObject.toJSONString(r));
+        }
+        return r;
+    }
+    @ApiOperation("浜哄憳璐﹀彿淇℃伅鏇存柊鎺ㄩ��")
+    @PostMapping("/iam/updateUserInfo")
+    public ApiResponse<String> updateUserInfo(@RequestHeader(name = "token") String token,
+                                      @RequestHeader(name = "uuid") String uuid ,
+                                      @RequestHeader(name = "timestamp") String timestamp,
+                                      @RequestBody IamUpateUserModel upateUserModel,
+                                      HttpServletRequest request) {
+        int success = Constants.ZERO;
+        ApiResponse<String> r = null;
+        try {
+            zbomIAMService.updateUserInfo(token,uuid,timestamp,upateUserModel);
+            r  = ApiResponse.success("鎿嶄綔鎴愬姛");
+        }catch (BusinessException e){
+              success = Constants.ONE;
+            r = ApiResponse.failed(StringUtils.defaultString(e.getMessage(),"鎿嶄綔澶辫触"));
+        }catch (Exception e){
+            success = Constants.ONE;
+            r = ApiResponse.failed("鎿嶄綔澶辫触");
+        }finally {
+            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo","IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, upateUserModel,success, JSONObject.toJSONString(r));
+        }
+        return r;
+    }
+
+}
diff --git a/server/admin/src/main/java/com/doumee/api/business/SegmentsController.java b/server/admin/src/main/java/com/doumee/api/business/SegmentsController.java
index f3128d8..d68da58 100644
--- a/server/admin/src/main/java/com/doumee/api/business/SegmentsController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/SegmentsController.java
@@ -1,12 +1,14 @@
 package com.doumee.api.business;
 
 import com.doumee.api.BaseController;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.model.PageData;
 import com.doumee.dao.business.model.Segments;
+import com.doumee.dao.business.vo.UnitCodeVo;
 import com.doumee.service.business.SegmentsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -29,6 +31,8 @@
 
     @Autowired
     private SegmentsService segmentsService;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -45,6 +49,11 @@
         segmentsService.deleteById(id);
         return ApiResponse.success(null);
     }
+    @ApiOperation("鑾峰彇鍏ㄩ儴鍝佺墝鏁版嵁")
+    @GetMapping("/getUnitList")
+    public ApiResponse<List<UnitCodeVo>> getUnitList() {
+        return ApiResponse.success(systemDictDataBiz.getUnitList());
+    }
 
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
diff --git a/server/admin/src/main/java/com/doumee/api/business/ShopController.java b/server/admin/src/main/java/com/doumee/api/business/ShopController.java
index c31334a..1afee8f 100644
--- a/server/admin/src/main/java/com/doumee/api/business/ShopController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/ShopController.java
@@ -109,18 +109,40 @@
     })
     @RequiresPermissions("business:shop:create")
     public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file ) {
+//        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
+//        if(importing!=null && importing){
+//            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+//        }
         shopService.importBatch(file);
 //        shopService.dealShopNamePath();
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
-    @ApiOperation(value = "缁勭粐Fcode涓�у寲淇℃伅瀵煎叆" ,notes = "缁勭粐淇℃伅鍒濆鍖栧鍏�")
+    @ApiOperation(value = "缁勭粐Fcode涓�у寲淇℃伅瀵煎叆" ,notes = "缁勭粐Fcode涓�у寲淇℃伅瀵煎叆")
     @PostMapping("/importFcodeBatch")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
     })
     @RequiresPermissions("business:shop:create")
     public ApiResponse<String> importFcodeBatch (@ApiParam(value = "file") MultipartFile file ) {
+//        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
+//        if(importing!=null && importing){
+//            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+//        }
         shopService.importFcodeBatch(file);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+    @ApiOperation(value = "缁勭粐鍝佺被鍒濆鍖栧鍏�" ,notes = "缁勭粐鍝佺被鍒濆鍖栧鍏�")
+    @PostMapping("/importCategoryBatch")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    @RequiresPermissions("business:shop:create")
+    public ApiResponse<String> importCategoryBatch (@ApiParam(value = "file") MultipartFile file ) {
+//        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
+//        if(importing!=null && importing){
+//            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+//        }
+        shopService.importCategoryBatch(file);
         return ApiResponse.success("鎿嶄綔鎴愬姛");
     }
     @ApiOperation(value = "閲嶇疆涓婁笅绾у叧绯�" ,notes = "閲嶇疆涓婁笅绾у叧绯�")
@@ -129,7 +151,7 @@
     public ApiResponse<String> resetRelations ( ) {
         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
         if(importing!=null && importing){
-            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ユ垨鑰呬笂涓嬬骇閲嶇疆浠诲姟姝e湪鎵ц涓紝璇风◢鍚庡啀璇曪紒");
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
         }
         shopService.dealShopNamePath();
         return ApiResponse.success("鎿嶄綔鎴愬姛");
diff --git a/server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java b/server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java
index cd9d3e2..e47f6b6 100644
--- a/server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java
+++ b/server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -92,25 +92,10 @@
         Map<String, String> map = new LinkedHashMap<>();
         // 璺緞鎷︽埅閰嶇疆
         map.put("/system/login", "anon");
-        map.put("/system/syncLingCountData", "anon");
-        map.put("/system/wxLogin", "anon");
-        map.put("/system/wxProgramLogin", "anon");
-        map.put("/system/wxAccountLogin", "anon");
-        map.put("/system/initCompany", "anon");
         map.put("/system/logout", "anon");
         map.put("/common/captcha", "anon");
         map.put("/statistics/**", "anon");
-        map.put("/business/hksync/push/**", "anon");
-        map.put("/business/member/empowerByList", "anon");
-        map.put("/dingding/push", "anon");
-//        map.put("/ext/workorderExt/freshStatistics", "anon");
-        map.put("/dingding/jsapiTicket", "anon");
-        map.put("/dingding/ddLogin", "anon");
-        map.put("/dingding/getDingdingCorpId", "anon");
-        map.put("/lingyang/login", "anon");
-        map.put("/lingyang/loginDemo", "anon");
-        map.put("/lingyang/importBatch", "anon");
-        map.put("/edgp/**", "anon");
+        map.put("/push/**", "anon");
         // - 鏀捐swagger
         map.put("/doc.html", "anon");
         map.put("/webjars/**", "anon");
diff --git a/server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java b/server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java
index c82127c..1e5d324 100644
--- a/server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java
+++ b/server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java
@@ -1,6 +1,6 @@
 package com.doumee.timer;
 
-import com.doumee.service.zbom.ZbomIAMService;
+import com.doumee.biz.zbom.ZbomIAMService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,7 +32,6 @@
         } catch (Exception e) {
            e.printStackTrace();
         }
-
     }
 
 }
diff --git a/server/admin/target/classes/com/doumee/api/business/SegmentsController.class b/server/admin/target/classes/com/doumee/api/business/SegmentsController.class
index 8210d88..3ba9f86 100644
--- a/server/admin/target/classes/com/doumee/api/business/SegmentsController.class
+++ b/server/admin/target/classes/com/doumee/api/business/SegmentsController.class
Binary files differ
diff --git a/server/admin/target/classes/com/doumee/api/business/ShopController.class b/server/admin/target/classes/com/doumee/api/business/ShopController.class
index b388bc7..4e5b183 100644
--- a/server/admin/target/classes/com/doumee/api/business/ShopController.class
+++ b/server/admin/target/classes/com/doumee/api/business/ShopController.class
Binary files differ
diff --git a/server/pom.xml b/server/pom.xml
index 5b5503f..11bccf4 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -265,7 +265,11 @@
       <artifactId>weixin-java-mp</artifactId>
       <version>3.6.0</version>
     </dependency>
-
+    <dependency>
+      <groupId>com.auth0</groupId>
+      <artifactId>java-jwt</artifactId>
+      <version>3.4.0</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/server/service/service.iml b/server/service/service.iml
index 37f5570..34c072b 100644
--- a/server/service/service.iml
+++ b/server/service/service.iml
@@ -268,5 +268,6 @@
     <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
     <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.4.0" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java b/server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
index 46844ea..6e2299e 100644
--- a/server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
+++ b/server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -1,5 +1,6 @@
 package com.doumee.biz.system;
 
+import com.doumee.dao.business.vo.UnitCodeVo;
 import com.doumee.dao.system.model.SystemDictData;
 
 import java.util.List;
@@ -13,7 +14,7 @@
   Integer create(SystemDictData systemDictData);
 
   void updateByDicId(List<SystemDictData> list);
-
+  List<UnitCodeVo> getUnitList();
   /**
    * 缂栬緫
    * @author Eva.Caesar Liu
@@ -26,7 +27,7 @@
 
   List<SystemDictData> queryListByCode(String dicCode, String label);
   List<SystemDictData> queryDataByCode(String dicCode, String code);
-
+  String getUnitName(String unitCode, List<UnitCodeVo> unitCodeVoList);
   /**
    * 鑾峰彇璺緞鍓嶇紑
    * @param resourceCode
diff --git a/server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java b/server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
index 0ebce2c..3ae82f8 100644
--- a/server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -1,10 +1,13 @@
 package com.doumee.biz.system.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.vo.UnitCodeVo;
 import com.doumee.dao.system.model.SystemDict;
 import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.service.system.SystemDictDataService;
@@ -15,10 +18,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 
 @Service
 public class SystemDictDataBizImpl implements SystemDictDataBiz {
@@ -54,12 +54,37 @@
         }
         systemDictDataService.updateById(systemDictData);
     }
-
-
+    @Override
+    public  String getUnitName(String unitCode, List<UnitCodeVo> unitCodeVoList) {
+        if(unitCodeVoList!=null){
+            for(UnitCodeVo  c :unitCodeVoList){
+                if(StringUtils.equals(c.getCode(),unitCode)){
+                    return  c.getName();
+                }
+            }
+        }
+        return null;
+    }
     @Override
     public void updateByIdNew(SystemDictData systemDictData) {
         systemDictDataService.updateById(systemDictData);
     }
+    @Override
+    public   List<UnitCodeVo> getUnitList(){
+        List<UnitCodeVo> list = new ArrayList<>();
+        try {
+            String  temp =  queryByCode(Constants.ZBOM,Constants.UNIT_CODE).getCode();
+            JSONArray array  = JSONObject.parseArray(temp);
+            if(array!=null ){
+                for (int i = 0; i < array.size(); i++) {
+                    list.add(JSONObject.toJavaObject(array.getJSONObject(i),UnitCodeVo.class));
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return list;
+    }
 
     @Override
     public SystemDictData queryByCode(String dicCode, String label){
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java
new file mode 100644
index 0000000..67b62b6
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java
@@ -0,0 +1,34 @@
+package com.doumee.biz.zbom;
+
+import com.doumee.biz.zbom.model.IamUpateShopModel;
+import com.doumee.biz.zbom.model.IamUpateUserModel;
+import com.doumee.dao.business.MemberMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public interface ZbomIAMService {
+
+    /**
+     * 鍒濆鍖栧悓姝ョ敤鎴�
+     * @param params
+     */
+      void startUserInit(String params) ;
+    /**
+     * 鍒濆鍖栧悓姝ョ敤鎴�
+     * @param params
+     */
+    void startOrgInit(String params);
+
+    void updateShopInfo(String token, String uuid, String timestamp, List<IamUpateShopModel> shopList);
+
+    void updateUserInfo(String token, String uuid, String timestamp, IamUpateUserModel upateUserModel);
+    void  saveInterfaceLog(String url,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone);
+}
diff --git a/server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
similarity index 67%
rename from server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java
rename to server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
index 4b1bf8c..eb02b13 100644
--- a/server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
@@ -1,4 +1,4 @@
-package com.doumee.service.zbom;
+package com.doumee.biz.zbom;
 
 import com.doumee.dao.business.MemberMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -10,10 +10,8 @@
  * @date 2023/11/30 15:33
  */
 @Service
-public class ZbomZhongTaiService {
+public interface ZbomZhongTaiService {
 
-    @Autowired
-    private MemberMapper memberMapper;
 
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java
new file mode 100644
index 0000000..b89d3dc
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java
@@ -0,0 +1,374 @@
+package com.doumee.biz.zbom.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.doumee.biz.zbom.ZbomIAMService;
+import com.doumee.biz.zbom.model.*;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
+import com.doumee.dao.business.*;
+import com.doumee.dao.business.model.*;
+import org.apache.commons.lang3.StringUtils;
+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 java.util.*;
+
+/**
+ * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Service
+public class ZbomIAMServiceImpl implements ZbomIAMService {
+
+    @Autowired
+    private UsersMapper usersMapper;
+    @Autowired
+    private ShopMapper shopMapper;
+    @Autowired
+    private CategorySegMapper categorySegMapper;
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
+    private IamInterfaceLogMapper iamInterfaceLogMapper;
+    @Autowired
+    private SegmentsMapper segmentsMapper;
+
+    /**
+     * 鍒濆鍖栧悓姝ョ敤鎴�
+     * @param params
+     */
+    @Override
+    public void startUserInit(String params) {
+    }
+    /**
+     * 鍒濆鍖栧悓姝ョ敤鎴�
+     * @param params
+     */
+    @Override
+    public void startOrgInit(String params) {
+    }
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void updateShopInfo(String token, String uuid, String timestamp, List<IamUpateShopModel> shopList) {
+        if(shopList == null ||shopList.size() == 0){
+            return;
+        }
+        isValidToken(uuid,timestamp,token);
+        List<Shop> addShops = new ArrayList<>();
+        List<Shop> updateShops = new ArrayList<>();
+        List<String> segDelOrgIds = new ArrayList<>();
+        List<CategorySeg> categorySegList = new ArrayList<>();
+        List<Segments> segmentsList = new ArrayList<>();
+        Date date  = new Date();
+        for(IamUpateShopModel model : shopList){
+            Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda()
+                    .eq(Shop::getOrgId,model.getIdtOrgId())
+                    .last("limit 1"));
+            if(shop == null){
+                addShops.add(initShopInfo(shop,model,date));
+            }else {
+                segDelOrgIds.add(shop.getOrgId());
+                updateShops.add(shop);
+            }
+            //澶勭悊鍝佺被鏁版嵁閫昏緫
+            dealCategorySegData(date,shop,model.getCategory(),categorySegList,segmentsList);
+        }
+
+        if(addShops.size()>0){
+            shopMapper.insert(addShops);
+        }
+        if(updateShops.size()>0){
+            for (Shop shop :updateShops){
+                shopMapper.updateById(shop);
+            }
+        }
+        if(segDelOrgIds.size()>0){
+            categorySegMapper.delete(new UpdateWrapper<CategorySeg>().lambda() .in(CategorySeg::getOrgId,segDelOrgIds));
+        }
+        if(categorySegList.size()>0){
+            categorySegMapper.insert(categorySegList);
+        }
+        if(segmentsList.size()>0){
+            segmentsMapper.insert(segmentsList);
+        }
+    }
+    private void dealSegmentData(Date date, IamCategoryModel model, Shop shop, List<Segments> segmentsList) {
+        if(StringUtils.isNotBlank(model.getSegment1())){
+            //濡傛灉鎴樺尯涓嶄负绌�
+            if(newSegment(model.getSegment1(),Constants.ZERO,segmentsList)
+                    && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegment1())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getType,Constants.ZERO)) ==0){
+                segmentsList.add(initSegmentData(model,date,Constants.ZERO));
+            }
+        }
+        if(StringUtils.isNotBlank(model.getSegment2())){
+            //濡傛灉鐪佸尯涓嶄负绌�
+            if(newSegment(model.getSegment2(),Constants.ONE,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegment2())
+                    .eq(Segments::getParentId,model.getSegment1())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getType,Constants.ONE)) ==0){
+                segmentsList.add(initSegmentData(model,date,Constants.ONE));
+            }
+        }
+        if(StringUtils.isNotBlank(model.getSegment3())){
+            //濡傛灉鐗囧尯涓嶄负绌�
+            if(newSegment(model.getSegment3(),Constants.TWO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegment3())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getParentId,model.getSegment2())
+                    .eq(Segments::getType,Constants.TWO)) ==0){
+                segmentsList.add(initSegmentData(model,date,Constants.TWO));
+            }
+        }
+    }
+
+    private boolean newSegment(String segId2, int one, List<Segments> segmentsList) {
+        for(Segments s : segmentsList){
+            if(StringUtils.equals(s.getSegmentId(),segId2) && Constants.equalsInteger(one,s.getType())){
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private Segments initSegmentData(IamCategoryModel model, Date date,  int type) {
+        Segments data = new Segments();
+        data.setCreateDate(date);
+        data.setEditDate(date);
+        data.setIsdeleted(Constants.ZERO);
+        data.setStatus(Constants.ZERO);
+        data.setUnitCode(model.getUnitCode());
+        data.setType(type);
+        if(type ==Constants.ZERO){
+            data.setName(model.getMeaning1());
+            data.setSegmentId(model.getSegment1());
+            data.setParentId(null);
+            data.setRemark(model.getMeaning1());
+        }else if(type ==Constants.ONE){
+            data.setName(model.getMeaning2());
+            data.setSegmentId(model.getSegment2());
+            data.setParentId(model.getSegment1());
+            data.setRemark(model.getMeaning1()+"/"+model.getMeaning2());
+        }else{
+            data.setName(model.getMeaning3());
+            data.setSegmentId(model.getSegment3());
+            data.setParentId(model.getSegment2());
+            data.setRemark(model.getMeaning1()+"/"+model.getMeaning2()+"/"+model.getMeaning3());
+        }
+        return data;
+    }
+    private void dealCategorySegData(Date date, Shop shop, List<IamCategoryModel> categoryModels, List<CategorySeg> categorySegList, List<Segments> segmentsList) {
+       if(categoryModels==null || categoryModels.size() ==0){
+           return;
+       }
+       for(IamCategoryModel model :categoryModels){
+           dealSegmentData(date,model,shop,segmentsList);
+           categorySegList.add(initInsertCategorySeg(date,model,shop));
+       }
+    }
+    private CategorySeg initInsertCategorySeg(Date date, IamCategoryModel model, Shop shop) {
+        CategorySeg data = new CategorySeg();
+        data.setCreateDate(date);
+        data.setEditDate(date);
+        data.setIsdeleted(Constants.ZERO);
+        data.setOrgId(shop.getOrgId());
+        data.setSegId(model.getSegment1());
+        data.setSegId2(model.getSegment2());
+        data.setSegId3(model.getSegment3());
+        data.setSegName(model.getMeaning1());
+        data.setSegName2(model.getMeaning2());
+        data.setSegName3(model.getMeaning3());
+        data.setShipToAddress(model.getShipToAddress());
+        data.setShipToPhone(model.getShipToPhone());
+        data.setShipToPerson(model.getShipToPerson());
+        data.setBrandId(model.getAccountSiteId());
+        data.setUnitCode(model.getUnitCode());
+        data.setSiteCode(model.getSiteCode());
+        data.setScode(model.getRelevanceCode());
+        if(shop.getSiteCode() ==null){
+            shop.setSiteCode("");
+        }
+        shop.setSiteCode(shop.getSiteCode()+model.getSiteCode()+";");
+        return data;
+    }
+
+    private Shop initShopInfo(Shop shop, IamUpateShopModel model, Date date) {
+        if(shop == null) {
+            shop = new Shop();
+            shop.setCreateDate(date);
+        }
+        shop.setEditDate(date);
+        shop.setOrgId(model.getIdtOrgId());
+        shop.setName(model.getIdtOrgName());
+        shop.setCode(model.getIdtOrgCode());
+        shop.setType(model.getIdtOrgFirstLevelType());
+        shop.setSecondType(model.getIdtOrgSecondLevelType());
+        shop.setAttribute(model.getIdtOrgAttribute());
+        if(model.getScode()!=null){
+            shop.setCountry(model.getScode().getCountry());
+            shop.setProvinceName(model.getScode().getProvinceName());
+            shop.setProvinceCode(model.getScode().getProvinceNum());
+            shop.setCityName(model.getScode().getCityName());
+            shop.setCityCode(model.getScode().getCityNum());
+            shop.setAreaName(model.getScode().getCountyName());
+            shop.setAreaCode(model.getScode().getCountyNum());
+            shop.setTown(model.getScode().getTown());
+            shop.setGlCode(model.getScode().getRelevanceCodeGL());
+            shop.setGlName(model.getScode().getRelevanceNameGL());
+            shop.setZcode(model.getScode().getRelevanceZCode());
+        }
+        if(model.getFcode()!=null){
+            shop.setScode(model.getFcode().getRelevanceCode());
+            shop.setCountry(model.getFcode().getCountry());
+            shop.setProvinceName(model.getFcode().getProvinceName());
+            shop.setProvinceCode(model.getFcode().getProvinceNum());
+            shop.setCityName(model.getFcode().getCityName());
+            shop.setCityCode(model.getFcode().getCityNum());
+            shop.setAreaName(model.getFcode().getCountyName());
+            shop.setAreaCode(model.getFcode().getCountyNum());
+            shop.setTown(model.getFcode().getTown());
+            shop.setRegAddr(model.getFcode().getRegistrationAddress());
+            shop.setLegalPhone(model.getFcode().getContactPhone());
+            shop.setLegalName(model.getFcode().getLegalPerson());
+            shop.setLegalIdcode(model.getFcode().getLegalIdentification());
+        }
+        if(model.getShop()!=null){
+            shop.setUnitCode(model.getShop().getUnitCode());
+            shop.setScode(model.getShop().getRelevanceCode());
+            shop.setFcode(model.getShop().getAccountNumber());
+        }
+        if(StringUtils.equals( model.getIdtOrgStatus(),"-1")){
+            shop.setIsdeleted(Constants.ONE);
+        }else{
+            shop.setIsdeleted(Constants.ZERO);
+        }
+        shop.setParentIamId(model.getIdtOrgParentId());
+        return  shop;
+    }
+
+    private void isValidToken(String uuid, String timestamp, String token) {
+        if (!StringUtils.equalsIgnoreCase( getToken( uuid, timestamp), token)) {
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝token閿欒~");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void updateUserInfo(String token, String uuid, String timestamp, IamUpateUserModel upateUserModel){
+        if(upateUserModel == null ||upateUserModel.getIdtUserId() == null){
+            return;
+        }
+        isValidToken(uuid,timestamp,token);
+
+        Users users = usersMapper.selectOne(new QueryWrapper<Users>().lambda()
+                .eq(Users::getIamId,upateUserModel.getIdtUserId())
+                .last("limit 1"));
+        if(users == null){
+            users = initUserModel(users,upateUserModel);
+            usersMapper.insert(users);
+        }else {
+            users = initUserModel(users,upateUserModel);
+            usersMapper.updateById(users);
+        }
+    }
+
+    private Users initUserModel(Users users, IamUpateUserModel upateUserModel) {
+        if(users == null){
+            users = new Users();
+            users.setCreateDate(new Date());
+        }
+        users.setEditDate(new Date());
+        users.setSex(upateUserModel.getIdtUserGender());
+        users.setIamUsername(upateUserModel.getAppAccountNo());
+        users.setName(upateUserModel.getIdtUserName());
+        users.setPassword(upateUserModel.getAppAccountPwd());
+        users.setPhone(upateUserModel.getIdtUserMobile());
+        users.setIamId(upateUserModel.getIdtUserId());
+        users.setStatus(upateUserModel.getAppAccountStatus());
+        users.setIsdeleted(Constants.ZERO);
+        users.setRemark(JSONObject.toJSONString(upateUserModel));
+        if( upateUserModel.getUserTypes() !=null){
+            for(IamUserTypeModel type : upateUserModel.getUserTypes()){
+                if(StringUtils.isNotBlank(users.getUserTypes())){
+                    users.setUserTypes("");
+                }
+                users.setUserTypes("["+users.getUserTypes()+type.getIdtUserTypeCode()+"];");
+            }
+        }
+        if( upateUserModel.getRoles() !=null){
+            for(IamUserRoleModel t : upateUserModel.getRoles()){
+                if(StringUtils.isNotBlank(users.getRoleIds())){
+                    users.setRoleIds("");
+                }
+                if(StringUtils.isNotBlank(users.getRoleNames())){
+                    users.setRoleNames("");
+                }
+                users.setRoleIds("["+users.getRoleIds()+t.getId()+"];");
+                users.setRoleNames("["+users.getRoleNames()+t.getName()+"];");
+            }
+        }
+        if(upateUserModel.getJobs()!=null){
+            String orgId = null;
+            for(IamUserJobModel job : upateUserModel.getJobs()){
+                if(StringUtils.equals(job.getFirstLevelType(),Constants.TWO+"")){
+                    orgId = job.getOrgId();
+                    break;
+                }
+            }
+            users.setIamOrgId(orgId);
+            if(orgId !=null){
+                Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda()
+                        .eq(Shop::getOrgId,orgId)
+                        .last("limit 1"));
+                users.setDepartmentId(shop.getId());
+            }
+
+        }
+
+        return  users;
+
+    }
+
+    public  String getToken(String uuid,String time) {
+        String appid = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.IAM_APPID);
+        String appKey =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.IAM_APPKEY) ;
+        String token = JWT.create().withIssuer(appid).withIssuedAt(DateUtil.getDateFromString(time)).withJWTId(uuid).sign(Algorithm.HMAC256(appKey));
+        token = String.join(" ", "Bearer", token);
+        return  token;
+    }
+    @Override
+    @Async
+    public  void  saveInterfaceLog(String url,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone){
+            Map<String,Object> map = new HashMap<>();
+            map.put("token",token);
+            map.put("uuid",uuid);
+            map.put("timestamp",timestamp);
+            map.put("data", obj);
+            IamInterfaceLog log = new IamInterfaceLog();
+            log.setCreateDate(new Date());
+            log.setUrl(url);
+            log.setEditDate(log.getCreateDate());
+            log.setPlat(Constants.ZERO);
+            log.setName(name);
+            log.setIsdeleted(Constants.ZERO);
+            log.setRequest(JSONObject.toJSONString(map));
+            log.setType(Constants.ONE);
+            log.setSuccess(success);
+            log.setRepose(respone);
+            iamInterfaceLogMapper.insert(log);
+    }
+}
diff --git a/server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
similarity index 66%
copy from server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java
copy to server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
index 4b1bf8c..0ea7258 100644
--- a/server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
@@ -1,5 +1,6 @@
-package com.doumee.service.zbom;
+package com.doumee.biz.zbom.impl;
 
+import com.doumee.biz.zbom.ZbomZhongTaiService;
 import com.doumee.dao.business.MemberMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -10,7 +11,7 @@
  * @date 2023/11/30 15:33
  */
 @Service
-public class ZbomZhongTaiService {
+public class ZbomZhongTaiServiceImpl implements ZbomZhongTaiService {
 
     @Autowired
     private MemberMapper memberMapper;
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamCategoryModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamCategoryModel.java
new file mode 100644
index 0000000..3683a6f
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamCategoryModel.java
@@ -0,0 +1,92 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("蹇楅偊IAM缁勭粐鏇存柊鎺ㄩ�丼code鍙傛暟")
+public class IamCategoryModel {
+    @JsonProperty("relevanceCode")
+    @SerializedName("relevanceCode")
+    @ApiModelProperty(value = "涓�浣撳晢鐮侊紙s鐮�)")
+    private String relevanceCode;
+    @JsonProperty("customerNumber")
+    @ApiModelProperty(value = "鍔犵洘鍟嗙紪鐮�")
+    @SerializedName("customerNumber")
+    private String customerNumber;
+    @JsonProperty("accountSiteId")
+    @ApiModelProperty(value = "鍝佺墝id")
+    @SerializedName("accountSiteId")
+    private String accountSiteId;
+    @JsonProperty("siteCode")
+    @ApiModelProperty(value = "瀹㈡埛绫诲瀷")
+    @SerializedName("siteCode")
+    private String siteCode;
+    @JsonProperty("cityAddress")
+    @ApiModelProperty(value = "钀ラ攢鍩庡競")
+    @SerializedName("cityAddress")
+    private String cityAddress;
+    @JsonProperty("unitCode")
+    @ApiModelProperty(value = "鍝佺墝Code")
+    @SerializedName("unitCode")
+    private String unitCode;
+    @JsonProperty("territoryId")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙id路")
+    @SerializedName("territoryId")
+    private String territoryId;
+    @JsonProperty("segment1")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙-涓績缂栫爜")
+    @SerializedName("segment1")
+    private String segment1;
+    @JsonProperty("segment2")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙-鐪佸尯缂栫爜")
+    @SerializedName("segment2")
+    private String segment2;
+    @JsonProperty("segment3")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙-鐗囧尯缂栫爜")
+    @SerializedName("segment3")
+    private String segment3;
+    @JsonProperty("meaning1")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙-涓績")
+    @SerializedName("meaning1")
+    private String meaning1;
+    @JsonProperty("meaning2")
+    @ApiModelProperty(value = "钀ラ攢鍖哄煙-鐪佸尯")
+    @SerializedName("meaning2")
+    private String meaning2;
+    @JsonProperty("meaning3")
+    @ApiModelProperty(value = "閿�鍖哄煙-鐗囧尯")
+    @SerializedName("meaning3")
+    private String meaning3;
+    @JsonProperty("shipToPerson")
+    @ApiModelProperty(value = "鏀惰揣浜�")
+    @SerializedName("shipToPerson")
+    private String shipToPerson;
+    @JsonProperty("shipToAddress")
+    @ApiModelProperty(value = "鏀惰揣鍦板潃")
+    @SerializedName("shipToAddress")
+    private String shipToAddress;
+    @JsonProperty("shipToPhone")
+    @ApiModelProperty(value = "鏀惰揣浜哄彿鐮�")
+    @SerializedName("shipToPhone")
+    private String shipToPhone;
+    @JsonProperty("operationStatus")
+    @ApiModelProperty(value = "鍝佺墝鐘舵��:NORMAL 姝e父锛孨O-ORDER 涓涓嬪崟锛孨O-SHIPMENT 涓鍙戣揣锛孴ERMINATED  缁堟")
+    @SerializedName("operationStatus")
+    private String operationStatus;
+    @JsonProperty("oldAccountNumber")
+    @ApiModelProperty(value = "瀵瑰簲鍔犵洘鍟�")
+    @SerializedName("oldAccountNumber")
+    private String oldAccountNumber;
+    @JsonProperty("relation")
+    @ApiModelProperty(value = "涓�浣撳晢鎿嶄綔锛�1 鏂板銆�2 鍚堝苟銆�3 鍙樻洿銆�4 浼樺寲")
+    @SerializedName("relation")
+    private String relation;
+    @JsonProperty("solutionId")
+    @ApiModelProperty(value = "solutionId")
+    @SerializedName("solutionId")
+    private String solutionId;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamFcodeModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamFcodeModel.java
new file mode 100644
index 0000000..084ba42
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamFcodeModel.java
@@ -0,0 +1,96 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("蹇楅偊IAM缁勭粐鏇存柊鎺ㄩ�丼code鍙傛暟")
+public class IamFcodeModel {
+    @JsonProperty("relevanceCode")
+    @SerializedName("relevanceCode")
+    @ApiModelProperty(value = "涓�浣撳晢鐮侊紙s鐮�)")
+    private String relevanceCode;
+    @JsonProperty("custAccountId")
+    @SerializedName("custAccountId")
+    @ApiModelProperty(value = "鍔犵洘鍟唅d")
+    private String custAccountId;
+    @JsonProperty("customerNumber")
+    @ApiModelProperty(value = "鍔犵洘鍟嗙紪鐮�")
+    @SerializedName("customerNumber")
+    private String customerNumber;
+    @JsonProperty("customerName")
+    @ApiModelProperty(value = "鍔犵洘鍟嗗悕绉�")
+    @SerializedName("customerName")
+    private String customerName;
+    @JsonProperty("customerShortName")
+    @ApiModelProperty(value = "鍔犵洘鍟嗙畝绉�")
+    @SerializedName("customerShortName")
+    private String customerShortName;
+    @JsonProperty("registrationAddress")
+    @ApiModelProperty(value = "娉ㄥ唽鍦板潃")
+    @SerializedName("registrationAddress")
+    private String registrationAddress;
+    @JsonProperty("country")
+    @ApiModelProperty(value = "鍥藉")
+    @SerializedName("country")
+    private String country;
+    @JsonProperty("provinceNum")
+    @ApiModelProperty(value = "鐪佸尯缂栫爜路")
+    @SerializedName("provinceNum")
+    private String provinceNum;
+    @JsonProperty("provinceName")
+    @ApiModelProperty(value = "鐪佸尯鍚嶇О")
+    @SerializedName("provinceName")
+    private String provinceName;
+    @JsonProperty("cityNum")
+    @ApiModelProperty(value = "甯傜紪鐮�")
+    @SerializedName("cityNum")
+    private String cityNum;
+    @JsonProperty("cityName")
+    @ApiModelProperty(value = "甯傚悕绉�")
+    @SerializedName("cityName")
+    private String cityName;
+    @JsonProperty("countyNum")
+    @ApiModelProperty(value = "鍖哄幙缂栫爜")
+    @SerializedName("countyNum")
+    private String countyNum;
+    @JsonProperty("countyName")
+    @ApiModelProperty(value = "鍖哄幙鍚嶇О")
+    @SerializedName("countyName")
+    private String countyName;
+    @JsonProperty("town")
+    @ApiModelProperty(value = "涔¢晣")
+    @SerializedName("town")
+    private String town;
+    @JsonProperty("status")
+    @ApiModelProperty(value = "鐘舵�� 涓彴鍙戝竷鐨勭姸鎬侊紝瀵逛笅娓哥郴缁熸棤鎰忎箟锛屼笅娓哥郴缁熷彲涓嶆帴")
+    @SerializedName("status")
+    private String status;
+    @JsonProperty("contactPhone")
+    @ApiModelProperty(value = "娉曚汉鎵嬫満鍙风爜")
+    @SerializedName("contactPhone")
+    private String contactPhone;
+    @JsonProperty("legalPerson")
+    @ApiModelProperty(value = "娉曚汉")
+    @SerializedName("legalPerson")
+    private String legalPerson;
+    @JsonProperty("legalIdentification")
+    @ApiModelProperty(value = "娉曚汉韬唤璇佸彿鐮�")
+    @SerializedName("legalIdentification")
+    private String legalIdentification;
+    @JsonProperty("accountOwner")
+    @ApiModelProperty(value = "瀹炴帶浜�")
+    @SerializedName("accountOwner")
+    private String accountOwner;
+    @JsonProperty("accountIdentification")
+    @ApiModelProperty(value = "瀹炴帶浜鸿韩浠借瘉")
+    @SerializedName("accountIdentification")
+    private String accountIdentification;
+    @JsonProperty("taxRegistrationNum")
+    @ApiModelProperty(value = "绾崇◣鐧昏璇佸彿鐮�")
+    @SerializedName("taxRegistrationNum")
+    private String taxRegistrationNum;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamScodeModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamScodeModel.java
new file mode 100644
index 0000000..ebdefea
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamScodeModel.java
@@ -0,0 +1,68 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("蹇楅偊IAM缁勭粐鏇存柊鎺ㄩ�丼code鍙傛暟")
+public class IamScodeModel {
+    @JsonProperty("relevanceCode")
+    @SerializedName("relevanceCode")
+    @ApiModelProperty(value = "涓�浣撳晢鐮侊紙s鐮�)")
+    private String relevanceCode;
+    @JsonProperty("relevanceName")
+    @SerializedName("relevanceName")
+    @ApiModelProperty(value = "涓�浣撳晢鍚嶇О")
+    private String relevanceName;
+    @JsonProperty("relevanceStatus")
+    @ApiModelProperty(value = "涓�浣撳晢鐘舵��:NORMAL 姝e父锛孴ERMINATED  缁堟")
+    @SerializedName("relevanceStatus")
+    private String relevanceStatus;
+    @JsonProperty("relevanceZCode")
+    @ApiModelProperty(value = "relevanceZCode")
+    @SerializedName("relevanceZCode")
+    private String relevanceZCode;
+    @JsonProperty("relevanceCodeGL")
+    @ApiModelProperty(value = "鍏宠仈S鐮�")
+    @SerializedName("relevanceCodeGL")
+    private String relevanceCodeGL;
+    @JsonProperty("relevanceNameGL")
+    @ApiModelProperty(value = "鍏宠仈S鐮佸悕绉�")
+    @SerializedName("relevanceNameGL")
+    private String relevanceNameGL;
+    @JsonProperty("country")
+    @ApiModelProperty(value = "鍥藉")
+    @SerializedName("country")
+    private String country;
+    @JsonProperty("provinceNum")
+    @ApiModelProperty(value = "鐪佸尯缂栫爜路")
+    @SerializedName("provinceNum")
+    private String provinceNum;
+    @JsonProperty("provinceName")
+    @ApiModelProperty(value = "鐪佸尯鍚嶇О")
+    @SerializedName("provinceName")
+    private String provinceName;
+    @JsonProperty("cityNum")
+    @ApiModelProperty(value = "甯傜紪鐮�")
+    @SerializedName("cityNum")
+    private String cityNum;
+    @JsonProperty("cityName")
+    @ApiModelProperty(value = "甯傚悕绉�")
+    @SerializedName("cityName")
+    private String cityName;
+    @JsonProperty("countyNum")
+    @ApiModelProperty(value = "鍖哄幙缂栫爜")
+    @SerializedName("countyNum")
+    private String countyNum;
+    @JsonProperty("countyName")
+    @ApiModelProperty(value = "鍖哄幙鍚嶇О")
+    @SerializedName("countyName")
+    private String countyName;
+    @JsonProperty("town")
+    @ApiModelProperty(value = "涔¢晣")
+    @SerializedName("town")
+    private String town;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamShopModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamShopModel.java
new file mode 100644
index 0000000..eb73b34
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamShopModel.java
@@ -0,0 +1,44 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("蹇楅偊IAM缁勭粐鏇存柊鎺ㄩ�丼code鍙傛暟")
+public class IamShopModel {
+    @JsonProperty("relevanceCode")
+    @SerializedName("relevanceCode")
+    @ApiModelProperty(value = "涓�浣撳晢鐮侊紙s鐮�)")
+    private String relevanceCode;
+    @JsonProperty("shopShortName")
+    @SerializedName("shopShortName")
+    @ApiModelProperty(value = "搴楅潰鍚嶇О")
+    private String shopShortName;
+    @JsonProperty("status")
+    @ApiModelProperty(value = "搴楅潰鐘舵�侊細1 姝e父 2 缁堟")
+    @SerializedName("status")
+    private String status;
+    @JsonProperty("unitCode")
+    @ApiModelProperty(value = "鍝佺墝Code")
+    @SerializedName("unitCode")
+    private String unitCode;
+    @JsonProperty("accountNumber")
+    @ApiModelProperty(value = "鍔犵洘鍟嗙紪鐮�")
+    @SerializedName("accountNumber")
+    private String accountNumber;
+    @JsonProperty("relevanceNameGL")
+    @ApiModelProperty(value = "鍏宠仈S鐮佸悕绉�")
+    @SerializedName("relevanceNameGL")
+    private String relevanceNameGL;
+    @JsonProperty("statusOld")
+    @ApiModelProperty(value = "搴楅潰鐘舵�侊細1 姝e父 2 缁堟")
+    @SerializedName("statusOld")
+    private String statusOld;
+    @JsonProperty("provinceNum")
+    @ApiModelProperty(value = "鐪佸尯缂栫爜路")
+    @SerializedName("provinceNum")
+    private String idtOrgCode;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateShopModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateShopModel.java
new file mode 100644
index 0000000..f0b3c0b
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateShopModel.java
@@ -0,0 +1,107 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("蹇楅偊IAM缁勭粐鏇存柊鎺ㄩ�佸弬鏁�")
+public class IamUpateShopModel implements Serializable {
+    @JsonProperty("idt_org__id")
+    @SerializedName("idt_org__id")
+    @ApiModelProperty(value = "閮ㄩ棬ID")
+    private String idtOrgId;
+    @JsonProperty("idt_org__old_id")
+    @SerializedName("idt_org__old_id")
+    @ApiModelProperty(value = "U瀹㈢粍缁嘔D锛屽瓨鏀綰瀹㈣�佺殑缁勭粐id锛屽鏋滄槸IAM鏂板鐨勭粍缁囷紝璇ュ瓧娈靛�间负绌恒��")
+    private String idtOrgOldId;
+    @JsonProperty("idt_org__name")
+    @ApiModelProperty(value = "閮ㄩ棬鍚嶇О")
+    @SerializedName("idt_org__name")
+    private String idtOrgName;
+    @JsonProperty("idt_org__parent_id")
+    @ApiModelProperty(value = "涓婄骇缁勭粐ID")
+    @SerializedName("idt_org__parent_id")
+    private String idtOrgParentId;
+    @JsonProperty("idt_org__remark")
+    @ApiModelProperty(value = "澶囨敞")
+    @SerializedName("idt_org__remark")
+    private String idtOrgRemark;
+    @JsonProperty("idt_org__status")
+    @ApiModelProperty(value = "鐘舵�� 0鍋滅敤锛�1姝e父锛�-1鍒犻櫎")
+    @SerializedName("idt_org__status")
+    private String idtOrgStatus;
+    @JsonProperty("idt_org__order_num")
+    @ApiModelProperty(value = "鏄剧ず鎺掑簭")
+    @SerializedName("idt_org__order_num")
+    private String idtOrgOrderNum;
+    @JsonProperty("idt_org__org_code")
+    @ApiModelProperty(value = "缁勭粐缂栫爜路")
+    @SerializedName("idt_org__org_code")
+    private String idtOrgCode;
+    @JsonProperty("idt_org__sup_org_code")
+    @ApiModelProperty(value = "涓婄骇缁勭粐缂栫爜")
+    @SerializedName("idt_org__sup_org_code")
+    private String idtOrgSupOrgCode;
+    @JsonProperty("idt_org__source_code")
+    @ApiModelProperty(value = "瀛樻斁S,F锛屽簵闈㈠疄浣撶紪鐮佺瓑")
+    @SerializedName("idt_org__source_code")
+    private String idtOrgSourceCode;
+    @JsonProperty("idt_org__first_level_type")
+    @ApiModelProperty(value = "銆愪竴绾х粍缁囩被鍨嬨�戯紙1:HR銆�2:鍔犵洘鍟嗐��3:铏氭嫙缁勭粐锛�")
+    @SerializedName("idt_org__first_level_type")
+    private Integer idtOrgFirstLevelType;
+    @JsonProperty("idt_org__second_level_type")
+    @ApiModelProperty(value = "浜岀骇缁勭粐绫诲瀷銆�(1:S(鍔�) , 2:F(鍔�) ,3:搴楅潰(鍔�)锛�4:閮ㄩ棬(HR/鍔�)锛�5:铏氭嫙搴楅潰(鍔�/铏�) ")
+    @SerializedName("idt_org__second_level_type")
+    private Integer idtOrgSecondLevelType;
+    @JsonProperty("idt_org__org_attribute")
+    @ApiModelProperty(value = "銆愰儴闂ㄥ睘鎬с�戯紙1:瀹炰綋搴楅潰銆�2:铏氭嫙搴楅潰銆�3:鐢靛晢閮ㄣ��4:娓犻亾閮ㄣ��5:璐㈠姟閮級")
+    @SerializedName("idt_org__org_attribute")
+    private Integer idtOrgAttribute;
+    @JsonProperty("idt_org__work_weixin_id")
+    @ApiModelProperty(value = "浼佷笟寰俊缁勭粐ID")
+    @SerializedName("idt_org__work_weixin_id")
+    private String idtOrgWorkWeixinId;
+    @JsonProperty("idt_org__dingding_department_id")
+    @ApiModelProperty(value = "閽夐拤閮ㄩ棬ID")
+    @SerializedName("idt_org__dingding_department_id")
+    private String idtOrgDingdingDepartId;
+    @JsonProperty("idt_org__create_time")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @SerializedName("idt_org__create_time")
+    private String idtOrgCreateTime;
+    @JsonProperty("idt_org__creator")
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    @SerializedName("idt_org__creator")
+    private String idtOrgCreator;
+    @JsonProperty("idt_org__updater")
+    @ApiModelProperty(value = "淇敼浜�")
+    @SerializedName("idt_org__updater")
+    private String idtOrgUpdater;
+    @JsonProperty("idt_org__update_time")
+    @ApiModelProperty(value = "淇敼鏃堕棿")
+    @SerializedName("idt_org__update_time")
+    private String idtOrgUpdateTime;
+    @JsonProperty("scode")
+    @ApiModelProperty(value = "S鐮佷俊鎭� 褰搃dt_org__second_level_type 涓篠鏃讹紝scode鏈夊�硷紝鍚﹀垯鏄痭ull")
+    @SerializedName("scode")
+    private IamScodeModel scode;
+    @JsonProperty("fcode")
+    @ApiModelProperty(value = "F鐮佷俊鎭� 褰搃dt_org__second_level_type 涓篎鏃讹紝fcode鏈夊�硷紝鍚﹀垯鏄痭ull")
+    @SerializedName("fcode")
+    private IamFcodeModel fcode;
+    @JsonProperty("shop")
+    @ApiModelProperty(value = "搴楅潰淇℃伅 褰搃dt_org__second_level_type 涓哄簵闈㈡椂锛宑ode鏈夊�硷紝鍚﹀垯鏄痭ull")
+    @SerializedName("shop")
+    private IamShopModel shop;
+    @JsonProperty("category")
+    @ApiModelProperty(value = "鍝佺被淇℃伅 褰搃dt_org__second_level_type 涓篎鏃讹紝ccategory鏈夊�硷紝鍚﹀垯鏄痆]")
+    @SerializedName("category")
+    private List<IamCategoryModel> category;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateUserModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateUserModel.java
new file mode 100644
index 0000000..e3964f8
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateUserModel.java
@@ -0,0 +1,120 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("蹇楅偊IAM浜哄憳璐﹀彿鏇存柊鎺ㄩ�佸弬鏁�")
+public class IamUpateUserModel implements Serializable {
+    /**
+     * 鐗瑰埆璇存槑锛氫笅娓哥郴缁熷湪鎺ユ敹鎶ユ枃锛屾牴鎹甶dt_user__id鍒ゅ畾璐﹀彿鏄柊澧炶繕鏄慨鏀癸紝杩涜璐﹀彿鏂板鎴栬�呬慨鏀规椂锛屽厛鍒ゆ柇idt_user__id锛圛AM鐢ㄦ埛涓婚敭锛夊湪涓嬫父iamid锛堝垵濮嬪寲鏃堕渶缁存姢iamid锛変腑鏄惁瀛樺湪:
+     * 瀛樺湪锛屽垯闇�瑕佸啀鏍规嵁鎺ㄩ�佺殑鐧诲綍璐﹀彿(app_account__account_no)鍘绘暟鎹簱鏌ヨ鐧诲綍璐﹀彿锛屽鏋滄煡璇㈢殑缁撴灉鏄� 1鏉℃暟鎹苟涓� id 璺熷綋鍓嶆帹閫佺敤鎴� id 鐩稿悓锛屽垯鏇存柊褰撳墠鏁版嵁锛屽惁鍒欐彁绀衡�滆鐢ㄦ埛绯荤粺宸茬粡瀛樺湪锛屾洿鏂板け璐モ��;
+     * 涓嶅瓨鍦紝涔熼渶瑕佹瘮瀵圭櫥褰曡处鍙�(app_account__account_no)鏄惁璺熷叾瀹冭处鍙风殑鐧诲綍璐﹀彿鐩稿悓,濡傛灉鐩稿悓锛屾彁绀衡�滆鐢ㄦ埛绯荤粺宸茬粡瀛樺湪锛屾柊澧炲け璐モ��:濡傛灉涓嶅瓨鍦紝鍒欐柊澧炴暟鎹��
+     */
+    @JsonProperty("idt_user__id")
+    @SerializedName("idt_user__id")
+    @ApiModelProperty(value = "IAM鐢ㄦ埛涓婚敭")
+    private String idtUserId;
+    @JsonProperty("idt_user__old_id")
+    @SerializedName("idt_user__old_id")
+    @ApiModelProperty(value = "鐢ㄦ埛鑰佺殑涓婚敭id锛屽瓨鏀綰瀹㈣�佺敤鎴穒d锛屽鏋滄槸IAM鏂板鐨勭敤鎴凤紝璇ュ瓧娈靛�间负绌猴紝涓嬫父绯荤粺濡傛灉浣跨敤U瀹㈢殑鐢ㄦ埛id浣滀负涓氬姟澶勭悊閫昏緫鐨勪緷鎹紝闇�瑕佸悓姝ヨ瀛楁")
+    private String idtUserOldId;
+    @JsonProperty("app_account__app_id")
+    @ApiModelProperty(value = "搴旂敤id锛屼笅娓哥郴缁熷彲涓嶅叧蹇�")
+    @SerializedName("app_account__app_id")
+    private String appAccountAppId;
+    @JsonProperty("idt_org__parent_id")
+    @ApiModelProperty(value = "涓婄骇缁勭粐ID")
+    @SerializedName("idt_org__parent_id")
+    private String idtOrgParentId;
+    @JsonProperty("app_account__account_no")
+    @ApiModelProperty(value = "鐢ㄦ埛璐﹀彿锛岃鐪嬬壒鍒鏄�")
+    @SerializedName("app_account__account_no")
+    private String appAccountNo;
+    @JsonProperty("app_account__account_pwd")
+    @ApiModelProperty(value = "瀵嗙爜")
+    @SerializedName("app_account__account_pwd")
+    private String appAccountPwd;
+    @JsonProperty("idt_user__user_name")
+    @ApiModelProperty(value = "濮撳悕")
+    @SerializedName("idt_user__user_name")
+    private String idtUserName;
+    @JsonProperty("idt_user__gender")
+    @ApiModelProperty(value = "鎬у埆 0鐢� 1濂陈�")
+    @SerializedName("idt_user__gender")
+    private String idtUserGender;
+    @JsonProperty("idt_user__email")
+    @ApiModelProperty(value = "浼佷笟閭")
+    @SerializedName("idt_user__email")
+    private String idtUserEmail;
+    @JsonProperty("idt_user__mobile")
+    @ApiModelProperty(value = "鎵嬫満鍙风爜锛岃鐪嬬壒鍒鏄�")
+    @SerializedName("idt_user__mobile")
+    private String idtUserMobile;
+    @JsonProperty("idt_user__uc_job_id")
+    @ApiModelProperty(value = "U瀹㈠矖浣峣d")
+    @SerializedName("idt_user__uc_job_id")
+    private String idtUserUcJobId;
+    @JsonProperty("idt_org__second_level_type")
+    @ApiModelProperty(value = "浜岀骇缁勭粐绫诲瀷銆�(1:S(鍔�) , 2:F(鍔�) ,3:搴楅潰(鍔�)锛�4:閮ㄩ棬(HR/鍔�)锛�5:铏氭嫙搴楅潰(鍔�/铏�) ")
+    @SerializedName("idt_org__second_level_type")
+    private String idtOrgSecondLevelType;
+    @JsonProperty("app_account__status")
+    @ApiModelProperty(value = "璐︽埛鐘舵�� 0鍋滅敤锛�1鍚敤")
+    @SerializedName("app_account__status")
+    private String appAccountStatus;
+    @JsonProperty("app_account__creator")
+    @ApiModelProperty(value = "鍒涘缓鑰�")
+    @SerializedName("app_account__creator")
+    private String appAccountCreator;
+    @JsonProperty("app_account__create_time")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @SerializedName("app_account__create_time")
+    private String appAccountCreateTime;
+    @JsonProperty("app_account__updater")
+    @ApiModelProperty(value = "鏇存柊鑰�")
+    @SerializedName("app_account__updater")
+    private String appAccountUpdater;
+    @JsonProperty("app_account__update_time")
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @SerializedName("app_account__update_time")
+    private String appAccountUpdateTime;
+    @JsonProperty("idt_user__work_no")
+    @ApiModelProperty(value = "宸ュ彿锛岃鐪嬬壒鍒鏄�")
+    @SerializedName("idt_user__work_no")
+    private String idtUserWorkNo;
+    @JsonProperty("idt_user__ding_id")
+    @ApiModelProperty(value = "閽夐拤鐢ㄦ埛ID")
+    @SerializedName("idt_user__ding_id")
+    private String idtUserDingdingId;
+    @JsonProperty("userTypes")
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛屼骇鍝佹敮鎸佷竴浜哄涓敤鎴风被鍨�")
+    @SerializedName("userTypes")
+    private List<IamUserTypeModel> userTypes;
+    @JsonProperty("idt_org__updater")
+    @ApiModelProperty(value = "鐢ㄦ埛绫诲瀷锛屼骇鍝佹敮鎸佷竴浜哄涓敤鎴风被鍨�")
+    @SerializedName("idt_org__updater")
+    private String idtOrgUpdater;
+    @JsonProperty("work_weixin_id")
+    @ApiModelProperty(value = "浼佷笟寰俊鐢ㄦ埛openId")
+    @SerializedName("work_weixin_id")
+    private String workWeixinId;
+    @JsonProperty("roles")
+    @ApiModelProperty(value = "璐﹀彿鍖呭惈鐨勮鑹蹭俊鎭紝鏀寔澶氫釜")
+    @SerializedName("roles")
+    private List<IamUserRoleModel> roles;
+    @JsonProperty("orgs")
+    @ApiModelProperty(value = "缁勭粐淇℃伅 涓嬫父绯荤粺鍙笉鍏冲績锛岄�氳繃jobs灞炴�у彲浠ュ彇鍒扮粍缁囦俊鎭�")
+    @SerializedName("orgs")
+    private List<IamUserOrgModel> orgs;
+    @JsonProperty("jobs")
+    @ApiModelProperty(value = "澶氱粍缁囧矖浣嶄俊鎭�")
+    @SerializedName("jobs")
+    private List<IamUserJobModel> jobs;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserJobModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserJobModel.java
new file mode 100644
index 0000000..b58e30f
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserJobModel.java
@@ -0,0 +1,26 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("蹇楅偊IAM浜哄憳璐﹀彿宀椾綅鍙傛暟")
+public class IamUserJobModel implements Serializable {
+    @JsonProperty("idt_user_job_link__org_id")
+    @SerializedName("idt_user_job_link__org_id")
+    @ApiModelProperty(value = "缁勭粐id")
+    private String orgId;
+    @JsonProperty("idt_org__first_level_type")
+    @SerializedName("idt_org__first_level_type")
+    @ApiModelProperty(value = "銆愪竴绾х粍缁囩被鍨嬨�戯紙1:HR銆�2:鍔犵洘鍟嗐��3:铏氭嫙缁勭粐锛�")
+    private String firstLevelType;
+    @JsonProperty("idt_user_job_link__job_id")
+    @SerializedName("idt_user_job_link__job_id")
+    @ApiModelProperty(value = "宀椾綅Id")
+    private String jobId;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserOrgModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserOrgModel.java
new file mode 100644
index 0000000..ecb83bf
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserOrgModel.java
@@ -0,0 +1,42 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("蹇楅偊IAM浜哄憳璐﹀彿鎵�灞炵粍缁囧弬鏁�")
+public class IamUserOrgModel implements Serializable {
+    @JsonProperty("idt_org__id")
+    @SerializedName("idt_org__id")
+    @ApiModelProperty(value = "缁勭粐id")
+    private String orgId;
+    @JsonProperty("idt_org__first_level_type")
+    @SerializedName("idt_org__first_level_type")
+    @ApiModelProperty(value = "銆愪竴绾х粍缁囩被鍨嬨�戯紙1:HR銆�2:鍔犵洘鍟嗐��3:铏氭嫙缁勭粐锛�")
+    private String firstLevelType;
+    @JsonProperty("idt_org__second_level_type")
+    @SerializedName("idt_org__second_level_type")
+    @ApiModelProperty(value = "銆愪簩绾х粍缁囩被鍨嬨��")
+    private String secondLevelType;
+    @JsonProperty("  idt_org__old_id")
+    @SerializedName("  idt_org__old_id")
+    @ApiModelProperty(value = "鑰両d")
+    private String orgOldId;
+    @JsonProperty("  idt_org__name")
+    @SerializedName("  idt_org__name")
+    @ApiModelProperty(value = "缁勭粐鍚嶇О")
+    private String orgName;
+    @JsonProperty("idt_org__org_code")
+    @SerializedName("idt_org__org_code")
+    @ApiModelProperty(value = "缁勭粐缂栫爜")
+    private String   orgCode;
+    @JsonProperty("  idt_org__parent_id")
+    @SerializedName("  idt_org__parent_id")
+    @ApiModelProperty(value = "涓婄骇id")
+    private String orgParentId;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserRoleModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserRoleModel.java
new file mode 100644
index 0000000..13fc26c
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserRoleModel.java
@@ -0,0 +1,26 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel("蹇楅偊IAM浜哄憳璐﹀彿瑙掕壊鍙傛暟")
+public class IamUserRoleModel implements Serializable {
+    @JsonProperty("id")
+    @SerializedName("id")
+    @ApiModelProperty(value = "瑙掕壊id")
+    private String id;
+    @JsonProperty("name")
+    @SerializedName("name")
+    @ApiModelProperty(value = "瑙掕壊鍚嶇О")
+    private String name;
+    @JsonProperty("code")
+    @SerializedName("code")
+    @ApiModelProperty(value = "瑙掕壊code")
+    private String code;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserTypeModel.java b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserTypeModel.java
new file mode 100644
index 0000000..b684ac8
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/IamUserTypeModel.java
@@ -0,0 +1,19 @@
+package com.doumee.biz.zbom.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("蹇楅偊IAM浜哄憳璐﹀彿绫诲瀷鍙傛暟")
+public class IamUserTypeModel implements Serializable {
+    @JsonProperty("idt_user_type__code")
+    @SerializedName("idt_user_type__code")
+    @ApiModelProperty(value = "鐢ㄦ埛鏍囪锛堢敤鎴风被鍨嬶紝鍖哄垎HR鍐呴儴鍛樺伐鍜屽姞鐩熷晢鍛樺伐锛�10001鍔犵洘鍟嗭紝10002HR鍐呴儴鍛樺伐")
+    private String idtUserTypeCode;
+}
diff --git a/server/service/src/main/java/com/doumee/core/utils/Constants.java b/server/service/src/main/java/com/doumee/core/utils/Constants.java
index 9f53934..a1b0928 100644
--- a/server/service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,6 +1,8 @@
 package com.doumee.core.utils;
 
 
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.dao.business.vo.UnitCodeVo;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -11,9 +13,8 @@
 import java.math.BigDecimal;
 import java.net.URLDecoder;
 import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import  java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -82,6 +83,10 @@
     public static final String ORG_USER_ORIGIN = "ORG_USER_ORIGIN";
     public static final String VIRTUAL_CARD_INDEX = "02098469790";
     public static final String RETRY_CONNECT_NUM ="RETRY_CONNECT_NUM" ;
+    public static final String UNIT_CODE = "UNIT_CODE" ;
+    public static final String ZBOM = "ZBOM" ;
+    public static final String ZBOM_IAM_APPKEY = "ZBOM_IAM_APPKEY";
+    public static final String ZBOM_IAM_APPID = "ZBOM_IAM_APPID";
     public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
     public static  boolean DEALING_HK_SYNCDEVICE = false;
     public static  boolean DEALING_HK_SYNCDEVICE_STATUS = false;
@@ -279,6 +284,8 @@
     public interface RedisKeys {
         public static final String IMPORTING_MEMBER ="IMPORTING_MEMBER";
         public static final String IMPORTING_SHOP ="IMPORTING_SHOP";
+        public static final String IAM_APPID ="IAM_APPID";
+        public static final String IAM_APPKEY ="IAM_APPKEY";
         public static final String SHOP_TREE ="SHOP_TREE";
         public static final String ERP_TOKEN ="ERP_TOKEN";
         public static final long EXPIRE_TIME = 7200;
@@ -426,9 +433,34 @@
 
     public static void main(String[] args) {
         System.out.println((DESUtil.decrypt(Constants.EDS_PWD, "En35O2o+Mpw5bThqkT8lmE6UPG+W6LFs")));
-//        System.out.println(Constants.getVehiclePlateNo("婀楤140D17").getDescription());
-//        System.out.println(Constants.getVehiclePlateNo("瀹緼P0637").getDescription());
 
+        Map<String,String> map = new HashMap<>();
+        map.put("101","蹇楅偊鏈儴");
+        map.put("102","鍒堕�犱簨涓氶儴");
+        map.put("103","鑲ヤ笢閿�鍞叕鍙�");
+        map.put("104","ZB/蹇楅偊鍘ㄦ煖");
+        map.put("105","鍟嗗搧浜嬩笟閮�");
+        map.put("106","宸㈡箹閿�鍞叕鍙�");
+        map.put("107","IK/鍏ㄥ眿瀹氬埗");
+        map.put("108","宸ョ▼浜嬩笟閮�");
+        map.put("109","鍚堣偉閿�鍞叕鍙�");
+        map.put("110","澶栬锤浜嬩笟閮�");
+        map.put("111","蹇楅偊瀹跺眳鍏徃");
+        map.put("112","ZB/蹇楅偊琛f煖");
+        map.put("127","蹇楅偊鍘ㄦ煖鑲′唤鏈夐檺鍏徃");
+        map.put("141","鍚堣偉蹇楅偊鏈ㄤ笟鏈夐檺鍏徃");
+        map.put("161","ZB/蹇楅偊鏈ㄩ棬");
+        map.put("263","鍥借锤鍏徃");
+        List<UnitCodeVo> list = new ArrayList<>();
+        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Map.Entry<String, String> entry = iterator.next();
+            UnitCodeVo m = new UnitCodeVo();
+            m.setCode(entry.getKey());
+            m.setName(entry.getValue());
+            list.add(m);
+        }
+System.out.println(JSONObject.toJSONString(list));
         
     }
 
diff --git a/server/service/src/main/java/com/doumee/dao/admin/request/CategoryImport.java b/server/service/src/main/java/com/doumee/dao/admin/request/CategoryImport.java
new file mode 100644
index 0000000..81ea2a5
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/admin/request/CategoryImport.java
@@ -0,0 +1,46 @@
+package com.doumee.dao.admin.request;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 缁勭粐淇℃伅瀵煎叆
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("缁勭粐鍝佺被淇℃伅瀵煎叆")
+public class CategoryImport {
+    @ExcelColumn(name="缂栫爜",value = "orgId",index = 1)
+    private String orgId;
+    @ExcelColumn(name="鍝佺墝缂栫爜",value = "brandId",index = 2)
+    private String brandId;
+    @ExcelColumn(name="瀹㈡埛绫诲瀷",value = "siteCode",index = 3)
+    private String siteCode;
+    @ExcelColumn(name="钀ラ攢鍩庡競",value = "cityAddr",index = 4)
+    private String cityAddr;
+    @ExcelColumn(name="鍝佺墝",value = "unitCode",index = 5)
+    private String unitCode;
+    @ExcelColumn(name="鎴樺尯缂栫爜",value = "segId",index = 6)
+    private String segId;
+    @ExcelColumn(name="鐪佸尯缂栫爜",value = "segId2",index = 7)
+    private String segId2;
+    @ExcelColumn(name="鐗囧尯缂栫爜",value = "segId3",index =8)
+    private String segId3;
+    @ExcelColumn(name="鎴樺尯鍚嶇О",value = "segName",index = 9)
+    private String segName;
+    @ExcelColumn(name="鐪佸尯鍚嶇О",value = "segName2",index = 10)
+    private String segName2;
+    @ExcelColumn(name="鐗囧尯鍚嶇О",value = "segName3",index = 11)
+    private String segName3;
+    @ExcelColumn(name="鏀惰揣鑱旂郴浜�",value = "shipToPerson",index = 12)
+    private String shipToPerson;
+    @ExcelColumn(name="鏀惰揣鑱旂郴鐢佃瘽",value = "shipToPhone",index = 13)
+    private String shipToPhone;
+    @ExcelColumn(name="鏀惰揣鍦板潃",value = "shipToAddress",index = 14)
+    private String shipToAddress;
+    @ExcelColumn(name="scode",value = "scode",index = 15)
+    private String scode;
+}
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java b/server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java
index b9009cb..2560ff1 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -48,7 +49,19 @@
     @ApiModelProperty(value = "澶囨敞")
     @ExcelColumn(name="澶囨敞")
     private String remark;
+    @ApiModelProperty(value = "缁勭粐缂栫爜(F鐮�)")
+    @ExcelColumn(name="缁勭粐缂栫爜(F鐮侊級")
+    private String orgId;
 
+    @ApiModelProperty(value = "鍝佺墝缂栫爜")
+    @ExcelColumn(name="鍝佺墝缂栫爜")
+    private String brandId;
+    @ApiModelProperty(value = "钀ラ攢鍩庡競")
+    @ExcelColumn(name="钀ラ攢鍩庡競")
+    private String cityAddr;
+    @ApiModelProperty(value = "瀹㈡埛绫诲瀷")
+    @ExcelColumn(name="瀹㈡埛绫诲瀷")
+    private String siteCode;
     @ApiModelProperty(value = "鍝佺被缂栫爜")
     @ExcelColumn(name="鍝佺被缂栫爜")
     private String unitCode;
@@ -63,7 +76,7 @@
 
     @ApiModelProperty(value = "甯傚尯缂栫爜", example = "1")
     @ExcelColumn(name="甯傚尯缂栫爜")
-    private Integer segId3;
+    private String segId3;
 
     @ApiModelProperty(value = "鎴樺尯鍚嶇О")
     @ExcelColumn(name="鎴樺尯鍚嶇О")
@@ -74,8 +87,8 @@
     private String segName2;
 
     @ApiModelProperty(value = "甯傚尯鍚嶇О", example = "1")
-    @ExcelColumn(name="甯傚尯鍚嶇О")
-    private Integer segName3;
+    @ExcelColumn(name="甯傚尯鍚峜绉�")
+    private String segName3;
 
     @ApiModelProperty(value = "鏈�杩戝悓姝ユ椂闂�")
     @ExcelColumn(name="鏈�杩戝悓姝ユ椂闂�")
@@ -84,6 +97,9 @@
     @ApiModelProperty(value = "鏈�杩戝悓姝ュ娉�")
     @ExcelColumn(name="鏈�杩戝悓姝ュ娉�")
     private String syncInfo;
+    @ApiModelProperty(value = "鎵�灞炰竴浣撳晢code")
+    @ExcelColumn(name="鎵�灞炰竴浣撳晢code")
+    private String scode;
 
     @ApiModelProperty(value = "鏀惰揣鍦板潃")
     @ExcelColumn(name="鏀惰揣鍦板潃")
@@ -96,5 +112,16 @@
     @ApiModelProperty(value = "鏀惰揣浜虹數璇�")
     @ExcelColumn(name="鏀惰揣浜虹數璇�")
     private String shipToPhone;
-
+    @ApiModelProperty(value = "鍝佺墝鍚嶇О")
+    @ExcelColumn(name="鍝佺墝鍚嶇О")
+    @TableField(exist = false)
+    private String unitName;
+    @ApiModelProperty(value = "鍔犵洘鍟嗗悕绉�")
+    @ExcelColumn(name="鍔犵洘鍟嗗悕绉�")
+    @TableField(exist = false)
+    private String orgName;
+    @ApiModelProperty(value = "鎵�灞炰竴浣撳晢")
+    @ExcelColumn(name="鎵�灞炰竴浣撳晢")
+    @TableField(exist = false)
+    private String sname;
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java b/server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java
index 31c94dc..abea6fe 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java
@@ -60,7 +60,7 @@
 
     @ApiModelProperty(value = "鍦板潃淇℃伅")
     @ExcelColumn(name="鍦板潃淇℃伅")
-    private Date url;
+    private String url;
 
     @ApiModelProperty(value = "璇锋眰鍙傛暟")
     @ExcelColumn(name="璇锋眰鍙傛暟")
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Segments.java b/server/service/src/main/java/com/doumee/dao/business/model/Segments.java
index fc2ed0f..8eeef2f 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Segments.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Segments.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -60,6 +61,13 @@
     @ApiModelProperty(value = "涓婄骇鍖哄煙缂栫爜")
     @ExcelColumn(name="涓婄骇鍖哄煙缂栫爜")
     private String parentId;
+    @ApiModelProperty(value = "鍝佺墝")
+    @ExcelColumn(name="鍝佺墝")
+    private String unitCode;
+    @ApiModelProperty(value = "鍝佺墝鍚嶇О")
+    @ExcelColumn(name="鍝佺墝鍚嶇О")
+    @TableField(exist = false)
+    private String unitName;
 
     @ApiModelProperty(value = "鐘舵��", example = "1")
     @ExcelColumn(name="鐘舵��")
@@ -71,7 +79,7 @@
 
     @ApiModelProperty(value = "绫诲瀷 0鎴樺尯 1鐪佸尯 2甯傚尯")
     @ExcelColumn(name="绫诲瀷 0鎴樺尯 1鐪佸尯 2甯傚尯")
-    private String type;
+    private Integer type;
 
     @ApiModelProperty(value = "鏈�杩戝悓姝ユ椂闂�")
     @ExcelColumn(name="鏈�杩戝悓姝ユ椂闂�")
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Shop.java b/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
index 515b040..c58df25 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -115,11 +115,11 @@
 
     @ApiModelProperty(value = "鎵�灞炲叧鑱擣鐮�", example = "1")
     @ExcelColumn(name="鎵�灞炲叧鑱擣鐮�")
-    private Integer fcode;
+    private String fcode;
 
     @ApiModelProperty(value = "鎵�灞炲叧鑱擲鐮�", example = "1")
     @ExcelColumn(name="鎵�灞炲叧鑱擲鐮�")
-    private Integer scode;
+    private String scode;
     @ApiModelProperty(value = "娉ㄥ唽鍦�" )
     @ExcelColumn(name="娉ㄥ唽鍦�")
     private String regAddr;
@@ -200,6 +200,9 @@
     @ApiModelProperty(value = "鐖剁骇閮ㄩ棬绾у埆绫诲瀷 ", example = "1")
     @TableField(exist = false)
     private String parentType;
+    @ApiModelProperty(value = "瀹㈡埛绫诲瀷缂栫爜 ", example = "1")
+    @ExcelColumn(name="瀹㈡埛绫诲瀷缂栫爜锛屽涓娇鐢╗]鍒嗚瀛樻斁")
+    private String siteCode;
     @ApiModelProperty(value = "涓嬬骇鐩存帴閮ㄩ棬鏁伴噺 ", example = "1")
     @TableField(exist = false)
     private int childNum;
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Users.java b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
index 80b0bac..1161564 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Users.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
@@ -52,11 +52,14 @@
 
     @ApiModelProperty(value = "鎵�灞為棬搴楃紪鐮�(鍏宠仈shop琛�)", example = "1")
     @ExcelColumn(name="鎵�灞為棬搴楃紪鐮�(鍏宠仈shop琛�)")
-    private Integer departmentId;
+    private Long departmentId;
 
     @ApiModelProperty(value = "澶村儚")
     @ExcelColumn(name="澶村儚")
     private String imgurl;
+    @ApiModelProperty(value = "iam缁勭粐缂栫爜")
+    @ExcelColumn(name="iam缁勭粐缂栫爜")
+    private String iamOrgId;
 
     @ApiModelProperty(value = "绫诲瀷 0鍛樺伐", example = "1")
     @ExcelColumn(name="绫诲瀷 0鍛樺伐")
@@ -86,9 +89,9 @@
     @ExcelColumn(name="寰俊openid")
     private String openid;
 
-    @ApiModelProperty(value = "鐘舵��", example = "1")
-    @ExcelColumn(name="鐘舵��")
-    private Integer status;
+    @ApiModelProperty(value = "璐︽埛鐘舵�� 0鍋滅敤锛�1鍚敤", example = "1")
+    @ExcelColumn(name="璐︽埛鐘舵�� 0鍋滅敤锛�1鍚敤")
+    private String status;
 
     @ApiModelProperty(value = "鍚屾鐘舵��", example = "1")
     @ExcelColumn(name="鍚屾鐘舵��")
@@ -110,9 +113,9 @@
     @ExcelColumn(name="鐧诲綍瀵嗙爜")
     private String password;
 
-    @ApiModelProperty(value = "鎬у埆 1鐢� 2濂�", example = "1")
-    @ExcelColumn(name="鎬у埆 1鐢� 2濂�")
-    private Integer sex;
+    @ApiModelProperty(value = "鎬у埆 0鐢� 1濂�", example = "1")
+    @ExcelColumn(name="鎬у埆 0鐢� 1濂�")
+    private String sex;
 
     @ApiModelProperty(value = "鏈�杩戠櫥褰曟椂闂�")
     @ExcelColumn(name="鏈�杩戠櫥褰曟椂闂�")
diff --git a/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java b/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
index 3020bb6..4750289 100644
--- a/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
+++ b/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
@@ -19,7 +19,6 @@
  */
 @Data
 @ApiModel("蹇楅偊缁勭粐淇℃伅琛�")
-@TableName("`shop`")
 public class ShopTreeVo {
 
     @TableId(type = IdType.AUTO)
diff --git a/server/service/src/main/java/com/doumee/dao/business/vo/UnitCodeVo.java b/server/service/src/main/java/com/doumee/dao/business/vo/UnitCodeVo.java
new file mode 100644
index 0000000..4bf36f2
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/business/vo/UnitCodeVo.java
@@ -0,0 +1,16 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("蹇楅偊鍝佺墝code淇℃伅琛�")
+public class UnitCodeVo {
+
+    @ApiModelProperty(value = "code", example = "1")
+    private String code;
+    @ApiModelProperty(value = "name")
+    private String name;
+
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/InitService.java b/server/service/src/main/java/com/doumee/service/business/InitService.java
index 0ca6efd..b29b458 100644
--- a/server/service/src/main/java/com/doumee/service/business/InitService.java
+++ b/server/service/src/main/java/com/doumee/service/business/InitService.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.utils.Constants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -23,12 +24,20 @@
     @Autowired
     @Lazy
     private ShopService shopService;
+    @Autowired
+    @Lazy
+    private SystemDictDataBiz  systemDictDataBiz;
 
     @PostConstruct
     public void clearImporting(){
         redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP);
     }
     @PostConstruct
+    public void initIamAppIdAndAppKey(){
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPKEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPKEY).getCode());
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPID,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPID).getCode());
+    }
+    @PostConstruct
     public void cacheShopTree(){
 //        redisTemplate.opsForValue().set(Constants.RedisKeys.SHOP_TREE,shopService.shopTree(null));
     }
diff --git a/server/service/src/main/java/com/doumee/service/business/SegmentsService.java b/server/service/src/main/java/com/doumee/service/business/SegmentsService.java
index fb5d3d6..59a84d9 100644
--- a/server/service/src/main/java/com/doumee/service/business/SegmentsService.java
+++ b/server/service/src/main/java/com/doumee/service/business/SegmentsService.java
@@ -3,6 +3,8 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Segments;
+import com.doumee.dao.business.vo.UnitCodeVo;
+
 import java.util.List;
 
 /**
@@ -94,4 +96,5 @@
      * @return long
      */
     long count(Segments segments);
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/ShopService.java b/server/service/src/main/java/com/doumee/service/business/ShopService.java
index a0b92b3..e087c15 100644
--- a/server/service/src/main/java/com/doumee/service/business/ShopService.java
+++ b/server/service/src/main/java/com/doumee/service/business/ShopService.java
@@ -102,6 +102,7 @@
     List<ShopTreeVo> shopTreeCache(Integer type);
     List<ShopTreeVo> shopTree(Integer type);
     String importFcodeBatch(MultipartFile file);
+    String importCategoryBatch(MultipartFile file);
     void updateSort(UpdateShopSortDTO dto);
 
     String importBatch(MultipartFile file);
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java
index 90c31e7..36afa7f 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java
@@ -1,10 +1,13 @@
 package com.doumee.service.business.impl;
 
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.CategorySegMapper;
 import com.doumee.dao.business.model.CategorySeg;
+import com.doumee.dao.business.model.Segments;
+import com.doumee.dao.business.vo.UnitCodeVo;
 import com.doumee.service.business.CategorySegService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -24,6 +27,8 @@
 @Service
 public class CategorySegServiceImpl implements CategorySegService {
 
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
     @Autowired
     private CategorySegMapper categorySegMapper;
 
@@ -88,6 +93,9 @@
     public PageData<CategorySeg> findPage(PageWrap<CategorySeg> pageWrap) {
         IPage<CategorySeg> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<CategorySeg> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("category_seg.*," +
+                "(select b.name from shop b where b.code = category_seg.scode  limit 1 ) as sname," +
+                "(select b.name from shop b where b.code = category_seg.org_id  limit 1 ) as orgName");
         Utils.MP.blankToNull(pageWrap.getModel());
         if (pageWrap.getModel().getId() != null) {
             queryWrapper.lambda().eq(CategorySeg::getId, pageWrap.getModel().getId());
@@ -125,13 +133,13 @@
             queryWrapper.lambda().eq(CategorySeg::getSegId3, pageWrap.getModel().getSegId3());
         }
         if (pageWrap.getModel().getSegName() != null) {
-            queryWrapper.lambda().eq(CategorySeg::getSegName, pageWrap.getModel().getSegName());
+            queryWrapper.lambda().like(CategorySeg::getSegName, pageWrap.getModel().getSegName());
         }
         if (pageWrap.getModel().getSegName2() != null) {
-            queryWrapper.lambda().eq(CategorySeg::getSegName2, pageWrap.getModel().getSegName2());
+            queryWrapper.lambda().like(CategorySeg::getSegName2, pageWrap.getModel().getSegName2());
         }
         if (pageWrap.getModel().getSegName3() != null) {
-            queryWrapper.lambda().eq(CategorySeg::getSegName3, pageWrap.getModel().getSegName3());
+            queryWrapper.lambda().like(CategorySeg::getSegName3, pageWrap.getModel().getSegName3());
         }
         if (pageWrap.getModel().getSyncDate() != null) {
             queryWrapper.lambda().ge(CategorySeg::getSyncDate, Utils.Date.getStart(pageWrap.getModel().getSyncDate()));
@@ -144,10 +152,13 @@
             queryWrapper.lambda().eq(CategorySeg::getShipToAddress, pageWrap.getModel().getShipToAddress());
         }
         if (pageWrap.getModel().getShipToPerson() != null) {
-            queryWrapper.lambda().eq(CategorySeg::getShipToPerson, pageWrap.getModel().getShipToPerson());
+            queryWrapper.lambda().like(CategorySeg::getShipToPerson, pageWrap.getModel().getShipToPerson());
         }
         if (pageWrap.getModel().getShipToPhone() != null) {
-            queryWrapper.lambda().eq(CategorySeg::getShipToPhone, pageWrap.getModel().getShipToPhone());
+            queryWrapper.lambda().like(CategorySeg::getShipToPhone, pageWrap.getModel().getShipToPhone());
+        }
+        if (pageWrap.getModel().getScode() != null) {
+            queryWrapper.lambda().eq(CategorySeg::getScode, pageWrap.getModel().getScode());
         }
         for(PageWrap.SortData sortData: pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
@@ -156,7 +167,16 @@
                 queryWrapper.orderByAsc(sortData.getProperty());
             }
         }
-        return PageData.from(categorySegMapper.selectPage(page, queryWrapper));
+        queryWrapper.lambda().orderByAsc(CategorySeg::getScode);
+        PageData<CategorySeg> pagedata =PageData.from(categorySegMapper.selectPage(page, queryWrapper));
+        if(pagedata!=null && pagedata.getRecords()!=null && pagedata.getRecords().size()>0){
+            List<UnitCodeVo> unitCodeVoList =systemDictDataBiz.getUnitList();
+            for(CategorySeg model : pagedata.getRecords()){
+                model.setUnitName(systemDictDataBiz.getUnitName(model.getUnitCode(),unitCodeVoList));
+            }
+
+        }
+        return pagedata;
     }
 
     @Override
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
index fc5a5bd..ffe30cc 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
@@ -116,18 +116,17 @@
         if (pageWrap.getModel().getType() != null) {
             queryWrapper.lambda().eq(IamInterfaceLog::getType, pageWrap.getModel().getType());
         }
-        if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(IamInterfaceLog::getName, pageWrap.getModel().getName());
-        }
         if (pageWrap.getModel().getUrl() != null) {
-            queryWrapper.lambda().ge(IamInterfaceLog::getUrl, Utils.Date.getStart(pageWrap.getModel().getUrl()));
-            queryWrapper.lambda().le(IamInterfaceLog::getUrl, Utils.Date.getEnd(pageWrap.getModel().getUrl()));
+            queryWrapper.lambda().like(IamInterfaceLog::getUrl, pageWrap.getModel().getUrl());
+        }
+        if (pageWrap.getModel().getName() != null) {
+            queryWrapper.lambda().like(IamInterfaceLog::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getRequest() != null) {
-            queryWrapper.lambda().eq(IamInterfaceLog::getRequest, pageWrap.getModel().getRequest());
+            queryWrapper.lambda().like(IamInterfaceLog::getRequest, pageWrap.getModel().getRequest());
         }
         if (pageWrap.getModel().getRepose() != null) {
-            queryWrapper.lambda().eq(IamInterfaceLog::getRepose, pageWrap.getModel().getRepose());
+            queryWrapper.lambda().like(IamInterfaceLog::getRepose, pageWrap.getModel().getRepose());
         }
         if (pageWrap.getModel().getSuccess() != null) {
             queryWrapper.lambda().eq(IamInterfaceLog::getSuccess, pageWrap.getModel().getSuccess());
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java
index a78f73b..1dc1a2d 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java
@@ -1,19 +1,27 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.SegmentsMapper;
 import com.doumee.dao.business.model.Segments;
+import com.doumee.dao.business.vo.UnitCodeVo;
+import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.service.business.SegmentsService;
 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 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.ArrayList;
 import java.util.List;
 
 /**
@@ -26,6 +34,8 @@
 
     @Autowired
     private SegmentsMapper segmentsMapper;
+    @Autowired
+    private SystemDictDataBiz  systemDictDataBiz;
 
     @Override
     public Long create(Segments segments) {
@@ -83,12 +93,13 @@
         QueryWrapper<Segments> wrapper = new QueryWrapper<>(segments);
         return segmentsMapper.selectList(wrapper);
     }
-  
+
     @Override
     public PageData<Segments> findPage(PageWrap<Segments> pageWrap) {
         IPage<Segments> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         QueryWrapper<Segments> queryWrapper = new QueryWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
         if (pageWrap.getModel().getId() != null) {
             queryWrapper.lambda().eq(Segments::getId, pageWrap.getModel().getId());
         }
@@ -110,13 +121,13 @@
             queryWrapper.lambda().eq(Segments::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getRemark() != null) {
-            queryWrapper.lambda().eq(Segments::getRemark, pageWrap.getModel().getRemark());
+            queryWrapper.lambda().like(Segments::getRemark, pageWrap.getModel().getRemark());
         }
         if (pageWrap.getModel().getSegmentId() != null) {
             queryWrapper.lambda().eq(Segments::getSegmentId, pageWrap.getModel().getSegmentId());
         }
         if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(Segments::getName, pageWrap.getModel().getName());
+            queryWrapper.lambda().like(Segments::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getParentId() != null) {
             queryWrapper.lambda().eq(Segments::getParentId, pageWrap.getModel().getParentId());
@@ -137,16 +148,19 @@
         if (pageWrap.getModel().getSyncInfo() != null) {
             queryWrapper.lambda().eq(Segments::getSyncInfo, pageWrap.getModel().getSyncInfo());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        queryWrapper.lambda().orderByAsc(Segments::getType,Segments::getSegmentId);
+        PageData<Segments> pagedata = PageData.from(segmentsMapper.selectPage(page, queryWrapper));
+        if(pagedata!=null && pagedata.getRecords()!=null && pagedata.getRecords().size()>0){
+            List<UnitCodeVo> unitCodeVoList =systemDictDataBiz.getUnitList();
+            for(Segments model : pagedata.getRecords()){
+                model.setUnitName(systemDictDataBiz.getUnitName(model.getUnitCode(),unitCodeVoList));
             }
+
         }
-        return PageData.from(segmentsMapper.selectPage(page, queryWrapper));
+        return pagedata;
     }
 
+
     @Override
     public long count(Segments segments) {
         QueryWrapper<Segments> wrapper = new QueryWrapper<>(segments);
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
index bf00898..6223904 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -8,13 +8,16 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.admin.request.CategoryImport;
 import com.doumee.dao.admin.request.FcodeImport;
 import com.doumee.dao.admin.request.ShopImport;
 import com.doumee.dao.admin.request.UpdateShopSortDTO;
+import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.CategorySegMapper;
+import com.doumee.dao.business.SegmentsMapper;
 import com.doumee.dao.business.ShopMapper;
 import com.doumee.dao.business.join.ShopJoinMapper;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.Shop;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.business.vo.ShopTree;
 import com.doumee.dao.business.vo.ShopTreeVo;
 import com.doumee.dao.system.model.SystemUser;
@@ -34,10 +37,11 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
 /**
  * 蹇楅偊缁勭粐淇℃伅琛⊿ervice瀹炵幇
@@ -46,11 +50,15 @@
  */
 @Service
 public class ShopServiceImpl implements ShopService {
-
+    ExecutorService executor = Executors.newFixedThreadPool(1);
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
     @Autowired
     private ShopJoinMapper shopMapper;
+    @Autowired
+    private SegmentsMapper segmentsMapper;
+    @Autowired
+    private CategorySegMapper categorySegMapper;
 
     @Override
     public Long create(Shop shop) {
@@ -237,6 +245,8 @@
         }
         queryWrapper.apply(StringUtils.isNotBlank(pageWrap.getModel().getParentName()),
                     "(t1.name like '%"+pageWrap.getModel().getParentName()+"%' or t1.code like '%"+pageWrap.getModel().getParentName()+"%' )" );
+        queryWrapper.exists(StringUtils.isNotBlank(pageWrap.getModel().getSiteCode()),
+                    "(select c.id from category_seg c where c.isdeleted=0 and (c.org_id=t.code or c.scode =t1.code ) limit 1)" );
         for(PageWrap.SortData sortData: pageWrap.getSorts()) {
             if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                 queryWrapper.orderByDesc(sortData.getProperty());
@@ -253,6 +263,7 @@
         return shopMapper.selectCount(wrapper);
     }
     @Override
+//    @Async
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public String importFcodeBatch(MultipartFile file){
         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
@@ -274,7 +285,22 @@
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
             }
             Date date =new Date();
-            List<Shop> updateShops = new ArrayList<>();
+            List<FcodeImport> finalDataList = dataList;
+            Callable<String> task = () -> {
+                dealFcodeDataBiz(finalDataList,date,loginUserInfo);
+                return "寮傛浠诲姟瀹屾垚";
+            };
+            executor.submit(task);
+            return "瀵煎叆鎴愬姛";
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+    }
+
+    private void dealFcodeDataBiz(List<FcodeImport> dataList, Date date, LoginUserInfo loginUserInfo) {
+        try {
             for(int i=0;i<dataList.size();i++){
                 FcodeImport model = dataList.get(i);
                 if(StringUtils.isBlank(model.getOrgId())  ){
@@ -302,16 +328,258 @@
                 shopMapper.updateById(shop);
             }
 
-            return "瀵煎叆鎴愬姛";
         }catch (BusinessException e){
             throw e;
         }catch (Exception e){
             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
         }finally {
+            executor.shutdown();
             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP);
         }
     }
+
     @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public String importCategoryBatch(MultipartFile file){
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ユ垨鑰呬笂涓嬬骇閲嶇疆浠诲姟姝e湪鎵ц涓紝璇风◢鍚庡啀璇曪紒");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_SHOP,true);
+        try {
+            LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            ExcelImporter ie = null;
+            List<CategoryImport> dataList =null;
+            try {
+                ie = new ExcelImporter(file,0,0);
+                dataList = ie.getDataList(CategoryImport.class,null);
+            }  catch (Exception e) {
+                e.printStackTrace();
+            }
+            if(dataList == null || dataList.size() ==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
+            }
+            Date date =new Date();
+            List<CategoryImport> finalDataList = dataList;
+            Callable<String> task = () -> {
+                dealCategoryDataBiz(finalDataList,date,loginUserInfo);
+                return "寮傛浠诲姟瀹屾垚";
+            };
+            executor.submit(task);
+            return "瀵煎叆鎴愬姛";
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+    }
+
+    @Async
+    private void dealCategoryDataBiz(List<CategoryImport> dataList, Date date, LoginUserInfo loginUserInfo) {
+        try {
+            List<CategorySeg> categorySegList = new ArrayList<>();
+            List<Segments> segmentsList = new ArrayList<>();
+            Map<String,List<String>> siteCodes = new HashMap<>();
+            List<String> orgIdList = new ArrayList<>();
+            for(int i=0;i<dataList.size();i++){
+                CategoryImport model = dataList.get(i);
+                if(StringUtils.isBlank(model.getOrgId())  ){
+                    continue;
+                }
+                orgIdList.add(model.getOrgId());
+                dealSegmentData(date,model,loginUserInfo,segmentsList);
+                categorySegList.add(initInsertCategorySeg(date,model,loginUserInfo,siteCodes));
+            }
+            if(orgIdList.size()>0){
+                categorySegMapper.delete(new UpdateWrapper<CategorySeg>().lambda() .in(CategorySeg::getOrgId,orgIdList));
+            }
+            if(siteCodes.size()>0){
+                for(Map.Entry<String ,List<String>> entry : siteCodes.entrySet()){
+                    String key = entry.getKey();
+                    List<String> codes = entry.getValue();
+                    Shop ts = null;
+                    String tcode =key.substring(2);
+                    if(StringUtils.startsWith(key,"f_")){
+                        ts = shopMapper.selectOne(new QueryWrapper<Shop>().lambda()
+                                .eq(Shop::getCode,tcode)
+                                .eq(Shop::getSecondType,Constants.TWO ));
+                    }
+                    if(StringUtils.startsWith(key,"f_")){
+                        ts = shopMapper.selectOne(new QueryWrapper<Shop>().lambda()
+                                .eq(Shop::getCode,tcode)
+                                .eq(Shop::getSecondType,Constants.ONE ));
+                    }
+                    if(ts!=null){
+                        ts.setSiteCode(String.join("; ", codes) +";");
+                        shopMapper.updateById(ts);
+                    }
+                }
+            }
+            if(categorySegList.size()>0){
+                int temp = 0;
+                while(temp < categorySegList.size()){
+                    int index;
+                    if(temp + 500 <= categorySegList.size()){
+                        index = temp+500;
+                    }else{
+                        index = categorySegList.size();
+                    }
+                    categorySegMapper.insert(categorySegList.subList(temp,index));
+                    temp = index;
+                }
+            }
+            if(segmentsList.size()>0){
+                int temp = 0;
+                while(temp < segmentsList.size()){
+                    int index;
+                    if(temp + 500 <= segmentsList.size()){
+                        index = temp+500;
+                    }else{
+                        index = segmentsList.size();
+                    }
+                    segmentsMapper.insert(segmentsList.subList(temp,index));
+                    temp = index;
+                }
+            }
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }finally {
+            executor.shutdown(); // 鍏抽棴ExecutorService
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP);
+        }
+    }
+
+    private void dealSegmentData(Date date, CategoryImport model, LoginUserInfo loginUserInfo, List<Segments> segmentsList) {
+
+        if(StringUtils.isNotBlank(model.getSegId())){
+            //濡傛灉鎴樺尯涓嶄负绌�
+            if(newSegment(model.getSegId(),Constants.ZERO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegId())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getType,Constants.ZERO)) ==0){
+                segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.ZERO));
+            }
+        }
+        if(StringUtils.isNotBlank(model.getSegId2())){
+            //濡傛灉鐪佸尯涓嶄负绌�
+            if(newSegment(model.getSegId2(),Constants.ONE,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegId2())
+                    .eq(Segments::getParentId,model.getSegId())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getType,Constants.ONE)) ==0){
+                segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.ONE));
+            }
+        }
+        if(StringUtils.isNotBlank(model.getSegId3())){
+            //濡傛灉鐗囧尯涓嶄负绌�
+            if(newSegment(model.getSegId3(),Constants.TWO,segmentsList) && segmentsMapper.selectCount(new QueryWrapper<Segments>().lambda()
+                    .eq(Segments::getSegmentId,model.getSegId3())
+                    .eq(Segments::getUnitCode,model.getUnitCode())
+                    .eq(Segments::getParentId,model.getSegId2())
+                    .eq(Segments::getType,Constants.TWO)) ==0){
+                segmentsList.add(initSegmentData(model,date,loginUserInfo,Constants.TWO));
+            }
+        }
+    }
+
+    private boolean newSegment(String segId2, int one, List<Segments> segmentsList) {
+        for(Segments s : segmentsList){
+            if(StringUtils.equals(s.getSegmentId(),segId2) && Constants.equalsInteger(one,s.getType())){
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private Segments initSegmentData(CategoryImport model, Date date, LoginUserInfo loginUserInfo, int type) {
+        Segments data = new Segments();
+        data.setCreateDate(date);
+        data.setEditDate(date);
+        data.setCreator(loginUserInfo.getId());
+        data.setEditor(loginUserInfo.getId());
+        data.setIsdeleted(Constants.ZERO);
+        data.setStatus(Constants.ZERO);
+        data.setUnitCode(model.getUnitCode());
+        data.setType(type);
+        if(type ==Constants.ZERO){
+            data.setName(model.getSegName());
+            data.setSegmentId(model.getSegId());
+            data.setParentId(null);
+            data.setRemark(model.getSegName());
+        }else if(type ==Constants.ONE){
+            data.setName(model.getSegName2());
+            data.setSegmentId(model.getSegId2());
+            data.setParentId(model.getSegId());
+            data.setRemark(model.getSegName()+"/"+model.getSegName2());
+        }else{
+            data.setName(model.getSegName3());
+            data.setSegmentId(model.getSegId3());
+            data.setParentId(model.getSegId2());
+            data.setRemark(model.getSegName()+"/"+model.getSegName2()+"/"+model.getSegName3());
+        }
+        return data;
+    }
+
+    private CategorySeg initInsertCategorySeg(Date date, CategoryImport model, LoginUserInfo loginUserInfo,Map<String,List<String>> siteCodes) {
+        CategorySeg data = new CategorySeg();
+        data.setCreateDate(date);
+        data.setEditDate(date);
+        data.setCreator(loginUserInfo.getId());
+        data.setEditor(loginUserInfo.getId());
+        data.setIsdeleted(Constants.ZERO);
+        data.setOrgId(model.getOrgId());
+        data.setSegId(model.getSegId());
+        data.setSegId2(model.getSegId2());
+        data.setSegId3(model.getSegId3());
+        data.setSegName(model.getSegName());
+        data.setSegName2(model.getSegName2());
+        data.setSegName3(model.getSegName3());
+        data.setShipToAddress(model.getShipToAddress());
+        data.setShipToPhone(model.getShipToPhone());
+        data.setShipToPerson(model.getShipToPerson());
+        data.setBrandId(model.getBrandId());
+        data.setUnitCode(model.getUnitCode());
+        data.setSiteCode(model.getSiteCode());
+        data.setScode(model.getScode());
+        dealSiteCode(model,siteCodes);
+
+        return data;
+    }
+
+    private void dealSiteCode(CategoryImport model, Map<String, List<String>> siteCodes) {
+        List<String> tList = siteCodes.get(model.getOrgId());
+        if(tList == null){
+            tList = new ArrayList<>();
+        }
+        if(isNewSiteCode(model.getSiteCode(),tList)){
+            tList.add(model.getSiteCode());
+            siteCodes.put("f_"+model.getOrgId(),tList);
+        }
+        tList = siteCodes.get(model.getScode());
+        if(tList == null){
+            tList = new ArrayList<>();
+        }
+        if(isNewSiteCode(model.getSiteCode(),tList)){
+            tList.add(model.getSiteCode());
+            siteCodes.put("s_"+model.getScode(),tList);
+        }
+    }
+
+    private boolean isNewSiteCode(String siteCode, List<String> tList) {
+        if(tList!=null){
+            for(String s :tList){
+                if(StringUtils.equals(s,siteCode)){
+                    return false;
+                }
+            }
+        }
+        return  true;
+    }
+
+    @Override
+//    @Async
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public String importBatch(MultipartFile file){
         Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
@@ -332,11 +600,28 @@
             if(dataList == null || dataList.size() ==0){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
             }
+            Date date =new Date();
+            List<ShopImport> finalDataList = dataList;
+            Callable<String> task = () -> {
+                dealShopDataBiz(finalDataList,date,loginUserInfo);
+                return "寮傛浠诲姟瀹屾垚";
+            };
+            executor.submit(task);
+
+            return "瀵煎叆鎴愬姛";
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+    }
+
+    private void dealShopDataBiz(List<ShopImport> dataList, Date date, LoginUserInfo loginUserInfo) {
+        try {
             List<Shop> list =  shopMapper.selectJoinList(Shop.class,new MPJLambdaWrapper<Shop>()
                     .selectAll(Shop.class)
             );
             List<Shop> insertShops = new ArrayList<>();
-            Date date =new Date();
             List<Shop> updateShops = new ArrayList<>();
             for(int i=0;i<dataList.size();i++){
                 ShopImport model = dataList.get(i);
@@ -365,12 +650,12 @@
                     shopMapper.updateById(s);
                 }
             }
-            return "瀵煎叆鎴愬姛";
         }catch (BusinessException e){
             throw e;
         }catch (Exception e){
             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
         }finally {
+            executor.shutdown();
             redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP);
         }
     }
diff --git a/server/service/src/main/java/com/doumee/service/zbom/ZbomIAMService.java b/server/service/src/main/java/com/doumee/service/zbom/ZbomIAMService.java
deleted file mode 100644
index b57b578..0000000
--- a/server/service/src/main/java/com/doumee/service/zbom/ZbomIAMService.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.doumee.service.zbom;
-
-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.config.DataSyncConfig;
-import com.doumee.core.constants.ResponseStatus;
-import com.doumee.core.exception.BusinessException;
-import com.doumee.core.haikang.model.param.BaseResponse;
-import com.doumee.core.haikang.model.param.request.UserDelRequest;
-import com.doumee.core.haikang.model.param.respose.UserDelResponse;
-import com.doumee.core.haikang.service.HKService;
-import com.doumee.core.model.LoginUserInfo;
-import com.doumee.core.model.PageData;
-import com.doumee.core.model.PageWrap;
-import com.doumee.core.utils.Constants;
-import com.doumee.core.utils.DESUtil;
-import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.dao.business.join.MemberJoinMapper;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.system.SystemUserMapper;
-import com.doumee.service.business.MemberService;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.shiro.SecurityUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-/**
- * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
- * @author 姹熻箘韫�
- * @date 2023/11/30 15:33
- */
-@Service
-public class ZbomIAMService {
-
-    @Autowired
-    private MemberMapper memberMapper;
-
-    /**
-     * 鍒濆鍖栧悓姝ョ敤鎴�
-     * @param params
-     */
-    public void startUserInit(String params) {
-    }
-    /**
-     * 鍒濆鍖栧悓姝ョ敤鎴�
-     * @param params
-     */
-    public void startOrgInit(String params) {
-    }
-}
diff --git a/server/service/target/classes/com/doumee/core/utils/Constants$Status.class b/server/service/target/classes/com/doumee/core/utils/Constants$Status.class
index b952f62..b1ade10 100644
--- a/server/service/target/classes/com/doumee/core/utils/Constants$Status.class
+++ b/server/service/target/classes/com/doumee/core/utils/Constants$Status.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class b/server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class
index b6b8d5f..5f230d1 100644
--- a/server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class
+++ b/server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/core/utils/Constants.class b/server/service/target/classes/com/doumee/core/utils/Constants.class
index 26448e2..2e90da3 100644
--- a/server/service/target/classes/com/doumee/core/utils/Constants.class
+++ b/server/service/target/classes/com/doumee/core/utils/Constants.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class b/server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class
index 5809b49..3662b62 100644
--- a/server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class
+++ b/server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/dao/business/model/Segments.class b/server/service/target/classes/com/doumee/dao/business/model/Segments.class
index 6aa2f96..d946d15 100644
--- a/server/service/target/classes/com/doumee/dao/business/model/Segments.class
+++ b/server/service/target/classes/com/doumee/dao/business/model/Segments.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class b/server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class
index 7e85e5f..f08fe81 100644
--- a/server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class
+++ b/server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class b/server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class
index aade63d..97ffc69 100644
--- a/server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class
+++ b/server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/service/business/ShopService.class b/server/service/target/classes/com/doumee/service/business/ShopService.class
index 37a5ea5..fb2758d 100644
--- a/server/service/target/classes/com/doumee/service/business/ShopService.class
+++ b/server/service/target/classes/com/doumee/service/business/ShopService.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class b/server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class
index e519214..be3292a 100644
--- a/server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class
+++ b/server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class b/server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class
index ab35f3d..1f84829 100644
--- a/server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class
+++ b/server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class
Binary files differ
diff --git a/server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class b/server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class
index 8c5a66d..4bd3675 100644
--- a/server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class
+++ b/server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class
Binary files differ
diff --git a/server/web/web.iml b/server/web/web.iml
index 16d0893..f57ca7b 100644
--- a/server/web/web.iml
+++ b/server/web/web.iml
@@ -269,5 +269,6 @@
     <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
     <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.4.0" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/server/zbomyoujia.iml b/server/zbomyoujia.iml
index d2c90f8..b0dd33b 100644
--- a/server/zbomyoujia.iml
+++ b/server/zbomyoujia.iml
@@ -257,5 +257,6 @@
     <orderEntry type="library" name="Maven: org.apache.httpcomponents:httpmime:4.5.11" level="project" />
     <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
     <orderEntry type="library" name="Maven: org.dom4j:dom4j:2.1.1" level="project" />
+    <orderEntry type="library" name="Maven: com.auth0:java-jwt:3.4.0" level="project" />
   </component>
 </module>
\ No newline at end of file

--
Gitblit v1.9.3