Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

yusm 1 rok temu
rodzic
commit
5cd206d980
21 zmienionych plików z 556 dodań i 199 usunięć
  1. 101 147
      fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json
  2. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/package.json
  3. 1 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue
  4. 5 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/api.ts
  5. 209 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/index.vue
  6. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue
  7. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/api.ts
  8. 21 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BeisenConfigController.java
  9. 26 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java
  10. 41 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BeisenConfig.java
  11. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BeisenConfigMapper.java
  12. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/BeisenConfigService.java
  13. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BeisenConfigServiceImpl.java
  14. 6 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  15. 24 19
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  16. 11 8
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/BeiSenUtils.java
  17. 17 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BeisenConfigMapper.xml
  18. 7 1
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components/ComponentGroup.vue
  19. 15 10
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetConfig.vue
  20. 5 0
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetForm.vue
  21. 10 3
      fhKeeper/formulahousekeeper/plugIn/form-design-master/src/generate/GenerateForm.vue

+ 101 - 147
fhKeeper/formulahousekeeper/customerBuler-crm/package-lock.json

@@ -9,7 +9,7 @@
       "version": "0.0.0",
       "dependencies": {
         "@element-plus/icons-vue": "^2.3.1",
-        "@zmjs/form-design": "^0.1.16",
+        "@zmjs/form-design": "file:../plugIn/form-design-master/update",
         "animate.css": "^4.1.1",
         "axios": "^1.6.7",
         "echarts": "^5.5.0",
@@ -32,6 +32,104 @@
         "vue-tsc": "^1.8.27"
       }
     },
+    "../plugIn/form-design-master/build": {
+      "version": "0.1.16",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vueuse/core": "^8.2.3",
+        "ace-builds": "^1.4.14",
+        "element-plus": "^2.1.10",
+        "lodash-es": "^4.17.21",
+        "prismjs": "^1.28.0",
+        "vue": "^3.2.31",
+        "vue-prism-editor": "^2.0.0-alpha.2",
+        "vuedraggable": "^4.1.0"
+      },
+      "devDependencies": {
+        "@antfu/eslint-config": "^0.18.9",
+        "@iconify/json": "^2.1.31",
+        "@iconify/utils": "^1.0.32",
+        "@types/lodash-es": "^4.17.6",
+        "@types/node": "^17.0.23",
+        "@types/prismjs": "^1.26.0",
+        "@vitejs/plugin-vue": "^2.3.1",
+        "@vitejs/plugin-vue-jsx": "^1.3.9",
+        "eslint": "^8.12.0",
+        "postcss": "^8.4.12",
+        "postcss-html": "^1.3.0",
+        "postcss-scss": "^4.0.3",
+        "rollup": "^2.70.1",
+        "sass": "^1.49.11",
+        "stylelint": "^14.6.1",
+        "stylelint-config-recess-order": "^3.0.0",
+        "stylelint-config-standard-scss": "^3.0.0",
+        "stylelint-config-standard-vue": "^1.0.0",
+        "typescript": "^4.6.3",
+        "unocss": "^0.30.11",
+        "unplugin-auto-import": "^0.6.9",
+        "unplugin-vue-components": "^0.18.5",
+        "unplugin-vue-define-options": "^0.5.0",
+        "vite": "^2.9.1",
+        "vite-plugin-libcss": "^1.0.5",
+        "vue-tsc": "^0.34.7"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/zhiyuanzmj"
+      }
+    },
+    "../plugIn/form-design-master/update": {
+      "name": "@zmjs/form-design",
+      "version": "0.1.16",
+      "license": "MIT",
+      "dependencies": {
+        "@vueuse/core": "^8.2.3",
+        "ace-builds": "^1.4.14",
+        "element-plus": "^2.1.10",
+        "lodash-es": "^4.17.21",
+        "prismjs": "^1.28.0",
+        "vue": "^3.2.31",
+        "vue-prism-editor": "^2.0.0-alpha.2",
+        "vuedraggable": "^4.1.0"
+      },
+      "devDependencies": {
+        "@antfu/eslint-config": "^0.18.9",
+        "@iconify/json": "^2.1.31",
+        "@iconify/utils": "^1.0.32",
+        "@types/lodash-es": "^4.17.6",
+        "@types/node": "^17.0.23",
+        "@types/prismjs": "^1.26.0",
+        "@vitejs/plugin-vue": "^2.3.1",
+        "@vitejs/plugin-vue-jsx": "^1.3.9",
+        "eslint": "^8.12.0",
+        "postcss": "^8.4.12",
+        "postcss-html": "^1.3.0",
+        "postcss-scss": "^4.0.3",
+        "rollup": "^2.70.1",
+        "sass": "^1.49.11",
+        "stylelint": "^14.6.1",
+        "stylelint-config-recess-order": "^3.0.0",
+        "stylelint-config-standard-scss": "^3.0.0",
+        "stylelint-config-standard-vue": "^1.0.0",
+        "typescript": "^4.6.3",
+        "unocss": "^0.30.11",
+        "unplugin-auto-import": "^0.6.9",
+        "unplugin-vue-components": "^0.18.5",
+        "unplugin-vue-define-options": "^0.5.0",
+        "vite": "^2.9.1",
+        "vite-plugin-libcss": "^1.0.5",
+        "vue-tsc": "^0.34.7"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/zhiyuanzmj"
+      }
+    },
     "node_modules/@alloc/quick-lru": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
