jiangping
2024-07-10 d72cdefc313e6000c5f7f0ad37686fb63a7fbdbe
提交
已添加17个文件
已复制1个文件
已删除1个文件
已修改51个文件
已重命名1个文件
3040 ■■■■ 文件已修改
admin/package-lock.json 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/category.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/segments.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/shop.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCategoryImportWindow.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaFcodeImportWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaShopImportWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/RichEditor.vue 413 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/dict/DictDataManagerWindow.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/dict/OperaDictDataWindow.vue 82 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/filters/index.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/segments.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shop.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shopTree.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/admin.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/PushController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/SegmentsController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/ShopController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/config/shiro/ShiroConfig.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/timer/ZbomIAMSyncJobBiz.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/target/classes/com/doumee/api/business/SegmentsController.class 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/target/classes/com/doumee/api/business/ShopController.class 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/service.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java 374 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamCategoryModel.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamFcodeModel.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamScodeModel.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamShopModel.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateShopModel.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUpateUserModel.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUserJobModel.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUserOrgModel.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUserRoleModel.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/IamUserTypeModel.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/admin/request/CategoryImport.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/CategorySeg.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/IamInterfaceLog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Segments.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Shop.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Users.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/UnitCodeVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/InitService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/SegmentsService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/ShopService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CategorySegServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/SegmentsServiceImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/zbom/ZbomIAMService.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/core/utils/Constants$Status.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/core/utils/Constants.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/dao/business/model/Segments.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/service/business/ShopService.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class 补丁 | 查看 | 原始文档 | blame | 历史
server/web/web.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/zbomyoujia.iml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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",
admin/public/template/category.xlsx
Binary files differ
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) {
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, {
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>
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
        })
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
        })
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 {
import { Loading } from 'element-ui';
export default Vue.extend({
  props: {
    richData: { // çˆ¶ç»„件传递的数据
      type: String,
      default: ''
    },
    styleEditor: '',
    readonly: false, // æ˜¯å¦å¯ä»¥è¾“å…¥
  },
  name: 'RichEditor',
  components: { Editor, Toolbar },
  props: {
    content: {
      type: Object,
      default: () => {}
    }
  },
  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"
              ]
      html: '',
      toolbarConfig: { // å·¥å…·æ é…ç½®
        toolbarKeys: this.readonly ? ["fullScreen"]: [ // æ˜¾ç¤ºæŒ‡å®šçš„菜单项
          "bold", // ç²—体
          "underline", // ä¸‹åˆ’线
          "italic", // æ–œä½“
          "through", // åˆ é™¤çº¿
          "code", // è¡Œå†…代码
          "sub", // ä¸‹æ ‡
          "sup", // ä¸Šæ ‡
          "clearStyle", // æ¸…除格式
          "color", // å­—体颜色
          "bgColor", // èƒŒæ™¯è‰²
          "fontSize", // å­—号
          "fontFamily", // å­—体
          "indent", // å¢žåŠ ç¼©è¿›
          "delIndent", // å‡å°‘缩进
          "justifyLeft", // å·¦å¯¹é½
          "justifyRight", // å³å¯¹é½
          "justifyCenter", // å±…中对齐
          "justifyJustify", // ä¸¤ç«¯å¯¹é½
          "lineHeight", // è¡Œé«˜
          // "viewImageLink", // æŸ¥çœ‹é“¾æŽ¥
          "divider", // åˆ†å‰²çº¿
          "emotion", // è¡¨æƒ…
          "insertLink", // æ’入链接
          // "editLink", // ä¿®æ”¹é“¾æŽ¥
          // "unLink", // å–消链接
          // "viewLink", // æŸ¥çœ‹é“¾æŽ¥
          "codeBlock", // ä»£ç å—
          "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 çš„值即可
        ],
          },
          "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: {
      editorConfig: { // ç¼–辑器配置
        placeholder: '请输入内容...',
        readOnly: this.readonly, // æ˜¯å¦åªè¯»ï¼Œé»˜è®¤false
        autoFocus: false, // æ˜¯å¦è‡ªåЍfocus,默认为true
        scroll: true, // é…ç½®ç¼–辑器是否支持滚动,默认为 true ã€‚注意,此时不要固定 editor-container çš„高度,设置一个 min-height å³å¯ã€‚
        maxLength: 20000, // æœ€å¤§é™åˆ¶ï¼Œé¿å…å†…容过多卡顿
        MENU_CONF: {
          // å›¾ç‰‡ä¸Šä¼ 
          uploadImage: {
            // server: '/api/upload',
            name: 'file',
            server: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
            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: {
              folder: 'shop'
            },
            onBeforeUpload(file) {    // JS è¯­æ³•
              // file é€‰ä¸­çš„æ–‡ä»¶ï¼Œæ ¼å¼å¦‚ { key: file }
              // debugger
              return file
            // å°† 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;
            },
            onSuccess(file, res) {
                console.log(`${file.name} ä¸Šä¼ æˆåŠŸ`, res)
            },
            onError(file, err, res) {
              console.log(`${file.name} ä¸Šä¼ å‡ºé”™`, err, res)
            },
            // è‡ªå®šä¹‰æ’入图片
            customInsert(res, insertFn) {
              console.log(res);
              // å› ä¸ºè‡ªå®šä¹‰æ’入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // å…ˆå…³é—­ç­‰å¾…çš„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) {
              // å› ä¸ºè‡ªå®šä¹‰æ’入导致onSuccess与onFailed回调函数不起作用,自己手动处理
              // å…ˆå…³é—­ç­‰å¾…çš„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>>
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>
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 æ‰€å±žå­—å…¸ID
@@ -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
        }
      })
    }
admin/src/filters/index.js
@@ -17,5 +17,11 @@
      }
      return '启用'
    })
    Vue.filter('disabledText1', (value) => {
      if (value) {
        return '普通文本'
      }
      return '富文本'
    })
  }
}
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>
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:''
      }
    }
  },
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 {
      // æœç´¢
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>
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;
    }
}
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")
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(),"对不起,已存在导入或者上下级重置任务正在执行中,请稍后再试!");
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!");
        }
        shopService.dealShopNamePath();
        return ApiResponse.success("操作成功");
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");
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();
        }
    }
}
server/admin/target/classes/com/doumee/api/business/SegmentsController.class
Binary files differ
server/admin/target/classes/com/doumee/api/business/ShopController.class
Binary files differ
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>
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>
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
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){
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;
/**
 * äººå‘˜ä¿¡æ¯è¡¨Service实现
 * @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);
}
server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
ÎļþÃû´Ó server/service/src/main/java/com/doumee/service/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;
}
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.*;
/**
 * äººå‘˜ä¿¡æ¯è¡¨Service实现
 * @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);
    }
}
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
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
Îļþ´Ó server/service/src/main/java/com/doumee/service/zbom/ZbomZhongTaiService.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;
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组织更新推送Scode参数")
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 æ­£å¸¸ï¼ŒNO-ORDER ä¸­æ­¢ä¸‹å•,NO-SHIPMENT ä¸­æ­¢å‘货,TERMINATED  ç»ˆæ­¢")
    @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;
}
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组织更新推送Scode参数")
public class IamFcodeModel {
    @JsonProperty("relevanceCode")
    @SerializedName("relevanceCode")
    @ApiModelProperty(value = "一体商码(s码)")
    private String relevanceCode;
    @JsonProperty("custAccountId")
    @SerializedName("custAccountId")
    @ApiModelProperty(value = "加盟商id")
    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;
}
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组织更新推送Scode参数")
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 æ­£å¸¸ï¼ŒTERMINATED  ç»ˆæ­¢")
    @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;
}
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组织更新推送Scode参数")
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 æ­£å¸¸ 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 æ­£å¸¸ 2 ç»ˆæ­¢")
    @SerializedName("statusOld")
    private String statusOld;
    @JsonProperty("provinceNum")
    @ApiModelProperty(value = "省区编码·")
    @SerializedName("provinceNum")
    private String idtOrgCode;
}
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客组织ID,存放U客老的组织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正常,-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码信息 å½“idt_org__second_level_type ä¸ºS时,scode有值,否则是null")
    @SerializedName("scode")
    private IamScodeModel scode;
    @JsonProperty("fcode")
    @ApiModelProperty(value = "F码信息 å½“idt_org__second_level_type ä¸ºF时,fcode有值,否则是null")
    @SerializedName("fcode")
    private IamFcodeModel fcode;
    @JsonProperty("shop")
    @ApiModelProperty(value = "店面信息 å½“idt_org__second_level_type ä¸ºåº—面时,code有值,否则是null")
    @SerializedName("shop")
    private IamShopModel shop;
    @JsonProperty("category")
    @ApiModelProperty(value = "品类信息 å½“idt_org__second_level_type ä¸ºF时,ccategory有值,否则是[]")
    @SerializedName("category")
    private List<IamCategoryModel> category;
}
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 {
    /**
     * ç‰¹åˆ«è¯´æ˜Žï¼šä¸‹æ¸¸ç³»ç»Ÿåœ¨æŽ¥æ”¶æŠ¥æ–‡ï¼Œæ ¹æ®idt_user__id判定账号是新增还是修改,进行账号新增或者修改时,先判断idt_user__id(IAM用户主键)在下游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,存放U客老用户id,如果是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客岗位id")
    @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;
}
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;
}
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 = "老Id")
    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;
}
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;
}
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;
}
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.*;
import  java.util.Date;
import java.util.List;
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("湘B140D17").getDescription());
//        System.out.println(Constants.getVehiclePlateNo("宿AP0637").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/志邦衣柜");
        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));
        
    }
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;
}
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="市区名cç§°")
    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;
}
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="请求参数")
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="最近同步时间")
server/service/src/main/java/com/doumee/dao/business/model/Shop.java
@@ -115,11 +115,11 @@
    @ApiModelProperty(value = "所属关联F码", example = "1")
    @ExcelColumn(name="所属关联F码")
    private Integer fcode;
    private String fcode;
    @ApiModelProperty(value = "所属关联S码", example = "1")
    @ExcelColumn(name="所属关联S码")
    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;
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="最近登录时间")
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)
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;
}
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));
    }
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);
}
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);
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
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());
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) {
@@ -89,6 +99,7 @@
        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);
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;
/**
 * å¿—邦组织信息表Service实现
@@ -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(),"对不起,已存在导入或者上下级重置任务正在执行中,请稍后再试!");
        }
        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);
        }
    }
server/service/src/main/java/com/doumee/service/zbom/ZbomIAMService.java
ÎļþÒÑɾ³ý
server/service/target/classes/com/doumee/core/utils/Constants$Status.class
Binary files differ
server/service/target/classes/com/doumee/core/utils/Constants$VehiclePlateNoEnum.class
Binary files differ
server/service/target/classes/com/doumee/core/utils/Constants.class
Binary files differ
server/service/target/classes/com/doumee/dao/business/model/CategorySeg.class
Binary files differ
server/service/target/classes/com/doumee/dao/business/model/Segments.class
Binary files differ
server/service/target/classes/com/doumee/dao/business/vo/ShopTree.class
Binary files differ
server/service/target/classes/com/doumee/dao/business/vo/ShopTreeVo.class
Binary files differ
server/service/target/classes/com/doumee/service/business/ShopService.class
Binary files differ
server/service/target/classes/com/doumee/service/business/impl/CategorySegServiceImpl.class
Binary files differ
server/service/target/classes/com/doumee/service/business/impl/SegmentsServiceImpl.class
Binary files differ
server/service/target/classes/com/doumee/service/business/impl/ShopServiceImpl.class
Binary files differ
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>
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>