@@ -1027,117 +1125,8 @@
       }
     },
     "node_modules/@zmjs/form-design": {
-      "version": "0.1.16",
-      "resolved": "https://registry.npmjs.org/@zmjs/form-design/-/form-design-0.1.16.tgz",
-      "integrity": "sha512-RCjB1JbV1BKJrQ14jxez8WI72oKN3JXsMkLskZyni7tVEPjmTP8s/R3ZfFzchV0FVuZ4FZnRYNYrSDxBnpqmuw==",
-      "dependencies": {
-        "@vueuse/core": "^8.2.3",
-        "ace-builds": "^1.4.14",
-        "element-plus": "^2.1.10",
-        "lodash-es": "^4.17.21",
-        "prismjs": "^1.28.0",
-        "vue": "^3.2.31",
-        "vue-prism-editor": "^2.0.0-alpha.2",
-        "vuedraggable": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/zhiyuanzmj"
-      }
-    },
-    "node_modules/@zmjs/form-design/node_modules/@types/web-bluetooth": {
-      "version": "0.0.14",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
-      "integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A=="
-    },
-    "node_modules/@zmjs/form-design/node_modules/@vueuse/core": {
-      "version": "8.9.4",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-8.9.4.tgz",
-      "integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
-      "dependencies": {
-        "@types/web-bluetooth": "^0.0.14",
-        "@vueuse/metadata": "8.9.4",
-        "@vueuse/shared": "8.9.4",
-        "vue-demi": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.1.0",
-        "vue": "^2.6.0 || ^3.2.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        },
-        "vue": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@zmjs/form-design/node_modules/@vueuse/core/node_modules/@vueuse/shared": {
-      "version": "8.9.4",
-      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-8.9.4.tgz",
-      "integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
-      "dependencies": {
-        "vue-demi": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.1.0",
-        "vue": "^2.6.0 || ^3.2.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        },
-        "vue": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@zmjs/form-design/node_modules/@vueuse/core/node_modules/vue-demi": {
-      "version": "0.14.7",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
-      "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@zmjs/form-design/node_modules/@vueuse/metadata": {
-      "version": "8.9.4",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-8.9.4.tgz",
-      "integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/ace-builds": {
-      "version": "1.32.7",
-      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.7.tgz",
-      "integrity": "sha512-ziv35kaYELFw4suWlotz/Xsl1/1LhWAbwFoD3zIgCgP9gXGECEsAM4GhiB0T0xZdmQjyv6hmAzO280g0+n4vGw=="
+      "resolved": "../plugIn/form-design-master/update",
+      "link": true
     },
     "node_modules/animate.css": {
       "version": "4.1.1",
@@ -2377,14 +2366,6 @@
       "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
       "dev": true
     },
-    "node_modules/prismjs": {
-      "version": "1.29.0",
-      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
-      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -2618,11 +2599,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/sortablejs": {
-      "version": "1.14.0",
-      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz",
-      "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w=="
-    },
     "node_modules/source-map-js": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
@@ -2984,17 +2960,6 @@
         }
       }
     },
-    "node_modules/vue-prism-editor": {
-      "version": "2.0.0-alpha.2",
-      "resolved": "https://registry.npmjs.org/vue-prism-editor/-/vue-prism-editor-2.0.0-alpha.2.tgz",
-      "integrity": "sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==",
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.0"
-      }
-    },
     "node_modules/vue-router": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz",
@@ -3036,17 +3001,6 @@
         "typescript": "*"
       }
     },
-    "node_modules/vuedraggable": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-4.1.0.tgz",
-      "integrity": "sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==",
-      "dependencies": {
-        "sortablejs": "1.14.0"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.1"
-      }
-    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/package.json

@@ -11,7 +11,7 @@
   },
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",
-    "@zmjs/form-design": "^0.1.16",
+    "@zmjs/form-design": "file:../plugIn/form-design-master/update",
     "animate.css": "^4.1.1",
     "axios": "^1.6.7",
     "echarts": "^5.5.0",

+ 1 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/login.vue

@@ -82,6 +82,7 @@ const login = (formEl: FormInstance | undefined) => {
         return
       }
       globalPopup?.showSuccess('登录成功')
+      sessionStorage.setItem('token', res.data.id)
       setValue(res.data, 'userInfo')
       setValue(res.data?.moduleList, 'routers')
       setTimeout(() => {

+ 5 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/api.ts

@@ -0,0 +1,5 @@
+export const MOD = '/customForm'
+const prefix = '/sys-form'
+export const GETLIST = `${prefix}/list`
+export const GETLISTBYCODE = `${prefix}/getListByCode`
+export const UPDATEADDOR = `${prefix}/addOrUpdate`

+ 209 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/customForm/index.vue

@@ -0,0 +1,209 @@
+<template>
+  <div class="h-full flex custormForm">
+    <div class="p-5 w-60 pr-0">
+      <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col const-left">
+        <el-table ref="customFormTableRef" :data="customFormTableData" border highlight-current-row
+          @current-change="customFormHandleCurrentChange" style="width: 100%;height: 100%;">
+          <el-table-column prop="name" label="模块" align="center" />
+        </el-table>
+      </div>
+    </div>
+    <div class="flex-1 p-5 overflow-auto">
+      <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
+        <div class="tableHeader">
+          <div>模块 - {{ currentRow.name }}</div>
+          <el-button type="primary" @click="showModel()" :disabled="!currentRow.id">编辑表单</el-button>
+        </div>
+        <div class="flex-1 p-3" v-loading="AllLoading.elementLading">
+          <GenerateForm ref="generateForm" :data="generateFormData"></GenerateForm>
+        </div>
+      </div>
+    </div>
+    <!-- 弹窗 -->
+    <el-dialog v-model="AllMobelVisible.formMobelVisible" title="创建表单" width="90vw" align-center
+      :before-close="handleClose">
+      <div class="createForm">
+        <DesignForm ref="designForm" :basicFieldsList="letBasicFields" :advanceFieldsList="[]" :layoutFieldsList="[]" />
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="AllMobelVisible.formMobelVisible = false">取消</el-button>
+          <el-button type="primary" @click="updateJson()" v-loading="AllLoading.createFormLoading">
+            保存
+          </el-button>
+          <div @click="setData()">设置数据</div>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+  
+<script lang="ts" setup>
+import { ref, reactive, onMounted, inject } from 'vue';
+import { Delete } from '@element-plus/icons-vue'
+import { FormInstance, FormRules, ElMessageBox, ElTable } from 'element-plus'
+import { DesignForm, GenerateForm, basicFields } from '@zmjs/form-design';
+import { useStore } from '@/store/index'
+import { post, get } from '@/utils/request';
+import { GETLIST, GETLISTBYCODE, UPDATEADDOR } from './api'
+import { getFromValue, resetFromValue } from '@/utils/tools'
+const { routers } = useStore()
+type customFormTab = {
+  id: string | number,
+  config: string,
+  name: string,
+  code: string,
+}
+interface createForm {
+  id: string | number,
+  code: string,
+  name: string,
+  config: string,
+  companyId: string | number,
+  createTime: any,
+  isCurrent: string | number,
+}
+
+const globalPopup = inject<GlobalPopup>('globalPopup')
+const designForm = ref<any>(null);
+const generateForm = ref<any>(null)
+const currentRow: any = ref({})
+const customFormTableData = ref<customFormTab[]>([])
+const customFormTableRef = ref<InstanceType<typeof ElTable>>()
+const AllLoading = reactive({
+  createFormLoading: false,
+  elementLading: false
+})
+const AllMobelVisible = reactive({
+  formMobelVisible: false
+})
+
+const listByCodeArr = ref<any>({})
+const generateFormData = ref<any>({
+  list: [],
+  config: {}
+})
+const createForm = reactive<createForm>({
+  id: '',
+  code: '',
+  name: '',
+  config: '',
+  companyId: '',
+  createTime: '',
+  isCurrent: ''
+})
+
+
+// const letBasicFields:Partial<typeof basicFields> = ["input", "select", "textarea", "time", "date"]
+const letBasicFields: any = ["input", "select", "textarea", "time", "date"]
+
+function updateJson() {
+  createForm.config = JSON.stringify(designForm.value.getJson())
+  let newForm = getFromValue(createForm)
+  AllLoading.createFormLoading = true
+  post(UPDATEADDOR, { ...newForm }).then((res: any) => {
+    AllLoading.createFormLoading = false
+    if(res.code != 'ok') {
+      globalPopup?.showError(res.msg)
+      return
+    }
+    globalPopup?.showSuccess ('保存成功')
+    getListByCode()
+    AllMobelVisible.formMobelVisible = false
+  }).catch((err: any) => {
+    AllLoading.createFormLoading = false
+    console.log(err)
+  })
+}
+
+function getList() {
+  post(GETLIST, {}).then((res: any) => {
+    customFormTableData.value = res.data.map((item: any) => {
+      return {
+        id: item.id,
+        config: item.config,
+        name: item.name,
+        code: item.code
+      }
+    })
+  }).catch((err: any) => {
+    console.log(err)
+  })
+}
+
+function getListByCode() {
+  AllLoading.elementLading = true
+  get(`${GETLISTBYCODE}/${currentRow.value.code}`, {}).then((res: any) => {
+    listByCodeArr.value = res.data[0]
+    generateFormData.value = JSON.parse(res.data[0].config)
+    setTimeout(() => {
+      AllLoading.elementLading = false
+    }, 1000)
+  }).catch((_err: any) => {
+    setTimeout(() => {
+      AllLoading.elementLading = false
+    }, 500)
+  })
+}
+
+function showModel() {
+  const { id, code, name, companyId, createTime, isCurrent, config } = listByCodeArr.value
+  Object.assign(createForm, {
+    id,
+    code,
+    name,
+    companyId,
+    isCurrent,
+    config
+  })
+  AllMobelVisible.formMobelVisible = true
+  setTimeout(() => {
+    designForm.value.setJson(JSON.parse(config))
+    // designForm.value.setJson(JSON.parse(localStorage.getItem('threadDataJson') || ''))
+  }, 500)
+}
+
+function customFormHandleCurrentChange(val: any) {
+  currentRow.value = val;
+  getListByCode()
+}
+
+function handleClose(done: any) {
+  done();
+}
+
+function setData() {
+  let data = JSON.parse(localStorage.getItem('threadDataJson') || '')
+  data.list.forEach((element: any) => {
+    element.allDisable = true
+  });
+  console.log(data, '<=== 赋值好的')
+  designForm.value.setJson(data)
+}
+
+onMounted(() => {
+  getList()
+});
+</script>
+  
+<style lang="scss" scoped>
+.custormForm {
+  .createForm {
+    width: 100%;
+    height: 65vh;
+  }
+
+  .tableHeader {
+    display: flex;
+    width: 100%;
+    justify-content: space-between;
+    align-items: center;
+    padding: 10px;
+    background-color: #F5F7FA;
+  }
+
+  .el-dialog__body {
+    padding: 0 !important;
+  }
+}
+</style>

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/dictionary/index.vue

@@ -64,7 +64,7 @@ import { ref, reactive, onMounted, inject } from 'vue';
 import { Delete } from '@element-plus/icons-vue'
 import { FormInstance, FormRules, ElMessageBox, ElTable } from 'element-plus'
 import { GETLISTBYCODE, GETTYPE, UNDATELIST, DELETELIST } from './api'
-import { post } from "@/utils/request";
+import { post, get } from "@/utils/request";
 import { getFromValue, resetFromValue } from '@/utils/tools'
 
 type dictionaryTab = {
@@ -74,7 +74,7 @@ type dictionaryTab = {
 
 interface RuleForm {
   name: string,
-  seq: string | number,
+  seq: any
   id: string | number,
   code: string
 }
@@ -165,7 +165,7 @@ function getDataType() {
 
 function getTableList() {
   const { id } = currentRow.value
-  post(GETLISTBYCODE, { code: id }).then((res) => {
+  get(GETLISTBYCODE, { code: id }).then((res) => {
     tableData.value = res.data
   })
 }

+ 1 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/system/role/api.ts

@@ -1,5 +1,5 @@
 export const MOD = 'role'
-export const GETROLELIST = '/permission/getFrontRoleList'
+export const GETROLELIST = '/permission/getRoleList'
 export const DETELEROLE = '/permission/deleteRole'
 export const EDITROLE = '/permission/editRole'
 export const GETAUTORITY = '/permission/getAuthority'

+ 21 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BeisenConfigController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-13
+ */
+@RestController
+@RequestMapping("/beisen-config")
+public class BeisenConfigController {
+
+}
+

+ 26 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserWithBeisenController.java

@@ -4,7 +4,9 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.BeisenConfig;
 import com.management.platform.entity.UserWithBeisen;
+import com.management.platform.mapper.BeisenConfigMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.UserWithBeisenMapper;
 import com.management.platform.service.UserWithBeisenService;
@@ -39,14 +41,21 @@ public class UserWithBeisenController {
     private HttpServletRequest request;
     @Resource
     private UserWithBeisenService userWithBeisenService;
+    @Resource
+    private BeisenConfigMapper beisenConfigMapper;
 
     @RequestMapping("/getByTimeWindow")
     public HttpRespMsg getByTimeWindow(String startTime,String stopTime){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        BeisenConfig beisenConfig = beisenConfigMapper.selectById(companyId);
+        if(beisenConfig==null){
+            httpRespMsg.setError("北森基础数据配置未完成,请联系服务商完成配置");
+            return httpRespMsg;
+        }
         List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, companyId));
         List<UserWithBeisen> userWithBeisenList=new ArrayList<>();
-        List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",startTime,stopTime);
+        List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",startTime,stopTime,beisenConfig.getAppKey(),beisenConfig.getAppSecret());
         for (JSONArray array : byTimeWindow) {
             for (int i = 0; i < array.size(); i++) {
                 UserWithBeisen userWithBeisen=new UserWithBeisen();
@@ -82,9 +91,24 @@ public class UserWithBeisenController {
     public HttpRespMsg getSwipingCards(String createDate){
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        BeisenConfig beisenConfig = beisenConfigMapper.selectById(companyId);
+        if(beisenConfig==null){
+            httpRespMsg.setError("北森基础数据配置未完成,请联系服务商完成配置");
+            return httpRespMsg;
+        }
         List<UserWithBeisen> allBeisenList = userWithBeisenService.list(new LambdaQueryWrapper<UserWithBeisen>().eq(UserWithBeisen::getCompanyId, companyId));
         List<UserWithBeisen> userWithBeisenList=new ArrayList<>();
-        JSONArray swipingCards = BeiSenUtils.getSwipingCards(createDate);
+        JSONArray swipingCards = BeiSenUtils.getSwipingCards(createDate,beisenConfig.getAppKey(),beisenConfig.getAppSecret());
+        httpRespMsg.setData(swipingCards);
+        return httpRespMsg;
+    }
+
+    @RequestMapping("/getSwipingCardsTest")
+    public HttpRespMsg getSwipingCardsTest(String createDate){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        JSONArray swipingCards = BeiSenUtils.getSwipingCards(createDate,"70FD83474FB946E5A6A122BB2989E8D9","F494856D0BCC49D18C63429D4F2CB42EDE9480D5C075449E9C97E7AEA5C7D9E1");
+        System.out.println("获取到的打卡数据====>"+swipingCards.toJSONString());
         httpRespMsg.setData(swipingCards);
         return httpRespMsg;
     }

+ 41 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BeisenConfig.java

@@ -0,0 +1,41 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class BeisenConfig extends Model<BeisenConfig> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("company_id")
+    private Integer companyId;
+
+    @TableField("app_key")
+    private String appKey;
+
+    @TableField("app_secret")
+    private String appSecret;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/BeisenConfigMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.BeisenConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-13
+ */
+public interface BeisenConfigMapper extends BaseMapper<BeisenConfig> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/BeisenConfigService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.BeisenConfig;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-13
+ */
+public interface BeisenConfigService extends IService<BeisenConfig> {
+
+}

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BeisenConfigServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.BeisenConfig;
+import com.management.platform.mapper.BeisenConfigMapper;
+import com.management.platform.service.BeisenConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-13
+ */
+@Service
+public class BeisenConfigServiceImpl extends ServiceImpl<BeisenConfigMapper, BeisenConfig> implements BeisenConfigService {
+
+}

+ 6 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -8703,10 +8703,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         Integer companyId = user.getCompanyId();
         //是否要撤销相关数据
         List<ActualEmployeeTime> actualEmployeeTimes = hasPushForSap.getActualEmployeeTimes();
-        List<String> allUuids = actualEmployeeTimes.stream().map(ActualEmployeeTime::getUUID).distinct().collect(Collectors.toList());
-        String uuids = allUuids.stream().collect(Collectors.joining(","));
-        cancelReportPushSap(uuids,user);
-        msg.setData(actualEmployeeTimes);
+        if(actualEmployeeTimes!=null&&actualEmployeeTimes.size()>0){
+            List<String> allUuids = actualEmployeeTimes.stream().map(ActualEmployeeTime::getUUID).distinct().collect(Collectors.toList());
+            List<String> needUuidList=new ArrayList<>();
+            String uuids = allUuids.stream().map(n -> n).collect(Collectors.joining(","));
+            cancelReportPushSap(uuids,user);
+        }       msg.setData(actualEmployeeTimes);
         return msg;
     }
 

+ 24 - 19
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -174,6 +174,8 @@ public class TimingTask {
     private SapSyncLogService sapSyncLogService;
     @Resource
     private UserWithBeisenService userWithBeisenService;
+    @Resource
+    private BeisenConfigMapper beisenConfigMapper;
 
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
@@ -2000,27 +2002,30 @@ public class TimingTask {
         LocalDate now=LocalDate.now();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
         String time=df.format(now.plusDays(1));
-        List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",time,time);
-        for (JSONArray array : byTimeWindow) {
-            for (int i = 0; i < array.size(); i++) {
-                UserWithBeisen userWithBeisen=new UserWithBeisen();
-                JSONObject targetItem = array.getJSONObject(i);
-                JSONObject employeeInfo = targetItem.getJSONObject("employeeInfo");
-                JSONObject recordInfo = targetItem.getJSONObject("recordInfo");
-                userWithBeisen.setCompanyId(936);
-                userWithBeisen.setJobNumber(recordInfo.getString("jobNumber"));
-                userWithBeisen.setMobilePhone(employeeInfo.getString("mobilePhone"));
-                userWithBeisen.setName(employeeInfo.getString("name"));
-                userWithBeisen.setUserId(employeeInfo.getString("userID"));
-                Optional<UserWithBeisen> first = allBeisenList.stream().filter(a -> a.getUserId().equals(employeeInfo.getString("userID"))).findFirst();
-                if(first.isPresent()){
-                    userWithBeisen.setId(first.get().getId());
+        BeisenConfig beisenConfig = beisenConfigMapper.selectById(936);
+        if(beisenConfig!=null){
+            List<JSONArray> byTimeWindow = BeiSenUtils.getByTimeWindow("",time,time,beisenConfig.getAppKey(),beisenConfig.getAppSecret());
+            for (JSONArray array : byTimeWindow) {
+                for (int i = 0; i < array.size(); i++) {
+                    UserWithBeisen userWithBeisen=new UserWithBeisen();
+                    JSONObject targetItem = array.getJSONObject(i);
+                    JSONObject employeeInfo = targetItem.getJSONObject("employeeInfo");
+                    JSONObject recordInfo = targetItem.getJSONObject("recordInfo");
+                    userWithBeisen.setCompanyId(936);
+                    userWithBeisen.setJobNumber(recordInfo.getString("jobNumber"));
+                    userWithBeisen.setMobilePhone(employeeInfo.getString("mobilePhone"));
+                    userWithBeisen.setName(employeeInfo.getString("name"));
+                    userWithBeisen.setUserId(employeeInfo.getString("userID"));
+                    Optional<UserWithBeisen> first = allBeisenList.stream().filter(a -> a.getUserId().equals(employeeInfo.getString("userID"))).findFirst();
+                    if(first.isPresent()){
+                        userWithBeisen.setId(first.get().getId());
+                    }
+                    userWithBeisenList.add(userWithBeisen);
                 }
-                userWithBeisenList.add(userWithBeisen);
             }
-        }
-        if(userWithBeisenList.size()>0){
-            userWithBeisenService.saveOrUpdateBatch(userWithBeisenList);
+            if(userWithBeisenList.size()>0){
+                userWithBeisenService.saveOrUpdateBatch(userWithBeisenList);
+            }
         }
     }
 

+ 11 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/BeiSenUtils.java

@@ -59,7 +59,7 @@ public class BeiSenUtils {
 //        dockWithMLD.getResult("http://"+port+"/api/cube/restful/interface/getModeDataPageList/getTravelRecord",jsonString);
     }
 
-    public static String getToken(){
+    public static String getToken(String appkey,String appSecret){
         String result="";
         String url = "https://openapi.italent.cn/token";
         HttpHeaders headers = new HttpHeaders();
@@ -68,8 +68,8 @@ public class BeiSenUtils {
         headers.setContentType(type);
         JSONObject requestMap = new JSONObject();
         requestMap.put("grant_type","client_credentials");
-        requestMap.put("app_key","0AE887ADF87148EABF38B64BBE5B6BA6");
-        requestMap.put("app_secret","23054CE7CBAF4B1A8BA5FC878077A35A5BF7FF3AAC4D4A828CC7043E8017FF5A");
+        requestMap.put("app_key",appkey);
+        requestMap.put("app_secret",appSecret);
         HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
         ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
         if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
@@ -80,14 +80,14 @@ public class BeiSenUtils {
         return result;
     }
 
-    public static List<JSONArray> getByTimeWindow(String scrollId,String startTime,String stopTime){
+    public static List<JSONArray> getByTimeWindow(String scrollId,String startTime,String stopTime,String appkey,String appSecret){
         List<JSONArray> resultList=new ArrayList<>();
         String url = "https://openapi.italent.cn/TenantBaseExternal/api/v5/Employee/GetByTimeWindow";
         HttpHeaders headers = new HttpHeaders();
         RestTemplate restTemplate = new RestTemplate();
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         headers.setContentType(type);
-        String accessToken = getToken();
+        String accessToken = getToken(appkey,appSecret);
         System.out.println("--------Bearer TOKEN--------"+accessToken);
         headers.add("Authorization","Bearer "+accessToken);
         JSONObject requestMap = new JSONObject();
@@ -108,7 +108,7 @@ public class BeiSenUtils {
                 resultList.add(respJson.getJSONArray("data"));
                 String nextScrollId = respJson.getString("scrollId");
                 if(!StringUtils.isEmpty(nextScrollId)&&respJson.getJSONArray("data").size()>0){
-                    List<JSONArray> byTimeWindow = getByTimeWindow(nextScrollId,startTime,stopTime);
+                    List<JSONArray> byTimeWindow = getByTimeWindow(nextScrollId,startTime,stopTime,appkey,appSecret);
                     resultList.addAll(byTimeWindow);
                 }
                 return resultList;
@@ -117,13 +117,13 @@ public class BeiSenUtils {
         return resultList;
     }
 
-    public static JSONArray getSwipingCards(String createDate){
+    public static JSONArray getSwipingCards(String createDate,String appkey,String appSecret){
         String url = "https://openapi.italent.cn/AttendanceOpen/api/v1/SwipingCardData/GetSwipingCards";
         HttpHeaders headers = new HttpHeaders();
         RestTemplate restTemplate = new RestTemplate();
         MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
         headers.setContentType(type);
-        String accessToken = getToken();
+        String accessToken = getToken(appkey,appSecret);
         System.out.println("--------Bearer TOKEN--------"+accessToken);
         headers.add("Authorization","Bearer "+accessToken);
         JSONObject requestMap = new JSONObject();
@@ -143,6 +143,9 @@ public class BeiSenUtils {
                 return resultData;
             }
         }
+        //todo:景昱 计算工作时长 默认工作日 8小时+当天人员加班(审核状态:通过)时长 非工作日考勤数据以加班数据为准
+
+        //todo:如何分页 循环调用接口 当天接口返回数据为空 取消调用
         return new JSONArray();
     }
 

+ 17 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BeisenConfigMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.BeisenConfigMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.BeisenConfig">
+        <id column="company_id" property="companyId" />
+        <result column="app_key" property="appKey" />
+        <result column="app_secret" property="appSecret" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, app_key, app_secret
+    </sql>
+
+</mapper>

+ 7 - 1
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/components/ComponentGroup.vue

@@ -22,7 +22,13 @@ import { cloneDeep } from 'lodash-es'
 const props = defineProps<{ fields: any[]; title: string; list: any[], allList: any }>()
 let moveFlag = $ref(false)
 const moveStart = () => {
-  const flag = props.allList.list.length < 5
+  // const flag = props.allList.list.length < 5
+  const array = props.allList.list.map((item: any) => item.model)
+  const plateNumbers = array.filter((item: any) => item.includes('plate')).map((item: any) => {
+    const match = item.match(/plate(\d+)/);
+    return match ? match[1] : null;
+  });
+  const flag = plateNumbers.length < 5
   if (!flag && !moveFlag) {
     moveFlag = true
     ElMessage.warning('最多添加五个')

+ 15 - 10
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetConfig.vue

@@ -13,7 +13,7 @@
     </el-form-item>
 
     <el-form-item v-if="hasKey('placeholder')" label="占位内容">
-      <el-input v-model="data.options.placeholder" />
+      <el-input v-model="data.options.placeholder" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item
@@ -71,35 +71,35 @@
     </el-form-item>
 
     <el-form-item v-if="hasKey('maxlength')" label="最大长度">
-      <el-input v-model.number="data.options.maxlength" />
+      <el-input v-model.number="data.options.maxlength" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('max')" label="最大值">
-      <el-input-number v-model.number="data.options.max" />
+      <el-input-number v-model.number="data.options.max" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('min')" label="最小值">
-      <el-input-number v-model.number="data.options.min" />
+      <el-input-number v-model.number="data.options.min" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('step')" label="步长">
-      <el-input-number v-model.number="data.options.step" :min="0" />
+      <el-input-number v-model.number="data.options.step" :min="0" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('prefix')" label="前缀">
-      <el-input v-model="data.options.prefix" />
+      <el-input v-model="data.options.prefix" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('suffix')" label="后缀">
-      <el-input v-model="data.options.suffix" />
+      <el-input v-model="data.options.suffix" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('prepend')" label="前置标签">
-      <el-input v-model="data.options.prepend" />
+      <el-input v-model="data.options.prepend" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('append')" label="后置标签">
-      <el-input v-model="data.options.append" />
+      <el-input v-model="data.options.append" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('activeText')" label="选中时的内容">
@@ -156,11 +156,12 @@
       <el-switch
         v-model="data.options.multiple"
         @change="handleSelectModeChange"
+        :disabled="data.allDisable"
       />
     </el-form-item>
 
     <el-form-item v-if="hasKey('filterable')" label="是否可搜索">
-      <el-switch v-model="data.options.filterable" />
+      <el-switch v-model="data.options.filterable" :disabled="data.allDisable" />
     </el-form-item>
 
     <el-form-item v-if="hasKey('showLabel')" label="是否显示标签">
@@ -539,24 +540,28 @@
         <el-checkbox
           v-if="hasKey('rules')"
           v-model="data.options.rules.required"
+          :disabled="data.allDisable"
         >
           必填
         </el-checkbox>
         <el-checkbox
           v-if="hasKey('readonly')"
           v-model="data.options.readonly"
+          :disabled="data.allDisable"
         >
           只读
         </el-checkbox>
         <el-checkbox
           v-if="hasKey('disabled')"
           v-model="data.options.disabled"
+          :disabled="data.allDisable"
         >
           禁用
         </el-checkbox>
         <el-checkbox
           v-if="hasKey('clearable')"
           v-model="data.options.clearable"
+          :disabled="data.allDisable"
         >
           清除
         </el-checkbox>

+ 5 - 0
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/design/WidgetForm.vue

@@ -3,6 +3,7 @@
     label-suffix=":"
     bg-gray-50 relative flex="~ 1"
     v-bind="config"
+    class="layoutForm"
   >
     <div v-if="!list?.length" text="gray-400 lg" absolute top-50 left="1/2" translate-x="-1/2">
       从左侧拖拽来添加字段
@@ -40,6 +41,10 @@ const selectWidget = useVModel(props, 'selectWidget')
 </script>
 
 <style lang="scss">
+.layoutForm {
+  height: 100%;
+  overflow-y: auto;
+}
 .widget-view {
   @apply relative m-0.5 p-1 border border-dashed border-gray-300;
 

+ 10 - 3
fhKeeper/formulahousekeeper/plugIn/form-design-master/src/generate/GenerateForm.vue

@@ -99,11 +99,18 @@ export default defineComponent({
               }))
               return
             }
-            fetch(item.options.remoteFunc)
+            const token: any = sessionStorage.getItem('token')
+            fetch(item.options.remoteFunc, {
+              headers: {
+                "Content-type": " application/x-www-form-urlencoded; charset=UTF-8",
+                "Token": token
+              }
+            })
               .then(resp => resp.json())
               .then((json) => {
-                if (json instanceof Array) {
-                  item.options.remoteOptions = json.map(data => ({
+                const res = json.data
+                if (res instanceof Array) {
+                  item.options.remoteOptions = res.map(data => ({
                     label: data[item.options.props.label],
                     value: data[item.options.props.value],
                     children: data[item.options.props.children],