jiangping
2024-02-21 39739e34af928aae204c55db7974213c9b938c5a
整理
已添加15个文件
已删除1个文件
已修改72个文件
已重命名3个文件
3038 ■■■■ 文件已修改
admin/package-lock.json 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/cars.js 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/parkBook.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/visits.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaVisitsHkWindow.vue 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carEvent.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/cars.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceEvent.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/deviceRole_f.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/parkBook.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visits_hk.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/ScreenApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/api/web/ApiController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/api/web/YlScreenController.java 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/model/BaseRequest.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/model/CarsDataListResponse.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/model/CountDataResponse.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/model/CountListResponse.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/model/VisitDataListResponse.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/service/ScreenService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java 301 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/config/DataSyncConfig.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgUserListRequest.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeListRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitingInfoRequest.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentResInfoResponse.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgInfoResponse.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserPhotoResponse.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleTimeRangeInfoResponse.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitingInfoResponse.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/DateUtil.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/CarsMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarEvent.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Cars.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Company.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/ERPSyncService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarEventServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberCardServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ParksServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitEventServiceImpl.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java 53 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVehicleFromHKServiceImpl.java 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVisitFromHKServiceImpl.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/common/tree/CompanyTree.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-dev.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-devYL.yml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-pro.yml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-test.yml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/java/com/doumee/api/ScheduleTool.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/openapi/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json
@@ -1819,6 +1819,63 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1826,6 +1883,28 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -13481,87 +13560,6 @@
          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
          "dev": true
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
admin/src/api/business/cars.js
@@ -2,29 +2,33 @@
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/parkBook/page', data, {
  return request.post('/business/cars/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/parkBook/create', data)
  return request.post('/business/cars/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/parkBook/updateById', data)
  return request.post('/business/cars/updateById', data)
}
// ä¿®æ”¹
export function sync (data) {
  return request.post('/business/cars/sync', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/parkBook/delete/${id}`)
  return request.get(`/business/cars/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/business/parkBook/delete/batch', {
  return request.get('/business/cars/delete/batch', {
    params: {
      ids
    }
admin/src/api/business/company.js
@@ -25,7 +25,7 @@
// éƒ¨é—¨ä¿¡æ¯åŒæ­¥
export function companySync (data) {
  return request.post('/business/company/sync', data)
  return request.post('/business/company/syncAll', data)
}
// åˆ é™¤
admin/src/api/business/member.js
@@ -9,7 +9,10 @@
    trim: true
  })
}
// éƒ¨é—¨ä¿¡æ¯åŒæ­¥
export function memberSync (data) {
  return request.post('/business/member/syncAll', data)
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/business/member/exportExcel', data, {
admin/src/api/business/parkBook.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/parkBook/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/parkBook/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/parkBook/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/parkBook/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/business/parkBook/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/api/business/visits.js
@@ -14,7 +14,9 @@
    download: true
  })
}
export function syncByDate (data) {
  return request.post('/business/visits/syncByDate', data)
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/visits/create', data)
admin/src/components/business/OperaVisitsHkWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
<template>
  <GlobalWindow
      :title="title"
      width="500px"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" >
      <el-form-item label="同步日期" prop="startTime">
        <el-date-picker
            v-model="form.startTime"
            format="yyyy-MM-dd"
            value-format="yyyy-MM-dd HH:ss:mm"
            type="date">
        </el-date-picker>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { syncByDate } from '@/api/business/visits'
export default {
  name: 'OperaVisitsHkWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      form:{startTime: null},
      rules: {
        startTime: [
          { required: true, message: '请选择日期', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    open(title){
      this.visible=true
      this.title=title
    },
    // åŒæ­¥ä¿¡æ¯
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        syncByDate({
          starttime: this.form.startTime
        })
          .then(() => {
            this.visible = false
            this.$tip.apiSuccess('同步成功')
            this.$emit('success')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    }
  }
}
</script>
<style>
    .el-image-viewer__wrapper {
        z-index: 3000 !important;
    }
</style>
<style lang="scss" scoped>
    .list {
        width: 100%;
        display: flex;
        flex-direction: column;
        .list_item {
            width: 100%;
            margin-bottom: 30px;
            &:last-child {
                margin-bottom: 0 !important;
            }
            .list_item_label {
                font-size: 18px;
                font-weight: 600;
                color: #000000;
                margin-bottom: 15px;
            }
            .list_item_info {
                font-size: 14px;
                color: #222222;
                margin-bottom: 10px;
            }
            .list_item_status {
                width: 100%;
                display: flex;
                flex-direction: column;
                .list_item_status_item {
                    width: 100%;
                    max-height: 100px;
                    position: relative;
                    margin-bottom: 30px;
                    .dian {
                        width: 15px;
                        height: 15px;
                        border-radius: 50%;
                        background: #ffb447;
                        position: absolute;
                        left: 0;
                        top: 50%;
                        transform: translate(0, -50%);
                    }
                    .xian {
                        width: 1px;
                        height: calc(100% + 30px);
                        background: #ffb447;
                        position: absolute;
                        top: 50%;
                        left: 7px;
                        transform: translate(-50%, 0);
                    }
                    .status_info {
                        /*width: 100%;*/
                        height: 100%;
                        display: flex;
                        flex-direction: column;
                        margin-left: 30px;
                        box-sizing: border-box;
                        .status_info_a {
                            font-size: 16px;
                            color: black;
                            margin-bottom: 10px;
                        }
                        .status_info_b {
                            font-size: 13px;
                            color: #666666;
                            margin-bottom: 10px;
                        }
                        .status_info_c {
                            padding: 5px 10px;
                            background: #ececec;
                            font-size: 13px;
                            color: black;
                            border-radius: 5px;
                            box-sizing: border-box;
                        }
                    }
                }
            }
            .list_item_val {
                width: 100%;
                margin-bottom: 15px;
                &:last-child {
                    margin-bottom: 0 !important;
                }
                .list_item_val_item {
                    font-size: 14px;
                    color: #222222;
                    margin-bottom: 5px;
                    &:last-child {
                        margin-bottom: 0 !important;
                    }
                }
            }
        }
    }
</style>
admin/src/views/business/carEvent.vue
@@ -78,13 +78,26 @@
                        <span v-if="row.inoutType === 1">出场</span>
                    </template>
                </el-table-column>
              <el-table-column label="车牌抓拍图" min-width="100px">
                <template slot-scope="{row}">
                  <div  v-if="row.platePicUrl!=null">
                    <el-image
                        style="width: 80px; height: 80px"
                        :src="row.platePicUrl"
                        :preview-src-list="[row.platePicUrl]">
                    </el-image>
                  </div>
                </template>
              </el-table-column>
                <el-table-column label="抓拍图片" min-width="100px">
                    <template slot-scope="{row}">
                      <div  v-if="row.vehiclePicUrl!=null">
                        <el-image
                            style="width: 80px; height: 80px"
                            :src="row.vehiclePicUrl"
                            :preview-src-list="[row.vehiclePicUrl]">
                        </el-image>
                      </div>
                    </template>
                </el-table-column>
                <el-table-column prop="happenTime" label="事件时间" min-width="100px"></el-table-column>
admin/src/views/business/cars.vue
@@ -20,7 +20,7 @@
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
<!--                <li><el-button type="primary" @click="$refs.operaCarsWindow.open('新建车辆信息表')" icon="el-icon-plus" v-permissions="['business:member:create']">新建</el-button></li>-->
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>
                <li><el-button type="primary" @click="syncCars"   v-permissions="['business:cars:sync']">同步</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -30,7 +30,6 @@
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="code" label="车牌号" min-width="100px"></el-table-column>
                <el-table-column prop="parksName" label="停车场" min-width="100px"></el-table-column>
                <el-table-column label="用户类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.memberType === 0">劳务访客</span>
@@ -41,26 +40,7 @@
                <el-table-column prop="memberName" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="memberPhone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="部门/公司" min-width="100px"></el-table-column>
                <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
                <el-table-column prop="remark" label="有效期" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{validity(row.startTime, row.endTime)}}</span>
<!--                        <span v-if="!row.startTime || !row.endTime">长期</span>-->
<!--                        <span v-else>{{row.startTime}} è‡³ {{row.endTime}}</span>-->
                    </template>
                </el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
<!--                        <el-button type="text" @click="$refs.operaCarsWindow.open('编辑车辆信息表', row)" icon="el-icon-edit" v-permissions="['business:member:update']">编辑</el-button>-->
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
@@ -79,7 +59,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCarsWindow from '@/components/business/OperaCarsWindow'
import { validity } from '@/utils/util'
import { sync } from '@/api/business/cars'
export default {
  name: 'Cars',
  extends: BaseTable,
@@ -102,6 +82,14 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    // åŒæ­¥ä¿¡æ¯
    async syncCars () {
      const message = await sync({})
      this.$message.success(message)
      this.search()
    }
  }
}
</script>
admin/src/views/business/deviceEvent.vue
@@ -60,9 +60,9 @@
                        <span v-if="row.userType === 2">内部人员</span>
                    </template>
                </el-table-column>
                <el-table-column prop="name" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="idcard" label="身份证号码" min-width="100px"></el-table-column>
                <el-table-column prop="personName" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="personPhone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="personIdcardDecode" label="证件号" min-width="100px"></el-table-column>
                <el-table-column prop="personCompanyName" label="公司/组织" min-width="100px"></el-table-column>
                <el-table-column prop="devName" label="门禁名称" min-width="100px"></el-table-column>
                <el-table-column prop="srcName" label="门禁点" min-width="100px"></el-table-column>
admin/src/views/business/deviceRole_f.vue
@@ -96,7 +96,7 @@
      }).then(() => {
        syncPrivilege({})
          .then(res => {
            this.$message({ type: 'success', message: '同步成功' })
            this.$message({ type: 'success', message:res || '同步成功' })
            this.search()
          })
      }).catch(() => {
admin/src/views/business/internalMember.vue
@@ -39,7 +39,7 @@
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:member:delete']">
                <li><el-button type="primary">门禁授权</el-button></li>
                <li><el-button type="primary" v-permissions="['business:member:sync']">同步</el-button></li>
                <li><el-button type="primary" v-permissions="['business:member:sync']"  @click="synchronous()">同步</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>
            </ul>
            <el-table
@@ -121,7 +121,8 @@
import TableLayout1 from '@/layouts/TableLayout1'
import Pagination from '@/components/common/Pagination'
import Tree from '@/components/common/Tree'
import { fetchList } from '@/api/business/company'
import { fetchList} from '@/api/business/company'
import {memberSync} from "@/api/business/member";
export default {
  name: 'internalMember',
  extends: BaseTable,
@@ -137,6 +138,7 @@
        keyword: '',
        type: 2,
        erpOrgId: '',
        companyId: '',
        hasFace: ''
      },
      companyTree: []
@@ -162,9 +164,16 @@
          this.search()
        })
    },
    // åŒæ­¥ä¿¡æ¯
    async synchronous () {
      const message = await memberSync({})
      this.$message.success(message)
      this.search()
    } ,
    callback (row) {
      console.log(row)
      this.searchForm.erpOrgId = row.erpId
      this.searchForm.companyId = row.id
      this.search()
    }
  }
admin/src/views/business/parkBook.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
<template>
    <TableLayout :permissions="['business:member:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
            <el-form-item label="车牌号" prop="code">
                <el-input v-model="searchForm.code" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="员工姓名/手机号" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="请输入员工姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="部门" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入部门" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
<!--                <li><el-button type="primary" @click="$refs.operaCarsWindow.open('新建车辆信息表')" icon="el-icon-plus" v-permissions="['business:member:create']">新建</el-button></li>-->
                <li><el-button @click="syncCars" icon="el-icon-delete" v-permissions="['business:cars:sync']">同步</el-button></li>
                <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:cars:delete']">删除</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="code" label="车牌号" min-width="100px"></el-table-column>
                <el-table-column prop="parksName" label="停车场" min-width="100px"></el-table-column>
                <el-table-column label="用户类型" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.memberType === 0">劳务访客</span>
                        <span v-if="row.memberType === 1">普通访客</span>
                        <span v-if="row.memberType === 2">内部人员</span>
                    </template>
                </el-table-column>
                <el-table-column prop="memberName" label="姓名" min-width="100px"></el-table-column>
                <el-table-column prop="memberPhone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="部门/公司" min-width="100px"></el-table-column>
                <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
                <el-table-column prop="remark" label="有效期" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{validity(row.startTime, row.endTime)}}</span>
<!--                        <span v-if="!row.startTime || !row.endTime">长期</span>-->
<!--                        <span v-else>{{row.startTime}} è‡³ {{row.endTime}}</span>-->
                    </template>
                </el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:member:update', 'business:member:delete'])"
                    label="操作"
                    min-width="120"
                    fixed="right"
                >
                    <template slot-scope="{row}">
<!--                        <el-button type="text" @click="$refs.operaCarsWindow.open('编辑车辆信息表', row)" icon="el-icon-edit" v-permissions="['business:member:update']">编辑</el-button>-->
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaCarsWindow ref="operaCarsWindow" @success="handlePageChange"/>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCarsWindow from '@/components/business/OperaCarsWindow'
export default {
  name: 'parkBook',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCarsWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        code: '',
        memberName: '',
        companyName: ''
      }
    }
  },
  created () {
    this.config({
      module: '车辆信息表',
      api: '/business/parkBook',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  }
}
</script>
admin/src/views/business/visits_hk.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,153 @@
<template>
    <TableLayout :permissions="['business:visits:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="姓名/手机号" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="身份证号" prop="idcardNo">
                <el-input v-model="searchForm.idcardNo" placeholder="请输入身份证号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="公司名称" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入公司名称" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="审批状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择">
                    <el-option label="待审核" value="1"></el-option>
                    <el-option label="正常" value="2"></el-option>
                    <el-option label="迟到" value="3"></el-option>
                    <el-option label="审核退回" value="4"></el-option>
                    <el-option label="超期自动签离" value="5"></el-option>
                    <el-option label="已签离" value="6"></el-option>
                    <el-option label="超期未签离" value="7"></el-option>
                    <el-option label="已到达" value="8"></el-option>
                    <el-option label="审核失效" value="9"></el-option>
                    <el-option label="邀约中" value="10"></el-option>
                    <el-option label="邀约失效" value="11"></el-option>
                </el-select>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:visits:exportExcel']" @click="exportExcel">导出</el-button>-->
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
          <ul class="toolbar"  v-permissions="['business:visits:sync']">
            <li><el-button type="primary"  v-permissions="['business:visits:sync']" @click="$refs.OperaVisitsHkWindow.open('同步访客记录')">同步</el-button></li>
          </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="访客姓名" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="公司名称" min-width="100px"></el-table-column>
                <el-table-column prop="receptMemberName" label="被访人" min-width="100px"></el-table-column>
                <el-table-column prop="reason" label="拜访事由" min-width="100px"></el-table-column>
                <el-table-column label="拜访时间" min-width="170px">
                    <template slot-scope="{row}">
                        <span>起:{{row.starttime}}</span><br/>
                        <span>止:{{row.endtime}}</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访人员" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.memberNum || '-'}}</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访车辆" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.carNos">{{row.carNos.split(',').length}}</span>
                        <span v-else>-</span>
                    </template>
                </el-table-column>
                <el-table-column prop="status" fixed="right" label="状态" min-width="100px">
                    <template slot-scope="{row}">
                      <el-option label="待审核" value="1"></el-option>
                      <el-option label="正常" value="2"></el-option>
                      <el-option label="迟到" value="3"></el-option>
                      <el-option label="审核退回" value="4"></el-option>
                      <el-option label="超期自动签离" value="5"></el-option>
                      <el-option label="已签离" value="6"></el-option>
                      <el-option label="超期未签离" value="7"></el-option>
                      <el-option label="已到达" value="8"></el-option>
                      <el-option label="审核失效" value="9"></el-option>
                      <el-option label="邀约中" value="10"></el-option>
                      <el-option label="邀约失效" value="11"></el-option>
                        <span v-if="row.status === 1">待审核</span>
                        <span v-if="row.status === 2">正常</span>
                        <span v-if="row.status === 3">迟到</span>
                        <span v-if="row.status === 4">审核退回</span>
                        <span v-if="row.status === 5">超期自动签离</span>
                        <span v-if="row.status === 6">已签离</span>
                        <span v-if="row.status === 7">超期未签离</span>
                        <span v-if="row.status === 8">已到达</span>
                        <span v-if="row.status === 9">审核失效</span>
                        <span v-if="row.status === 10">邀约中</span>
                        <span v-if="row.status === 11">邀约失效</span>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:visits:update', 'business:visits:delete'])"
                    label="操作"
                    min-width="100"
                    fixed="right"
                >
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('详情', row.id)" v-permissions="['business:visits:update']">查看详情</el-button>
<!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">查询审批结果</el-button>-->
                    </template>
                </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
            <!--      è¯¦æƒ…      -->
            <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
            <OperaVisitsHkWindow ref="OperaVisitsHkWindow" />
        </template>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
import OperaVisitsHkWindow from '@/components/business/OperaVisitsHkWindow'
export default {
  name: 'Visits',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaVisitsDesWindow,OperaVisitsHkWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        companyName: '',
        idcardNo: '',
        status: ''
      }
    }
  },
  created () {
    this.config({
      module: '访客申请信息表',
      api: '/business/visits',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
  }
}
</script>
admin/vue.config.js
@@ -14,7 +14,7 @@
        // http://192.168.0.110:10013   ç£Šç£Š
        // http://192.168.0.132:10013   å¸…å“¥
        // https://dmtest.ahapp.net/admin_api   æµ‹è¯•服
        target: 'https://dmtest.ahapp.net/admin_api',
        target: 'http://localhost:10028',
        changeOrigin: true,
        pathRewrite: {
          [`^${[process.env.VUE_APP_API_PREFIX]}`]: ''
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java
@@ -8,6 +8,7 @@
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Cars;
import com.doumee.service.business.CarsService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVehicleFromHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;    
@@ -29,6 +30,8 @@
    @Autowired
    private CarsService carsService;
    @Autowired
    private HkSyncVehicleFromHKServiceImpl hkSyncVehicleFromHKService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -66,6 +69,13 @@
        carsService.updateById(cars);
        return ApiResponse.success(null);
    }
    @ApiOperation("全量同步车辆信息")
    @PostMapping("/sync")
    @RequiresPermissions("business:cars:sync")
    public ApiResponse sync(@RequestBody Cars cars) {
        hkSyncVehicleFromHKService.syncVehicleData();
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
server/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java
@@ -1,6 +1,7 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
@@ -10,9 +11,9 @@
import com.doumee.dao.admin.request.UpdateCompanySortDTO;
import com.doumee.dao.admin.response.CompanyDTO;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.dto.UpdateSystemMenuSortDTO;
import com.doumee.service.business.CompanyService;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -40,6 +41,10 @@
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private HkSyncOrgUserFromHKServiceImpl hkSyncOrgUserFHKService;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @PreventRepeat
    @ApiOperation("新建")
@@ -161,11 +166,15 @@
    @ApiOperation("部门信息同步")
    @PostMapping("/sync")
    @ApiOperation("全量部门信息同步")
    @PostMapping("/syncAll")
    @RequiresPermissions("business:company:sync")
    public ApiResponse sync(){
        erpSyncService.syncCompany(null);
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            erpSyncService.syncCompany(null);
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            hkSyncOrgUserFHKService.syncOrgData();
        }
        return ApiResponse.success("同步成功");
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/ERPSyncController.java
@@ -3,15 +3,9 @@
import com.doumee.api.BaseController;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.erp.model.openapi.request.erp.OrgListRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserListRequest;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.model.ApiResponse;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.impl.hksync.HkSyncDeviceServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncPrivilegeServiceImpl;
import com.doumee.service.business.ext.ERPSyncService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -35,7 +29,7 @@
    @PreventRepeat
    @ApiOperation("【ERP】全量同步ERP组织接口")
    @PostMapping("/getCompanies")
    //@RequiresPermissions("business:erpsync:company")
    @RequiresPermissions("business:erpsync:company")
    public ApiResponse getCompanies(@RequestBody OrgListRequest param) {
        String result = erpSyncService.syncCompany(param);
        return ApiResponse.success(result);
@@ -43,7 +37,7 @@
    @PreventRepeat
    @ApiOperation("【ERP】全量同步ERP人员接口")
    @PostMapping("/getUsers")
//    @RequiresPermissions("business:erpsync:users")
    @RequiresPermissions("business:erpsync:users")
    public ApiResponse getUsers(@RequestBody UserListRequest param) {
        String result = erpSyncService.syncUsers(param);
        return ApiResponse.success(result);
server/dmvisit_admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -1,6 +1,7 @@
package com.doumee.api.business;
import com.doumee.api.BaseController;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
@@ -11,7 +12,9 @@
import com.doumee.dao.admin.request.MemberQuery;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncOrgUserFromHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -30,6 +33,12 @@
@RestController
@RequestMapping("/business/member")
public class MemberController extends BaseController {
    @Autowired
    private ERPSyncService erpSyncService;
    @Autowired
    private HkSyncOrgUserFromHKServiceImpl hkSyncOrgUserFHKService;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private MemberService memberService;
@@ -215,4 +224,16 @@
        return ApiResponse.success(memberService.findList(member));
    }
    @ApiOperation("全量信息同步")
    @PostMapping("/syncAll")
    @RequiresPermissions("business:member:sync")
    public ApiResponse sync(){
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            erpSyncService.syncUsers(null);
        }else if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.hk){
            hkSyncOrgUserFHKService.syncUserData();
        }
        return ApiResponse.success("同步成功");
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/VisitsController.java
@@ -8,6 +8,7 @@
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.VisitsService;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;    
@@ -16,6 +17,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -29,6 +31,8 @@
    @Autowired
    private VisitsService visitsService;
    @Autowired
    private HkSyncVisitFromHKServiceImpl hkSyncVisitFromHKService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -67,6 +71,14 @@
        return ApiResponse.success(null);
    }
    @ApiOperation("根据日期(starttime)同步访客数据")
    @PostMapping("/syncByDate")
    @RequiresPermissions("business:visits:sync")
    public ApiResponse syncByDate(@RequestBody Visits visits) {
        hkSyncVisitFromHKService.syncVistAppointData(visits.getStarttime());
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:visits:query")
server/dmvisit_admin/src/main/java/com/doumee/service/impl/HkSyncEventServiceImpl.java
@@ -5,7 +5,7 @@
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.EventSubRequest;
import com.doumee.core.haikang.model.param.respose.OrgListResponse;
import com.doumee.core.haikang.model.param.respose.OrgInfoResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.model.SystemDictData;
@@ -56,7 +56,7 @@
            SystemDictData orgName =  systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_ROOTORG_NAME);
            String rootOrgId =org.getCode();
            if(StringUtils.isBlank(rootOrgId)){
                BaseResponse<OrgListResponse> res = HKService.getRootOrg(null);
                BaseResponse<OrgInfoResponse> res = HKService.getRootOrg(null);
                if(res !=null && res.getData()!=null && StringUtils.isNotBlank(res.getData().getOrgIndexCode())){
                    org.setCode(res.getData().getOrgIndexCode());
                    org.setUpdateTime(new Date());
@@ -74,6 +74,7 @@
     * è®¢é˜…门禁事件、访客事件、和停车场事件
     */
    public void startHkEventSub(){
        cancelEventSub();
        EventSubRequest param = new EventSubRequest();
        String path =systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_PUSH_URL).getCode();
        param.setEventDest(path+"/parks");
@@ -81,15 +82,18 @@
                ,HKConstants.EventTypes.PARK_LINE_OUT.getKey()
                ,HKConstants.EventTypes.PARK_PASS_IN.getKey()
                ,HKConstants.EventTypes.PARK_PASS_OUT.getKey() });
        HKService.cancelEventSub(param);////先取消
        HKService.eventSub(param);//停车场事件
        param.setEventDest(path+"/visit");
        param.setEventTypes(new Integer[]{HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()
                ,HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()});
        HKService.cancelEventSub(param);//先取消
        HKService.eventSub(param);//访客事件
        param.setEventDest(path+"/acs");
        param.setEventTypes(new Integer[]{HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getKey(),HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getKey()});
        HKService.cancelEventSub(param);//先取消
        HKService.eventSub(param);//门禁事件
    }
@@ -105,6 +109,8 @@
                ,HKConstants.EventTypes.PARK_PASS_OUT.getKey()
                ,HKConstants.EventTypes.VISIT_SIGN_OUT.getKey(),
                HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getKey()});
        String path =systemDictDataBiz.queryByCode(Constants.HK_PARAM, Constants.HK_PUSH_URL).getCode();
        param.setEventDest(path);
        HKService.cancelEventSub(param);//停车场事件
    }
server/dmvisit_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -1,16 +1,23 @@
package com.doumee.task;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncImgServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.doumee.service.business.impl.hksync.HkSyncVisitServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVehicleFromHKServiceImpl;
import com.doumee.service.business.impl.hksync.fhk.HkSyncVisitFromHKServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
 * å®šæ—¶ä»»åŠ¡
@@ -27,7 +34,11 @@
    @Autowired
    private HkSyncEmpowerServiceImpl hkSyncEmpowerService;
    @Autowired
    private HkSyncOrgUserServiceImpl hkSyncOrgUserService;
    private HkSyncOrgUserToHKServiceImpl hkSyncOrgUserService;
    @Autowired
    private HkSyncVisitFromHKServiceImpl hkSyncVisitFromHKService;
    @Autowired
    private HkSyncVehicleFromHKServiceImpl hkSyncVehicleFromHKService;
    @Autowired
    private HkSyncVisitServiceImpl hkSyncVisitService;
    @Autowired
@@ -35,17 +46,45 @@
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Value("${timing}")
    private Boolean timing;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    /**
     * ç¼“存省市区
     * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
     * @throws Exception
     */
    @Scheduled(cron= "0 0 23 * * ?")
    public void syncVehicleUpdateData() throws Exception {
        hkSyncVehicleFromHKService.syncVehicleUpdateData(new Date(System.currentTimeMillis()-24*60*60*1000));
    }
    /**
     * æ¯åˆ†é’Ÿæ‹‰å–一次今日的访客预约数据
     * @throws Exception
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncVistAppointData() throws Exception {
        if(Constants.DEALING_FROM_HK_VISIT){
            return ;
        }
        try {
            Constants.DEALING_FROM_HK_VISIT =true;
            hkSyncVisitFromHKService.syncVistAppointData(new Date());
            Constants.DEALING_FROM_HK_VISIT =false;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_FROM_HK_VISIT =false;
        }
    }
    /**
     * ä¸‹è½½æµ·åº·ç³»ç»Ÿå›¾ç‰‡æ•°æ®
     * @throws Exception
     */
    @Scheduled(fixedDelay= 60*1000)
    public void downloadHkImg() throws Exception {
        hkSyncImgService.downHKImgs(0);
        if(dataSyncConfig.getNeedDealImg()!=null && dataSyncConfig.getNeedDealImg()){
            hkSyncImgService.downHKImgs(0);
        }
    }
    /**
     * å®šæ—¶åŒæ­¥ç»„织信息到海康系统
@@ -53,7 +92,10 @@
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncOrgData() {
        hkSyncOrgUserService.syncOrgData();
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp){
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncOrgData();
        }
    }
    /**
     * å®šæ—¶åŒæ­¥ç”¨æˆ·ä¿¡æ¯åˆ°æµ·åº·ç³»ç»Ÿ
@@ -61,7 +103,10 @@
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncUserData()  {
        hkSyncOrgUserService.syncUserData();
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) == DataSyncConfig.origin.erp) {
            //如果是ERP系统同步下发
            hkSyncOrgUserService.syncUserData();
        }
    }
    /**
     * å®šæ—¶åŒæ­¥ç”³è¯·é€šè¿‡çš„访客数据到海康系统
@@ -77,6 +122,7 @@
     */
    @Scheduled(fixedDelay= 60*1000)
    public void syncEmpowerData()  {
        hkSyncEmpowerService.syncEmpowerData();
    }
    /**
server/dmvisit_admin/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeemes
  profiles:
    active: dev
    active: devYL
  # JSON返回配置
  jackson:
server/dmvisit_screen/src/main/java/com/doumee/ScreenApplication.java
ÎļþÃû´Ó server/dmvisit_screen/src/main/java/com/doumee/OpenapiApplication.java ÐÞ¸Ä
@@ -16,10 +16,10 @@
@SpringBootApplication
@EnableAsync
@MapperScan("com.doumee.dao")
public class OpenapiApplication {
public class ScreenApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(OpenapiApplication.class);
        ApplicationContext context = SpringApplication.run(ScreenApplication.class);
        context.getEnvironment();
    }
}
server/dmvisit_screen/src/main/java/com/doumee/api/web/ApiController.java
@@ -1,6 +1,5 @@
package com.doumee.api.web;
import com.doumee.config.Jwt.JwtTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -25,11 +24,5 @@
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }
    protected String getToken() {
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.HEADER_KEY);
        return obj != null ? obj.toString() : null;
    }
}
server/dmvisit_screen/src/main/java/com/doumee/api/web/YlScreenController.java
@@ -1,190 +1,66 @@
package com.doumee.api.web;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.annotation.ErpLoginRequired;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.erp.model.openapi.request.*;
import com.doumee.core.erp.model.openapi.response.*;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.ERPSyncService;
import com.doumee.model.*;
import com.doumee.service.ScreenService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @Author : JP
 * @create 2023/5/5 16:02
 */
@Api(tags = "1、【访客端】数据资源接口(向ERP端提供或提交数据信息)")
@Api(tags = "【伊利大屏】数据资源接口")
@RestController
@RequestMapping("/visitbiz")
@RequestMapping("/screen")
@Slf4j
public class BizResourceController extends ApiController {
public class YlScreenController extends ApiController {
    @Autowired
    private ERPSyncService erpSyncService;
    private ScreenService screenService;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @ApiOperation(value = "调用凭据获取接口", notes = "访客端提供,供ERP端调用,向ERP提供统接口调用凭证")
    @GetMapping("/accesstoken")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "accessKey", value = "访问key,由访客端提供", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "accessSecret", value = "访问秘钥,由访客端提供", required = true)
    })
    public ApiResponse<AccessTokenResponse> accesstoken(@RequestParam  String accessKey, @RequestParam  String accessSecret) {
        return  ApiResponse.success(erpSyncService.createERPToken(accessKey,accessSecret));
    @ApiOperation(value = "获取单项统计数据", notes = "获取单项统计数据,今日访客数、拜访中、签离数、进场车次、出场车次、预约数、已审批预约数、访客车辆进场数、员工车辆进场数")
    @PostMapping("/countData")
    public ApiResponse<CountDataResponse> countData(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.countData(param));
    }
    @ErpLoginRequired
    @ApiOperation(value = "门禁组全量接口", notes = "访客端提供,供ERP端调用,ERP端同步获取门禁组全量信息")
    @PostMapping("/resource/role/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse<List<RoleListResponse>> roleList(@RequestBody RoleListRequest param) {
        param.setToken(this.getToken());
        return  ApiResponse.success(erpSyncService.erpQueryDeviceList(param));
    @ApiOperation(value = "车辆进出场数据记录(最近50条)", notes = "车辆进出场数据记录(最近50条)")
    @PostMapping("/carsDataList")
    public ApiResponse<List<CarsDataListResponse>> carsDataList(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.carsDataList(param));
    }
    @ApiOperation(value = "停车场全量信息接口", notes = "访客端提供,供ERP端调用,ERP端同步全部停车场数据")
    @PostMapping("/resource/park/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse<List<ParkListResponse>> parkList(@RequestBody ParkListRequest param) {
        param.setToken(this.getToken());
        return  ApiResponse.success(erpSyncService.parkList(param));
    @ApiOperation(value = "访客进出场数据记录(最近50条)", notes = "访客进出场数据记录(最近50条)")
    @PostMapping("/visitDataList")
    public ApiResponse<List<VisitDataListResponse>> visitDataList(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.visitDataList(param));
    }
    @ApiOperation(value = "访客出入事件同步接口", notes = "访客端提供,供ERP端调用,ERP端获取访客出入记录信息")
    @PostMapping("/resource/visit/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse<PageData<VisitEventListResponse>> visitList (@RequestBody PageWrap<VisitListRequest> pageWrap) {
        pageWrap.getModel().setToken(this.getToken());
        return ApiResponse.success(erpSyncService.visitListPage(pageWrap));
    @ApiOperation(value = "车辆进出场曲线图数据(今日)", notes = "车辆进出场曲线图数据(今日)")
    @PostMapping("/todayCarsData")
    public ApiResponse<CountListResponse> todayCarsData(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.todayCarsData(param));
    }
    @ApiOperation(value = "门禁出入事件同步接口", notes = "访客端提供,供ERP端调用,ERP端获取门禁出入记录信息")
    @PostMapping("/resource/doorEvent/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse<PageData<DoorEventListResponse>> doorEventList (@RequestBody PageWrap<DoorEventListRequest> pageWrap) {
        pageWrap.getModel().setToken(this.getToken());
        return ApiResponse.success(erpSyncService.doorEventListPage(pageWrap));
    @ApiOperation(value = "车辆进出场曲线图数据(近期 7、15、30天)", notes = "车辆进出场曲线图数据(近期 7、15、30天)")
    @PostMapping("/carsDaysData")
    public ApiResponse<CountListResponse> carsDaysData(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.carsDaysData(param));
    }
    @ApiOperation(value = "车辆出入事件同步接口", notes = "访客端提供,供ERP端调用,ERP端获取车辆出入记录信息")
    @PostMapping("/resource/carvisit/list")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse<PageData<CarEventListResponse>> carEventList (@RequestBody PageWrap<CarEventListRequest> pageWrap) {
        pageWrap.getModel().setToken(this.getToken());
        return ApiResponse.success(erpSyncService.carEventList(pageWrap));
    @ApiOperation(value = "访客进出场曲线图数据(近期 7、15、30天)", notes = "访客进出场曲线图数据(近期 7、15、30天)")
    @PostMapping("/visitDaysData")
    public ApiResponse<CountListResponse> visitDaysData(@RequestBody BaseRequest param) {
        return  ApiResponse.success(screenService.visitDaysData(param));
    }
    @ApiOperation(value = "组织变化接口", notes = "访客端提供,供ERP端调用,完成访客端组织信息同步,该接口支持单个组织新增、更新、删除需求")
    @PostMapping("/event/org/update")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse orgUpdate(@RequestBody OrgUpdateRequest param) {
        param.setToken(this.getToken());
        erpSyncService.orgUpdate(param);
        return  ApiResponse.success(null);
    }
    @ApiOperation(value = "人员变化接口", notes = "访客端提供,供ERP端调用,完成访客端人员信息同步,该接口支持单个人员新增、更新、删除需求")
    @PostMapping("/event/user/update")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse userUpdate(@RequestBody UserUpdateRequest param) {
        param.setToken(this.getToken());
        erpSyncService.userUpdate(param);
        return  ApiResponse.success(null);
    }
    @ApiOperation(value = "人员门禁组授权接口", notes = "访客端提供,供ERP端调用,访客端人员同步门禁组授权信息,该接口支持人员门禁组授权新增、更新、清空需求。")
    @PostMapping("/event/role/userAuthor")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse roleUserAuthor(@RequestBody UserAuthorRequest param) {
        erpSyncService.roleUserAuthor(param);
        return  ApiResponse.success(null);
    }
    @ApiOperation(value = "车辆授权停车场接口", notes = "访客端提供,供ERP端调用,访客端同步车辆对停车场的使用权限,该接口支持车辆绑定、解绑归属人,支持新增、更新、清空车辆授权信息")
    @PostMapping("/event/park/carAuthor")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse parkCarAuthor(@RequestBody CarAuthorRequest param) {
        erpSyncService.parkCarAuthor(param);
        return  ApiResponse.success(null);
    }
    @ApiOperation(value = "访客申请审批结果通知接口", notes = "访客端提供,供访客端调用,提交访客申请审批的结果")
    @PostMapping("/event/approve/notice")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "授权token值", required = true)
    })
    public ApiResponse approveApply(@RequestBody ApproveNoticeRequest param) {
        param.setToken(this.getToken());
        erpSyncService.approveApply(param);
        return  ApiResponse.success(null);
    }
    @ApiOperation(value = "FTP账户信息", notes = "访客端提供,供ERP端调用,FTP账户信息,其中【FTP资源访问映射地址】用于图片回显使用," +
            "比如人脸图片回显拼接:【FTP资源访问映射地址】+【FTP用户图片存储目录】+【实际人脸图片存储字段内容】" +
            "如:http://175.27.187.84/file4/member/20231211/skjd-skdjf4enc-flgk.png")
    @GetMapping("/resource/ftpAccount")
    public ApiResponse<Map<String,Object>> ftpAccount() {
        Map<String,Object> map = new HashMap<>();
        map.put("FTP主机地址IP",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode());
        map.put("FTP访问端口",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PORT).getCode());
        map.put("FTP访问登录名",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_USERNAME).getCode());
        map.put("FTP访问登陆密码",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_PWD).getCode());
        map.put("FTP访客事件图片存储目录",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.VISIT_EVENT_IMG).getCode());
        map.put("FTP车辆事件图片存储目录",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.CAR_EVENT_IMG).getCode());
        map.put("FTP门禁事件图片存储目录",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.DEVICE_EVENT_IMG).getCode());
        map.put("FTP用户图片存储目录",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode());
        map.put("FTP资源访问映射地址",
        systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode());
        return  ApiResponse.success(map);
    }
}
server/dmvisit_screen/src/main/java/com/doumee/model/BaseRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("请求参数信息")
@Data
public class BaseRequest {
    @ApiModelProperty(value = "查询类型 0近7天 1近15天 2近30天", example = "1")
    private int type;
}
server/dmvisit_screen/src/main/java/com/doumee/model/CarsDataListResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.model;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("车辆出入记录数据集合信息")
public class CarsDataListResponse {
    @ApiModelProperty(value = "车牌号" )
    private String carNo  ;
    @ApiModelProperty(value = "人员类型 0劳务访客 1普通访客  2内部人员", example = "1")
    private  Integer type;
    @ApiModelProperty(value = "出入类型 0进场 1出场", example = "1")
    private  Integer inOrOut;
    @ApiModelProperty(value = "所属部门或者单位名称")
    private  String companyName;
    @ApiModelProperty(value = "人员名称 ")
    private String memberName  ;
    @ApiModelProperty(value = "发生时间")
    private Date createDate;
    @ApiModelProperty(value = "访客公司名称")
    private String visitCompanyName;
}
server/dmvisit_screen/src/main/java/com/doumee/model/CountDataResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("数据统计信息")
public class CountDataResponse {
    @ApiModelProperty(value = "预约数", example = "1")
    private int    applyTotalNum;
    @ApiModelProperty(value = "预约已审批数", example = "1")
    private int    applyPassNum;
    @ApiModelProperty(value = "访客数", example = "1")
    private int    visitorNum;
    @ApiModelProperty(value = "拜访中访客数", example = "1")
    private int    visitInNum;
    @ApiModelProperty(value = "签离访客数", example = "1")
    private int    visitOutNum;
    @ApiModelProperty(value = "进场车次", example = "1")
    private int    carInNum;
    @ApiModelProperty(value = "出场车次", example = "1")
    private int    carOutNum;
    @ApiModelProperty(value = "在场车辆数量", example = "1")
    private int    carNum;
    @ApiModelProperty(value = "员工车辆进场数量", example = "1")
    private int    memberCarNum;
    @ApiModelProperty(value = "访客车辆进场数量", example = "1")
    private int    visitCarNum;
}
server/dmvisit_screen/src/main/java/com/doumee/model/CountListResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("车辆进出场和访客统计数据")
public class CountListResponse {
    @ApiModelProperty(value = "横坐标日期数据集合", example = "1")
    private List<String> timeList;
    @ApiModelProperty(value = "纵坐标数据集合(车辆进场、访客数)", example = "1")
    private List<Integer> dataList;
    @ApiModelProperty(value = "纵坐标数据集合2(车辆出场)", example = "1")
    private List<Integer> secDataList;
}
server/dmvisit_screen/src/main/java/com/doumee/model/VisitDataListResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel("访客出入记录数据集合信息")
public class VisitDataListResponse {
    @ApiModelProperty(value = "拜访时长信息" )
    private String timeInfo  ;
    @ApiModelProperty(value = "人员名称 ")
    private String memberName  ;
    @ApiModelProperty(value = "出入类型 0进场 1出场", example = "1")
    private  Integer inOrOut;
    @ApiModelProperty(value = "所属部门或者单位名称")
    private  String companyName;
    @ApiModelProperty(value = "发生时间")
    private Date createDate;
}
server/dmvisit_screen/src/main/java/com/doumee/service/ScreenService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.service;
import com.doumee.model.*;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * åœè½¦åœºäº‹ä»¶æŽ¨é€è®°å½•表Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface ScreenService {
    CountDataResponse countData(BaseRequest param);
    List<CarsDataListResponse> carsDataList(BaseRequest param);
    List<VisitDataListResponse> visitDataList(BaseRequest param);
    CountListResponse todayCarsData(BaseRequest param);
    CountListResponse carsDaysData(BaseRequest param);
    CountListResponse visitDaysData(BaseRequest param);
}
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,301 @@
package com.doumee.service.impl;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.VisitEventMapper;
import com.doumee.dao.business.join.CarEventJoinMapper;
import com.doumee.dao.business.join.VisitEventJoinMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.model.*;
import com.doumee.service.ScreenService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
 * åœè½¦åœºäº‹ä»¶æŽ¨é€è®°å½•表Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
public class ScreenServiceImpl implements ScreenService {
    @Autowired
    private VisitsJoinMapper visitsMapper;
    @Autowired
    private CarEventJoinMapper carEventMapper;
    @Autowired
    private VisitEventJoinMapper visitEventMapper;
    @Override
    public   CountDataResponse countData(BaseRequest param){
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.select("count(1) as applyTotalNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status not in(1,4,9)) as applyPassNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status=8) as visitInNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status=6) as visitOutNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=0 and event_type="+ HKConstants.EventTypes.PARK_PASS_IN.getKey() +") as carInNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=1 and event_type="+ HKConstants.EventTypes.PARK_PASS_OUT.getKey() +") as carOutNum");
        queryWrapper.eq(Visits::getIsdeleted, Constants.ZERO );
        queryWrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        queryWrapper.last("limit 1");
        CountDataResponse vModel =visitsMapper.selectJoinOne(CountDataResponse.class,queryWrapper);
        vModel.setVisitorNum(vModel.getVisitInNum()+vModel.getVisitOutNum());//今日访客总数
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(1) as memberCarNum");
        wrapper.exists("select b.id from cars b where b.code=t.plate_nos" );
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.last("limit 1");
        CountDataResponse cModel =carEventMapper.selectJoinOne(CountDataResponse.class,wrapper);
        vModel.setMemberCarNum(vModel.getMemberCarNum());//今日员工车辆进场数
        vModel.setMemberCarNum(vModel.getCarInNum() - vModel.getMemberCarNum());//今日预约车辆进场数
        return vModel;
    }
    @Override
    public    List<CarsDataListResponse> carsDataList(BaseRequest param){
        List<CarsDataListResponse> list = new ArrayList<>();
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(CarEvent.class)
                .selectAs(Member::getType,CarEvent::getMemberType)
                .selectAs(Member::getName,CarEvent::getMemberName)
                .selectAs(Member::getVisitCompanyName,CarEvent::getVisitCompanyName)
                .selectAs(Company::getName,CarEvent::getCompanyName);
        wrapper.leftJoin(Member.class,Member::getId,CarEvent::getMemberId);
        wrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        wrapper.apply("TO_DAYS(t.create_date)=TO_DAYS(now())" );
        wrapper.in(CarEvent::getEventType, Arrays.asList(new Integer[]{HKConstants.EventTypes.PARK_PASS_IN.getKey(),HKConstants.EventTypes.PARK_PASS_OUT.getKey()}));
        wrapper.last("limit 50");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper);
        if(result!=null){
            for(CarEvent event :result){
                CarsDataListResponse model = new CarsDataListResponse();
                model.setInOrOut(event.getInoutType());
                model.setCarNo(event.getPlateNos());
                model.setCreateDate(event.getCreateDate());
                model.setCompanyName(event.getCompanyName());
                model.setMemberName(event.getMemberName());
                model.setType(event.getMemberType());
                model.setVisitCompanyName(event.getVisitCompanyName());
                list.add(model);
            }
        }
        return  list;
    }
    @Override
    public   List<VisitDataListResponse> visitDataList(BaseRequest param){
        List<VisitDataListResponse> list = new ArrayList<>();
        MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(VisitEvent.class) ;
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.in(CarEvent::getEventType, Arrays.asList(new Integer[]{HKConstants.EventTypes.PARK_PASS_IN.getKey(),HKConstants.EventTypes.PARK_PASS_OUT.getKey()}));
        wrapper.last("limit 50");
        wrapper.orderByDesc(VisitEvent::getCreateDate);
        List<VisitEvent> result =visitEventMapper.selectList( wrapper);
        if(result!=null){
            for(VisitEvent event :result){
                VisitDataListResponse model = new VisitDataListResponse();
                model.setInOrOut(Constants.formatIntegerNum(event.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()?1:0);
                model.setCreateDate(event.getCreateDate());
                model.setCompanyName(event.getVisitorWorkUint());
                model.setMemberName(event.getPersonName());
                model.setTimeInfo(getTimeInfoByModel(event));
                list.add(model);
            }
        }
        return  list;
    }
    private String getTimeInfoByModel(VisitEvent event) {
        if(Constants.formatIntegerNum(event.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()
                    &&StringUtils.isNotBlank(event.getStartTime())
                    && StringUtils.isNotBlank(event.getEndTime())){
            //如果有时间差
            int hour = 0,min=0,sec =0;
            try {
                long start = DateUtil.getISO8601DateByStr(event.getStartTime()).getTime();
                long end = DateUtil.getISO8601DateByStr(event.getEndTime()).getTime();
                hour =(int)((end-start)/(60*60*1000));
                min =(int)(((end-start)-(60*60*1000))/(60*1000));
                sec =(int)(((end-start)%(60*1000)));
            }catch (Exception e){
                  return "-";
            }
            if(hour <= 0 && min<=0 && sec <=0){
                return "-";
            }
            String timeinfo = "";
            if(hour>0){
                timeinfo = hour+"小时";
            }
            if(sec>0){
                timeinfo += sec+"分";
            }else if(sec>0){
                timeinfo+= "1分";
            }
            return timeinfo;
        }
            return  "-";
    }
    @Override
    public CountListResponse todayCarsData(BaseRequest param) {
        CountListResponse data = new CountListResponse();
        List<String> times =  new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        List<Integer> numList2 = new ArrayList<>();
        for (int i = 0; i < 25; i++) {
            times.add((i)+":00");
            numList.add(0);
            numList2.add(0);
        }
        //进场
        List<CarEvent> inList =getCarEventListByHour(HKConstants.EventTypes.PARK_PASS_IN.getKey());
        if(inList!=null){
            for(CarEvent event: inList){
                if(Constants.formatIntegerNum(event.getHour()) >=0 && Constants.formatIntegerNum(event.getHour()) <24 ){
                    numList.set(Constants.formatIntegerNum(event.getHour()+1),event.getNum());
                }
            }
        }
        //离场
        List<CarEvent> outList =getCarEventListByHour(HKConstants.EventTypes.PARK_PASS_OUT.getKey());
        if(outList!=null){
            for(CarEvent event: outList){
                if(Constants.formatIntegerNum(event.getHour()) >=0 && Constants.formatIntegerNum(event.getHour()) <24 ){
                    numList2.set(Constants.formatIntegerNum(event.getHour()+1),event.getNum());
                }
            }
        }
        data.setDataList(numList);
        data.setSecDataList(numList2);
        data.setTimeList(times);
        return  data;
    }
    /**
     * åŸºäºŽæ—¶é—´ç‚¹ç»Ÿè®¡å‡ºæ¥è¿›å‡ºåœºæ•°æ®æ¬¡æ•°
     * @param key
     * @return
     */
    private List<CarEvent> getCarEventListByHour(int key) {
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num,HOUR(create_date) as hour");
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.eq(CarEvent::getEventType,  key);
        wrapper.groupBy("HOUR(create_date)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper);
        return  result;
    }
    private List<CarEvent> getCarEventListByDays(int days) {
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, create_date");
        wrapper.apply("TO_DAYS(create_date)+"+days+" >= TO_DAYS(now()) " );
        wrapper.eq(CarEvent::getEventType,  HKConstants.EventTypes.PARK_LINE_IN.getKey());
        wrapper.groupBy("TO_DAYS(create_date)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper);
        return  result;
    }
    private List<VisitEvent> getVisitEventListByDays(int days) {
        MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, create_date");
        wrapper.apply("TO_DAYS(create_date)+"+days+" >= TO_DAYS(now()) " );
        wrapper.eq(VisitEvent::getEventType,  HKConstants.EventTypes.VISIT_SIGN_IN.getKey());
        wrapper.groupBy("TO_DAYS(create_date)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<VisitEvent> result =visitEventMapper.selectJoinList(VisitEvent.class,wrapper);
        return  result;
    }
    @Override
    public CountListResponse carsDaysData(BaseRequest param) {
        CountListResponse data = new CountListResponse();
        int days = 7;//默认7天
        if(param.getType() == 1){
            //近30天
            days =15;
        }else   if(param.getType() == 2){
            //近15天
            days =30;
        }
        List<String> times = new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        for (int i = 0; i < days; i++) {
            times.add(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(days-i)+1),"MM.dd"));
            numList.add(0);
        }
        List<CarEvent> result = getCarEventListByDays(days);
        if(result!=null&& result.size()>0){
            for (int i = 0; i < days; i++) {
                numList.set(i,getNumByDate(times.get(i),result));
            }
        }
        data.setTimeList(times);
        data.setDataList(numList);
        return  data;
    }
    private Integer getNumByDate(String s, List<CarEvent> result) {
        for(CarEvent event:result){
            if(StringUtils.equals(s,DateUtil.formatDate(event.getCreateDate(),"MM.dd"))){
                return event.getNum();
            }
        }
        return 0;
    }
    private Integer getVisistNumByDate(String s, List<VisitEvent> result) {
        for(VisitEvent event:result){
            if(StringUtils.equals(s,DateUtil.formatDate(event.getCreateDate(),"MM.dd"))){
                return event.getNum();
            }
        }
        return 0;
    }
    public static void main(String[] args) {
        List<String> times = new ArrayList<>();
        List<String> numList = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
           System.out.println(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(7-i)+1),"MM.dd"));
        }
    }
    @Override
    public CountListResponse visitDaysData(BaseRequest param) {
        CountListResponse data = new CountListResponse();
        int days = 7;//默认7天
        if(param.getType() == 1){
            //近30天
            days =15;
        }else   if(param.getType() == 2){
            //近15天
            days =30;
        }
        List<String> times = new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        for (int i = 0; i < days; i++) {
            times.add(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(days-i)+1),"MM.dd"));
            numList.add(0);
        }
        List<VisitEvent> result = getVisitEventListByDays(days);
        if(result!=null&& result.size()>0){
            for (int i = 0; i < days; i++) {
                numList.set(i,getVisistNumByDate(times.get(i),result));
            }
        }
        data.setTimeList(times);
        data.setDataList(numList);
        return  data;
    }
}
server/dmvisit_screen/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeemes
  profiles:
    active: dev
    active: devYL
  # JSON返回配置
  jackson:
server/dmvisit_service/src/main/java/com/doumee/config/DataSyncConfig.java
@@ -1,2 +1,19 @@
package com.doumee.config;public class DataSyncConfig {
package com.doumee.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "data-sync")
public class DataSyncConfig {
    public interface  origin{
        int erp = 1;
        int hk = 2;
        int self = 0;
    }
    private Integer orgUserDataOrigin;
    private Integer visitorDataOrigin;
    private Boolean needDealImg;
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -30,6 +30,10 @@
//        String visitEvents = "/api/visitor/v1/event/turnover/search";//访客事件查询
//        String parkEvents = "/api/pms/v1/crossRecords/page";//停车场事件查询
        String rootOrg = "/api/resource/v1/org/rootOrg";//获取跟组织
        String orgAllList = "/api/resource/v1/org/orgList";//获取全量组织信息
        String userAllList = "/api/resource/v2/person/personList";//获取全量用户列表
        String orgTimeRangeList = "/api/resource/v1/org/timeRange";//增量获取组织信息
        String userTimeRangeList = "/api/resource/v1/person/personList/timeRange";//增量获取用户列表
        String addBatchOrg = "/api/resource/v1/org/batch/add";//批量新增组织
        String delBatchOrg = "/api/resource/v1/org/batch/delete";//批量删除组织
        String editOrg = "/api/resource/v1/org/single/update";//修改组织
@@ -71,6 +75,12 @@
        String cardLoss= "/api/cis/v1/card/batch/loss";//批量挂失
        String cardUnloss= "/api/cis/v1/card/batch/unLoss";//批量解挂
        String taskPersoDetail= "/api/acps/v1/download_record/person/detail/search";//查询设备通道的人员权限下载详情
        String appointmentRecords= "/api/visitor/v2/appointment/records";//查询访客预约记录v2
        String visitingRecords= "/api/visitor/v2/visiting/records";//查询访客来访记录v2
        String vehicleList= "/api/resource/v2/vehicle/advance/vehicleList";//查询车辆列表v2
        String vehicleTimeRangeList= "/api/resource/v1/vehicle/timeRange";//增量获取车辆数据
    }
    /**
@@ -214,6 +224,14 @@
        private String name;
        private int key;
        public static String getName(int index) {
            for (EventTypes c : EventTypes.values()) {
                if (c.getKey() == index) {
                    return c.name;
                }
            }
            return null;
        }
        // æž„造方法
        EventTypes(int key, String name ) {
            this.name = name;
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -2,6 +2,8 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.SpringContextUtil;
import com.doumee.core.haikang.model.param.request.CarPictureRequest;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.InterfaceLog;
import com.doumee.service.business.InterfaceLogService;
@@ -13,10 +15,7 @@
import org.apache.tomcat.util.bcel.Const;
import org.yaml.snakeyaml.scanner.Constant;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
@@ -34,21 +33,30 @@
    public static void main(String[] args) throws Exception {
//            Proxy proxy = new Proxy(Proxy.Type.DIRECT, new InetSocketAddress("127.0.0.1",Integer.valueOf("1080")));
            URL realUrl = new URL("https://10.50.60.253/artemis/api/eventService/v1/eventSubscriptionByEventTypes");
            HttpURLConnection con = (HttpURLConnection) realUrl.openConnection();
        con.setRequestMethod("GET");
//        con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) ;Gecko/20100101 Firefox/57.0");
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer content = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        ArtemisConfig.host = "10.50.60.253";
        ArtemisConfig.appKey = "27786546";
        ArtemisConfig.appSecret = "kC5dohxU7CvEqgGhVt4R";
        HKConstants.https = "https://";
        CarPictureRequest param = new CarPictureRequest();
        param.setPicUri( "HKIMG=/pic?0dd400=4c40ip-feo831-933*9o4=3=2109*2l0001893117*0t7=6*2ps==014b*=787d*069d70361-95754d-9*l108od0b192=001");
        param.setAswSyscode("3fa3e5e3-db3e-41ba-97fc-39c948778dfe");
        InputStream is = HKService.getCarPicture(param);
        File imageFile = new File("D:\\visit\\111"+UUID.randomUUID().toString()+".png");
        try {
            byte[] bytes = new byte[1024];
            FileOutputStream outStream = new FileOutputStream(imageFile);
            int index;
            while ((index = is.read(bytes)) != -1) {
                outStream.write(bytes, 0, index);
                outStream.flush();
            }
//            outStream = new FileOutputStream(imageFile);
//            outStream.write(bytes);
            //关闭输出流
            outStream.close(); //写入数据
        } catch ( Exception e) {
            throw new RuntimeException(e);
        }
        in.close();
        con.disconnect();
        System.out.println(content.toString());
    }
    public static InterfaceLogService interfaceLogService = null;
@@ -327,6 +335,7 @@
            throw  new Exception("获取门禁事件的图片下载出错");
        }
    }
    /**
     * æŸ¥è¯¢è½¦è¾†æŠ“拍图片
     * @param body
@@ -586,4 +595,94 @@
        return  result;
    }
    /**
     *    èŽ·å–è®¿å®¢é¢„çº¦è®°å½•åˆ—è¡¨
     * @param body
     * @return
     */
    public static String visitingRecords(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.visitingRecords);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–è®¿å®¢é¢„çº¦è®°å½•åˆ—è¡¨
     * @param body
     * @return
     */
    public static String appointmentRecords(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.appointmentRecords);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–å…¨é‡ç»„ç»‡åˆ—è¡¨
     * @param body
     * @return
     */
    public static String orgAllList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.orgAllList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    èŽ·å–å…¨é‡ç”¨æˆ·åˆ—è¡¨
     * @param body
     * @return
     */
    public static String userAllList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.userAllList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    å¢žé‡èŽ·å–ç»„ç»‡åˆ—è¡¨
     * @param body
     * @return
     */
    public static String orgTimeRangeList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.orgTimeRangeList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    å¢žé‡èŽ·å–ç”¨æˆ·åˆ—è¡¨
     * @param body
     * @return
     */
    public static String userTimeRangeList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.userTimeRangeList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    å¢žé‡èŽ·å–è½¦è¾†åˆ—è¡¨
     * @param body
     * @return
     */
    public static String vehicleTimeRangeList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.vehicleTimeRangeList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    å…¨é‡èŽ·å–è½¦è¾†åˆ—è¡¨
     * @param body
     * @return
     */
    public static String vehicleList(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.vehicleList);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/BaseListPageResponse.java
@@ -1,4 +1,4 @@
package com.doumee.core.haikang.model.param.respose;
package com.doumee.core.haikang.model.param;
import lombok.Data;
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/AppointmentListRequest.java
@@ -3,11 +3,34 @@
import lombok.Data;
@Data
public class OrgUserListRequest {
    private String startTime    ;//string    True    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢å¼€å§‹æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private String  endTime;//    string    False    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢æˆªæ­¢æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private Integer  pageNo    ;//integer    True    é¡µç ,pageNo≥1
    private Integer  pageSize;//    integer    True    åˆ†é¡µå¤§å°
public class AppointmentListRequest {
    private String  receptionistId;//    string    False    è¢«è®¿äººå”¯ä¸€æ ‡è¯†,查询人员列表v2接口获取返回报文中的personId字段
    private String  visitorName;//    string    False    è®¿å®¢å§“名,长度不超过32,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String   phoneNo    ;//string    False    è”系电话建议填写手机号码
    private String   visitStartTimeBegin;//    string    False    æ—¶é—´å‚数需满足ISO8601格式:    yyyy-MM-ddTHH:mm:ss+当前时区,   ä¾‹å¦‚北京时间: 2018-07-26T15:00:00+08:00
    private String    visitStartTimeEnd    ;//string    False    æ—¶é—´å‚数需满足ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,  ä¾‹å¦‚北京时间:  2018-07-26T15:00:00+08:00
    private String    visitEndTimeBegin;//    string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区,  ä¾‹å¦‚北京时间: 2018-07-26T15:00:00+08:00
    private String     visitEndTimeEnd;//    string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区,  ä¾‹å¦‚北京时间:  2018-07-26T15:00:00+08:00
    private int    pageNo;//    integer    True    pageNo要求大于0不超过2147483647
    private int    pageSize;//    integer    True    pageSize要求大于0且不超过1000
    private String     verificationCode;//    string    False    è®¿å®¢éªŒè¯ç ä¸ºè®¿å®¢ç®¡ç†ç»„件提供,用于访客在访客机登记的凭证
    /**
     * è®¿å®¢çŠ¶æ€,
     * 0:待审核(预约待审批)、
     * 1:正常(预约成功或预约审批成功后<未登记>:当前时间未超过预计来访时间)、
     * 2:迟到(预约成功或预约审批成功后<未登记>:当前时间超过预计来访时间,但未超过预计离开时间)、
     * 3:失效(预约成功或预约审批成功后<未登记>:当前时间已超过预计离开时间)、
     * 4:审核退回(预约待审批,审批人员审批退回)、
     * 5:超期自动签离(超期未签离记录访客,由后台任务定时处理签离)、
     * 6:已签离(访客签离)、
     * 7:超期未签离(访客登记,当前时间已超过预计离开时间,还未进行签离)、
     * 8:已到达;(访客登记,当前时间未超过预计离开时间)、
     * 9:审核失效(预约待审批,一直到当前时间超过预计离开时间,还未审批通过)、
     * 10:邀约中(员工发起邀约,访客还未应邀)、
     * 11:邀约失效(员工发起邀约,一直到当前时间超过预计离开时间,访客还未应邀)
     */
    private String     visitorStatus;//    integer    False
    private String   QRCode    ;//string    False    è®¿å®¢äºŒç»´ç å†…容,支持动态二维码或者静态二维码
    private String   orderId;//    string    False    é¢„约记录ID,访客预约v2接口获取返回报文中的orderId字段
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/OrgUserListRequest.java
ÎļþÒÑɾ³ý
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeListRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class TimeRangeListRequest {
    private String startTime    ;//string    True    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢å¼€å§‹æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private String  endTime;//    string    False    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢æˆªæ­¢æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private Integer  pageNo    ;//integer    True    é¡µç ,pageNo≥1
    private Integer  pageSize;//    integer    True    åˆ†é¡µå¤§å°
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/VisitingInfoRequest.java
@@ -1,11 +1,9 @@
package com.doumee.core.haikang.model.param.respose;
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
import java.util.List;
@Data
public class VisitingInfoResponse {
public class VisitingInfoRequest {
    private String   receptionistId;//    string    False    è¢«è®¿äººID,从 èŽ·å–äººå‘˜åˆ—è¡¨v2 æŽ¥å£èŽ·å–è¿”å›žå‚æ•°personId
    private String    receptionistName    ;//string    False    è¢«è®¿äººå§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String    visitorName    ;//string    False    è®¿å®¢å§“名,长度不超过32,支持中英文字符,不能包含 â€™ / \ : * ? " < >
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentInfoResponse.java
@@ -3,21 +3,51 @@
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class UserInfoResponse {
public class AppointmentInfoResponse {
private String personId    ;//string    False    äººå‘˜ID
private String personName    ;//string    False    å§“名
private Integer gender    ;//number    False
private String orgIndexCode;//    string    False    æ‰€å±žç»„织唯一标识码
private String phoneNo;//    string    False    è”系电话
private String jobNo;//    string    False    å·¥å·
private Integer certificateType;//    number    False    è¯ä»¶ç±»åž‹111:身份证414:护照113:户口簿335:驾驶证131:工作证133:学生证990:其他 ;
private String certificateNo    ;//string    False    è¯ä»¶å·ç    ä¸€ä¸²æ•°å­—字符串
private String createTime    ;//string    False    åˆ›å»ºæ—¶é—´ è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00 è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String updateTime;//    string    False    æ›´æ–°æ—¶é—´  è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00  è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String orgPath;//    string    False    æ‰€å±žç»„织目录,@进行分割,例如 @root000000@
private String orgPathName;//    string    False    æ‰€å±žç»„织名称,@进行分割,如@默认部门@
private List<UserPhotoResponse> personPhoto;//    object    False    äººå‘˜å›¾ç‰‡ä¿¡æ¯
    private String appointRecordId        ;//string    False    é¢„约记录ID,可作为修改预约的依据
    private String receptionistId        ;//string    False    è¢«è®¿äººå”¯ä¸€æ ‡è¯†
    private String receptionistName        ;//string    False    è¢«è®¿äººå§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String receptionistCode        ;//string    False    è¢«è®¿äººæ‰€å±žç»„织编码
    private String visitStartTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,
    private String visitEndTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区, é¢„计离开时间必须晚于当前时间和预计来访时间
    private String visitPurpose        ;//string    False    æ¥è®¿äº‹ç”±
    private String visitorName        ;//string    False    è®¿å®¢å§“名
    private String visitorWorkUnit        ;//string    False    æ¥è®¿å•位
    private String visitorAddress        ;//string    False    è®¿å®¢ä½å€
    private String visitorId        ;//string    False    è®¿å®¢Id
    private String verificationCode        ;//string    False    è®¿å®¢éªŒè¯ç ï¼Œç”¨äºŽè®¿å®¢åœ¨è®¿å®¢æœºç™»è®°çš„凭证
    private String QRCode        ;//string    False    åŠ¨æ€äºŒç»´ç ï¼Œå¦‚éœ€è¦ä½¿ç”¨ï¼Œå¯å°†è®¿å®¢äºŒç»´ç å†…å®¹è½¬æˆäºŒç»´ç å›¾ç‰‡å³å¯
    private Integer gender;//    integer    False    1-男,  2-女
    private String phoneNo        ;//string    False    è”系电话建议填写手机号码,仅支持纯数字。
    private String plateNo        ;//string    False    è®¿å®¢è½¦ç‰Œå·
    private Integer certificateType    ;//    integer    False    è¯ä»¶ç±»åž‹ï¼Œè¯¦è§é™„录A.11 è¯ä»¶ç±»åž‹
    private String certificateNo        ;//string    False    è¯ä»¶å·ï¼Œæ ¼å¼ä¸ºï¼š1~20个数字、字母组成
    private String picUri        ;//string    False    è¿”回图片的相对Uri;需要调用获取访客记录中的图片接口,来获取图片的数据
    private String svrIndexCode        ;//string    False    ä¸ŽpicUri配对输出的字段信息,用于“获取访客记录的图片”接口的输入参数
    /**
     * è®¿å®¢å•状态,
     *             0:待审核、
     *             1:正常、
     *             2:迟到、
     *             3:失效、
     *             4:审核退回、
     *             9:审核失效、
     *             10:邀约中、
     *             11:邀约失效
     */
    private Integer visitorStatus        ;//integer    False
    private String certAddr        ;//string    False    è¯ä»¶åœ°å€
    private String certIssuer        ;//string    False    å‘证机关
    private Integer nation    ;//integer    False
    private String birthplace        ;//string    False    ç±è´¯
    private String orderId        ;//string    False    è®¿å®¢è®°å½•唯一标识,用于已预约登记、访客签离等操作
    private List<AppointmentResInfoResponse> designatedResources;//    object    False    æƒé™ä¸‹å‘指定的资源点集合
    private String[] privilegeGroupNames;//    string[]    False    æƒé™ç»„名称集合
    private String identityUri        ;//string    False    è¯ä»¶ç…§,图片的相对URL
    private String identitySvrCode        ;//string    False    è¯ä»¶ç…§å¯¹åº”图片服务器serviceNodes
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/AppointmentResInfoResponse.java
@@ -6,50 +6,9 @@
import java.util.Map;
@Data
public class AppointmentInfoResponse {
public class AppointmentResInfoResponse {
 
   private String appointRecordId        ;//string    False    é¢„约记录ID,可作为修改预约的依据
private String receptionistId        ;//string    False    è¢«è®¿äººå”¯ä¸€æ ‡è¯†
private String receptionistName        ;//string    False    è¢«è®¿äººå§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
           private String receptionistCode        ;//string    False    è¢«è®¿äººæ‰€å±žç»„织编码
private String visitStartTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,
           private String visitEndTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区, é¢„计离开时间必须晚于当前时间和预计来访时间
private String visitPurpose        ;//string    False    æ¥è®¿äº‹ç”±
private String visitorName        ;//string    False    è®¿å®¢å§“名
private String visitorWorkUnit        ;//string    False    æ¥è®¿å•位
private String visitorAddress        ;//string    False    è®¿å®¢ä½å€
private String visitorId        ;//string    False    è®¿å®¢Id
private String verificationCode        ;//string    False    è®¿å®¢éªŒè¯ç ï¼Œç”¨äºŽè®¿å®¢åœ¨è®¿å®¢æœºç™»è®°çš„凭证
private String QRCode        ;//string    False    åŠ¨æ€äºŒç»´ç ï¼Œå¦‚éœ€è¦ä½¿ç”¨ï¼Œå¯å°†è®¿å®¢äºŒç»´ç å†…å®¹è½¬æˆäºŒç»´ç å›¾ç‰‡å³å¯
private Integer gender;//    integer    False    1-男,  2-女
private String phoneNo        ;//string    False    è”系电话建议填写手机号码,仅支持纯数字。
           private String plateNo        ;//string    False    è®¿å®¢è½¦ç‰Œå·
private Integer certificateType    ;//    integer    False    è¯ä»¶ç±»åž‹ï¼Œè¯¦è§é™„录A.11 è¯ä»¶ç±»åž‹
private String certificateNo        ;//string    False    è¯ä»¶å·ï¼Œæ ¼å¼ä¸ºï¼š1~20个数字、字母组成
private String picUri        ;//string    False    è¿”回图片的相对Uri;需要调用获取访客记录中的图片接口,来获取图片的数据
private String svrIndexCode        ;//string    False    ä¸ŽpicUri配对输出的字段信息,用于“获取访客记录的图片”接口的输入参数
    /**
     * è®¿å®¢å•状态,
     *             0:待审核、
     *             1:正常、
     *             2:迟到、
     *             3:失效、
     *             4:审核退回、
     *             9:审核失效、
     *             10:邀约中、
     *             11:邀约失效
     */
    private Integer visitorStatus        ;//integer    False
private String certAddr        ;//string    False    è¯ä»¶åœ°å€
private String certIssuer        ;//string    False    å‘证机关
private Integer nation    ;//integer    False
private String birthplace        ;//string    False    ç±è´¯
private String orderId        ;//string    False    è®¿å®¢è®°å½•唯一标识,用于已预约登记、访客签离等操作
private List<Map<String,Object>> designatedResources;//    object    False    æƒé™ä¸‹å‘指定的资源点集合
private String[] privilegeGroupNames;//    string[]    False    æƒé™ç»„名称集合
private String identityUri        ;//string    False    è¯ä»¶ç…§,图片的相对URL
private String identitySvrCode        ;//string    False    è¯ä»¶ç…§å¯¹åº”图片服务器serviceNodes
   private String  paramKey;//    string    False    å‚数类型,  é—¨ç¦ç‚¹1 æ¢¯æŽ§æ¥¼å±‚2    é—¨å£æœº3 å›´å¢™æœº4  åœè½¦åº“5
   private String[] paramValues;//    string[]    False    è®¾å¤‡çš„indexCode集合
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgInfoResponse.java
@@ -3,7 +3,7 @@
import lombok.Data;
@Data
public class OrgListResponse {
public class OrgInfoResponse {
  private String orgIndexCode;//    ç»„织唯一标识码(最大长度64)
    private String  orgNo    ;//string    False    ç»„织编号(最大长度64)
@@ -12,4 +12,5 @@
    private String  parentOrgIndexCode;//    string    False    çˆ¶ç»„织唯一标识码(最大长度64)
    private String  parentOrgName;//    string    False    çˆ¶ç»„织名称(最大长度64)
    private String  updateTime;//    string    False    æ›´æ–°æ—¶é—´    è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08+08:00表示北京时间2017å¹´7月26日21时30分08秒
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/OrgTimeRangeInfoResponse.java
@@ -3,21 +3,18 @@
import lombok.Data;
@Data
public class OrgInfoResponse {
public class OrgTimeRangeInfoResponse {
  private String orgIndexCode;//    ç»„织唯一标识码(最大长度64)
    private String  orgNo    ;//string    False    ç»„织编号(最大长度64)
    private String  organizationCode;//    string    False    ç»„织编码
    private String orgName;//    string    False    ç»„织名称(最大长度64)  å½“前组织的名称,如默认部门
    private String orgPath    ;//string    False    ç»„织目录(最大长度64) ä¾‹å¦‚:默认部门/综合安防/开发小组
    private String  parentOrgIndexCode;//    string    False    çˆ¶ç»„织唯一标识码(最大长度64)
    private String  parentOrgName;//    string    False    çˆ¶ç»„织名称(最大长度64)
    private String  updateTime;//    string    False    æ›´æ–°æ—¶é—´    è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08+08:00表示北京时间2017å¹´7月26日21时30分08秒
    private String  parentOrgIndexCode;//    -1”代表无父组织,其它代表该资源父组织唯一标识码,例“root000000”
  ++sort    number    False    æ˜¾ç¤ºé¡ºåº
++available    boolean    False    ç”¨äºŽæ ‡è¯†ç»„织节点是否有权限操作,true:有权限,false:无权限
++leaf    boolean    False    æ ‡è¯†ç»„织节点是否叶子节点,true:为叶子结点,false:非叶子结点
++createTime    string    False    åˆ›å»ºæ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
++updateTime    string    False    ä¿®æ”¹æ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
++status    number    False    èµ„源状态,小于0则代表资源已被删除,0代表有效资源
  private Integer sort    ;//    number    False    æ˜¾ç¤ºé¡ºåº
  private Boolean available        ;//boolean    False    ç”¨äºŽæ ‡è¯†ç»„织节点是否有权限操作,true:有权限,false:无权限
  private Boolean leaf    ;//    boolean    False    æ ‡è¯†ç»„织节点是否叶子节点,true:为叶子结点,false:非叶子结点
  private String createTime        ;//string    False    åˆ›å»ºæ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
  private String updateTime    ;//    string    False    ä¿®æ”¹æ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
  private Integer status        ;//number    False    èµ„源状态,小于0则代表资源已被删除,0代表有效资源
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserInfoResponse.java
@@ -5,10 +5,19 @@
import java.util.List;
@Data
public class UserListPageResponse {
public class UserInfoResponse {
  private int total;//    number    False    æŸ¥è¯¢æ•°æ®è®°å½•总数
  private int pageSize;//    number    False    æ¯é¡µè®°å½•总数
  private int pageNo    ;// number    False    å½“前页码
  private List<OrgInfoResponse> list    ;// object[]    False    æƒé™ç»„对象列表
private String personId    ;//string    False    äººå‘˜ID
private String personName    ;//string    False    å§“名
private Integer gender    ;//number    False
private String orgIndexCode;//    string    False    æ‰€å±žç»„织唯一标识码
private String phoneNo;//    string    False    è”系电话
private String jobNo;//    string    False    å·¥å·
private Integer certificateType;//    number    False    è¯ä»¶ç±»åž‹111:身份证414:护照113:户口簿335:驾驶证131:工作证133:学生证990:其他 ;
private String certificateNo    ;//string    False    è¯ä»¶å·ç    ä¸€ä¸²æ•°å­—字符串
private String createTime    ;//string    False    åˆ›å»ºæ—¶é—´ è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00 è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String updateTime;//    string    False    æ›´æ–°æ—¶é—´  è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00  è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String orgPath;//    string    False    æ‰€å±žç»„织目录,@进行分割,例如 @root000000@
private String orgPathName;//    string    False    æ‰€å±žç»„织名称,@进行分割,如@默认部门@
private List<UserPhotoResponse> personPhoto;//    object    False    äººå‘˜å›¾ç‰‡ä¿¡æ¯
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserPhotoResponse.java
@@ -2,34 +2,10 @@
import lombok.Data;
import java.util.List;
@Data
public class UserInfoResponse {
private String personId    ;//string    False    äººå‘˜ID
private String personName    ;//string    False    å§“名
private String gender    ;//number    False
private String orgIndexCode;//    string    False    æ‰€å±žç»„织唯一标识码
private String phoneNo;//    string    False    è”系电话
private String jobNo;//    string    False    å·¥å·
private String certificateType;//    number    False    è¯ä»¶ç±»åž‹
111:身份证
414:护照
113:户口簿
335:驾驶证
131:工作证
133:学生证
990:其他
private String certificateNo    ;//string    False    è¯ä»¶å·ç 
  ä¸€ä¸²æ•°å­—字符串
private String createTime    ;//string    False    åˆ›å»ºæ—¶é—´
  è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00
  è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String updateTime;//    string    False    æ›´æ–°æ—¶é—´
  è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00
  è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String orgPath;//    string    False    æ‰€å±žç»„织目录,@进行分割,例如 @root000000@
private String orgPathName;//    string    False    æ‰€å±žç»„织名称,@进行分割,如@默认部门@
private String personPhoto;//    object    False    äººå‘˜å›¾ç‰‡ä¿¡æ¯
public class UserPhotoResponse {
  private String  personPhotoIndexCode    ;//string    False    äººè„¸å›¾ç‰‡å”¯ä¸€æ ‡ç¤º
  private String  picUri;//    string    False    å›¾ç‰‡ç›¸å¯¹url, é€šè¿‡æå–人员图片接口获取图片数据
  private String  serverIndexCode    ;//string    False    å›¾ç‰‡æœåŠ¡å™¨å”¯ä¸€æ ‡ç¤º  æå–人员图片接口必要参数
  private String  personId    ;//string    False    äººå‘˜ID
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/UserTimeRangeInfoResponse.java
@@ -2,22 +2,56 @@
import lombok.Data;
import java.util.List;
@Data
public class UserInfoResponse {
public class UserTimeRangeInfoResponse {
private String personId    ;//string    False    äººå‘˜ID
private String personName    ;//string    False    å§“名
private Integer gender    ;//number    False
private String orgIndexCode;//    string    False    æ‰€å±žç»„织唯一标识码
private String phoneNo;//    string    False    è”系电话
private String jobNo;//    string    False    å·¥å·
private Integer certificateType;//    number    False    è¯ä»¶ç±»åž‹111:身份证414:护照113:户口簿335:驾驶证131:工作证133:学生证990:其他
private String certificateNo    ;//string    False    è¯ä»¶å·ç    ä¸€ä¸²æ•°å­—字符串
private String createTime    ;//string    False    åˆ›å»ºæ—¶é—´ è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00 è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String updateTime;//    string    False    æ›´æ–°æ—¶é—´  è¦æ±‚遵守ISO8601标准,如2018-07-26T21:30:08.000+08:00  è¡¨ç¤ºåŒ—京时间2017å¹´7月26日21时30分08秒
private String orgPath;//    string    False    æ‰€å±žç»„织目录,@进行分割,例如 @root000000@
private String orgPathName;//    string    False    æ‰€å±žç»„织名称,@进行分割,如@默认部门@
private UserPhotoResponse personPhoto;//    object    False    äººå‘˜å›¾ç‰‡ä¿¡æ¯
        private String personId    ;//string    False    äººå‘˜ID
        private String personName;//    string    False    å§“名
        private Integer gender;//    number    False
        private String orgPath    ;//string    False    æ‰€å±žç»„织目录,以@符号分割,包含本组织,例如@root000000@
        private String orgPathName;//    string    False    æ‰€å±žç»„织目录名称,以/分隔
        private String orgIndexCode;//    string    False    æ‰€å±žç»„织唯一标识码
        private Integer certificateType;//    number    False    è¯ä»¶ç±»åž‹ï¼Œå‚考附录A æ•°æ®å­—å…¸
        private String certificateNo;//    string    False    è¯ä»¶å·ç 
        private String jobNo;//    string    False    å·¥å·
        private String birthday;//    string    False    å‡ºç”Ÿæ—¥æœŸï¼Œä¾‹"1990-01-01"
        private String phoneNo;//    string    False    è”系电话
        private String address;//    string    False    è”系地址
        private String email;//    string    False    é‚®ç®±
        private Integer education    ;//number    False    å­¦åŽ†ï¼Œè¯¦è§é™„å½•A.12 å­¦åŽ†ç±»åž‹
        private String lastName;//    string    False    äººå‘˜å§“氏
        private String givenName;//    string    False    äººå‘˜åç§°
        private String job;//string    False    èŒä¸š
        private String staffProperty;//    string    False    èŒå·¥æ€§è´¨
        private String company;//    string    False    å·¥ä½œå•位
        private String employeePost;//    string    False    èŒä½
        private String employeeNumber;//    string    False    å‘˜å·¥ç¼–号
        private String postType;//    string    False    å²—位类别
        private String identityType;//    string    False    èº«ä»½ç±»åž‹
        private String nationality;//    string    False    å›½ç±
        private Integer nation;//    number    False
        private String birthplace    ;//string    False    ç±è´¯
        private String censusRegister;//    string    False    æˆ·ç±
        private Integer marriaged;//    number    False    å©šå§»çŠ¶å†µï¼Œè¯¦è§é™„å½•A.58 å©šå§»çж况
        private String politicalStatus;//    string    False    æ”¿æ²»é¢è²Œ
        private String roomNum;//    string    False    æˆ¿é—´å·
        private String houseHolderRel;//    string    False    ä¸Žæˆ·ä¸»å…³ç³»
        private String studentId;//    string    False    å­¦å·
        private String stuStartTime;//    string    False    å­¦ç”Ÿå…¥å­¦æ—¶é—´ï¼Œä¾‹"1990-01-01"
        private String stuEndTime;//    string    False    å­¦ç”Ÿæ¯•业时间,例"1990-01-01"
        private String stuGrade;//    string    False    å¹´çº§
        private String stuClass;//    string    False    ç­çº§
        private String academy    ;//string    False    å­¦é™¢
        private String profession;//    string    False    å­¦ç”Ÿä¸“业
        private String dormitory;//    string    False    å®¿èˆæ¥¼
        private Integer lodge;//    number    False    æ˜¯å¦ä½æ ¡ï¼Œ1:是;2:否
        private String personDesc    ;//string    False    äººå‘˜æè¿°
        private Integer syncFlag    ;//number    False    åŒæ­¥æ ‡å¿—类型,详见附录A.77 åŒæ­¥æ ‡å¿—类型
        private String pinyin    ;//string    False    æ‹¼éŸ³
        private String certIssuer    ;//string    False    å‘证机构
        private String certAddr    ;//string    False    å‘证地址
        private String certExpireTime;//    string    False    è¯ä»¶æœ‰æ•ˆæœŸ
        private Integer status    ;//integer    False    çŠ¶æ€å°äºŽ0则代表资源已被删除
        private String createTime;//    string    False    åˆ›å»ºæ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
        private String updateTime;//    string    False    æ›´æ–°æ—¶é—´ï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
import java.util.List;
@Data
public class VehicleInfoResponse {
     private String vehicleId    ;//    string    False    è½¦è¾†ID(最大长度64)
     private String plateNo    ;//    string    False    è½¦ç‰Œå·ç ï¼ˆæœ€å¤§é•¿åº¦64)
     private Integer isBandPerson    ;//    number    False    æ˜¯å¦å…³è”人员
     private String personId        ;//string    False    äººå‘˜ID(最大长度64)
     private String personName    ;//    string    False    äººå‘˜å§“名
     private Integer plateType    ;//    number    False    è½¦ç‰Œç±»åž‹ï¼Œè¯¦è§é™„录A.14 è½¦ç‰Œç±»åž‹
     private Integer plateColor        ;//number    False    è½¦ç‰Œé¢œè‰²ï¼Œè¯¦è§é™„录A.15 è½¦ç‰Œé¢œè‰²
     private Integer vehicleType        ;//number    False    è½¦è¾†ç±»åž‹ï¼Œè¯¦è§é™„录A.16 è½¦è¾†ç±»åž‹
     private Integer vehicleColor        ;//number    False    è½¦è¾†é¢œè‰²ï¼Œè¯¦è§é™„录A.17 è½¦è¾†é¢œè‰²
     private String description     ;//    string    False    è½¦è¾†æè¿°
     private String regionIndexCode    ;//    string    False    æ‰€å±žåŒºåŸŸ
     private String regionName        ;//string    False    æ‰€å±žåŒºåŸŸå
     private String regionPath        ;//string    False    æ‰€å±žåŒºåŸŸè·¯å¾„,@分隔
     private String regionPathName        ;//string    False    æ‰€å±žåŒºåŸŸè·¯å¾„名,/分隔
     private String orgPath    ;//    string    False    æ‰€å±žç»„织目录,@分隔
     private String orgPathName    ;//    string    False    æ‰€å±žåŒºåŸŸè·¯å¾„名,/分隔
     private String createTime    ;//    string    False    åˆ›å»ºæ—¶é—´ 2019-12-11T11:30:51.502+08:00
     private String updateTime    ;//    string    False    ä¿®æ”¹æ—¶é—´ 2019-12-11T11:30:51.502+08:00
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VehicleTimeRangeInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
@Data
public class VehicleTimeRangeInfoResponse {
     private String vehicleId    ;//string    False    dataId
     private String plateNo    ;//string    False    è½¦ç‰Œå·ç 
     private Integer isBandPerson;//    number    False    æ˜¯å¦å…³è”人员
     private String personId    ;//string    False    äººå‘˜IndexCode
     private Integer plateType    ;//number    False    è½¦ç‰Œç±»åž‹ï¼Œè¯¦è§é™„录A.14 è½¦ç‰Œç±»åž‹
     private Integer plateColor    ;//number    False    è½¦ç‰Œé¢œè‰²ï¼Œè¯¦è§é™„录A.15 è½¦ç‰Œé¢œè‰²
     private Integer vehicleType    ;//number    False    è½¦è¾†ç±»åž‹ï¼Œè¯¦è§é™„录A.16 è½¦è¾†ç±»åž‹
     private Integer vehicleColor;//    number    False    è½¦è¾†é¢œè‰²ï¼Œè¯¦è§é™„录A.17 è½¦è¾†é¢œè‰²
     private String description    ;//tring    False    è½¦è¾†æè¿°
     private String regionIndexCode    ;//string    False    æ‰€å±žåŒºåŸŸ
     private Integer status;//    number    False    çŠ¶æ€ç å°äºŽ0则代表资源已被删除
     private String updateTime    ;//string    False    æ›´æ–°æ—¥æœŸï¼Œéµå®ˆISO8601标准,如2018-07-26T21:30:08+08:00表示北京时间2017å¹´7月26日21时30分08秒
     private String createTime    ;//string    False    åˆ›å»ºæ—¥æœŸï¼Œéµå®ˆISO8601标准,如2018-07-26T21:30:08+08:00表示北京时间2017å¹´7月26日21时30分08秒
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/VisitingInfoResponse.java
@@ -3,49 +3,43 @@
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class AppointmentInfoResponse {
    private String appointRecordId        ;//string    False    é¢„约记录ID,可作为修改预约的依据
    private String receptionistId        ;//string    False    è¢«è®¿äººå”¯ä¸€æ ‡è¯†
    private String receptionistName        ;//string    False    è¢«è®¿äººå§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
    private String receptionistCode        ;//string    False    è¢«è®¿äººæ‰€å±žç»„织编码
    private String visitStartTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,
    private String visitEndTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区, é¢„计离开时间必须晚于当前时间和预计来访时间
    private String visitPurpose        ;//string    False    æ¥è®¿äº‹ç”±
    private String visitorName        ;//string    False    è®¿å®¢å§“名
    private String visitorWorkUnit        ;//string    False    æ¥è®¿å•位
    private String visitorAddress        ;//string    False    è®¿å®¢ä½å€
    private String visitorId        ;//string    False    è®¿å®¢Id
    private String verificationCode        ;//string    False    è®¿å®¢éªŒè¯ç ï¼Œç”¨äºŽè®¿å®¢åœ¨è®¿å®¢æœºç™»è®°çš„凭证
    private String QRCode        ;//string    False    åŠ¨æ€äºŒç»´ç ï¼Œå¦‚éœ€è¦ä½¿ç”¨ï¼Œå¯å°†è®¿å®¢äºŒç»´ç å†…å®¹è½¬æˆäºŒç»´ç å›¾ç‰‡å³å¯
    private Integer gender;//    integer    False    1-男,  2-女
    private String phoneNo        ;//string    False    è”系电话建议填写手机号码,仅支持纯数字。
    private String plateNo        ;//string    False    è®¿å®¢è½¦ç‰Œå·
    private Integer certificateType    ;//    integer    False    è¯ä»¶ç±»åž‹ï¼Œè¯¦è§é™„录A.11 è¯ä»¶ç±»åž‹
    private String certificateNo        ;//string    False    è¯ä»¶å·ï¼Œæ ¼å¼ä¸ºï¼š1~20个数字、字母组成
    private String picUri        ;//string    False    è¿”回图片的相对Uri;需要调用获取访客记录中的图片接口,来获取图片的数据
    private String svrIndexCode        ;//string    False    ä¸ŽpicUri配对输出的字段信息,用于“获取访客记录的图片”接口的输入参数
    /**
     * è®¿å®¢å•状态,
     *             0:待审核、
     *             1:正常、
     *             2:迟到、
     *             3:失效、
     *             4:审核退回、
     *             9:审核失效、
     *             10:邀约中、
     *             11:邀约失效
     */
    private Integer visitorStatus        ;//integer    False
    private String certAddr        ;//string    False    è¯ä»¶åœ°å€
    private String certIssuer        ;//string    False    å‘证机关
    private Integer nation    ;//integer    False
    private String birthplace        ;//string    False    ç±è´¯
    private String orderId        ;//string    False    è®¿å®¢è®°å½•唯一标识,用于已预约登记、访客签离等操作
    private List<AppointmentResInfoResponse> designatedResources;//    object    False    æƒé™ä¸‹å‘指定的资源点集合
    private String[] privilegeGroupNames;//    string[]    False    æƒé™ç»„名称集合
    private String identityUri        ;//string    False    è¯ä»¶ç…§,图片的相对URL
    private String identitySvrCode        ;//string    False    è¯ä»¶ç…§å¯¹åº”图片服务器serviceNodes
public class VisitingInfoResponse {
      private String visitorStatus;//    number    False    5:超期自动签离6:已签离7:超期未签离8:已到达
      private String visiorGroupId    ;//string    False    è®¿å®¢åå•分组ID
      private String visiorGroupName;//    string    False    è®¿å®¢åå•分组名称,支持中英文字符,不能包含 â€™ / \ : * ? " < >
      private String orderId    ;//string    False    è®¿å®¢ç™»è®°æ—¶çš„登记id,可以用来做访客签离。此id如访客登记返回的id一致
      private Integer personNum;//    number    False    æ¥è®¿äººæ•°ï¼Œä¸å°äºŽ1,不大于999
      private String plannedStartTime;//    string    False    é¢„计来访时间,时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区,例如北京时间:
      private String plannedEndTime;//    string    False    é¢„计离开时间,时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区,例如北京时间:
      private String appointRecordId        ;//string    False    é¢„约记录ID,可作为修改预约的依据
      private String receptionistId        ;//string    False    è¢«è®¿äººå”¯ä¸€æ ‡è¯†
      private String receptionistName        ;//string    False    è¢«è®¿äººå§“名,支持中英文字符,不能包含 â€™ / \ : * ? " < >
      private String receptionistCode        ;//string    False    è¢«è®¿äººæ‰€å±žç»„织编码
      private String visitStartTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,
      private String visitEndTime        ;//string    False    æ—¶é—´å‚数需满足ISO8601格式:  yyyy-MM-ddTHH:mm:ss+当前时区, é¢„计离开时间必须晚于当前时间和预计来访时间
      private String visitPurpose        ;//string    False    æ¥è®¿äº‹ç”±
      private String visitorName        ;//string    False    è®¿å®¢å§“名
      private String visitorWorkUnit        ;//string    False    æ¥è®¿å•位
      private String visitorAddress        ;//string    False    è®¿å®¢ä½å€
      private String visitorId        ;//string    False    è®¿å®¢Id
      private String verificationCode        ;//string    False    è®¿å®¢éªŒè¯ç ï¼Œç”¨äºŽè®¿å®¢åœ¨è®¿å®¢æœºç™»è®°çš„凭证
      private String QRCode        ;//string    False    åŠ¨æ€äºŒç»´ç ï¼Œå¦‚éœ€è¦ä½¿ç”¨ï¼Œå¯å°†è®¿å®¢äºŒç»´ç å†…å®¹è½¬æˆäºŒç»´ç å›¾ç‰‡å³å¯
      private Integer gender;//    integer    False    1-男,  2-女
      private String phoneNo        ;//string    False    è”系电话建议填写手机号码,仅支持纯数字。
      private String plateNo        ;//string    False    è®¿å®¢è½¦ç‰Œå·
      private Integer certificateType    ;//    integer    False    è¯ä»¶ç±»åž‹ï¼Œè¯¦è§é™„录A.11 è¯ä»¶ç±»åž‹
      private String certificateNo        ;//string    False    è¯ä»¶å·ï¼Œæ ¼å¼ä¸ºï¼š1~20个数字、字母组成
      private String picUri        ;//string    False    è¿”回图片的相对Uri;需要调用获取访客记录中的图片接口,来获取图片的数据
      private String svrIndexCode        ;//string    False    ä¸ŽpicUri配对输出的字段信息,用于“获取访客记录的图片”接口的输入参数
      private String certAddr        ;//string    False    è¯ä»¶åœ°å€
      private String certIssuer        ;//string    False    å‘证机关
      private Integer nation    ;//integer    False
      private String birthplace        ;//string    False    ç±è´¯
      private List<AppointmentResInfoResponse> designatedResources;//    object    False    æƒé™ä¸‹å‘指定的资源点集合
      private String[] privilegeGroupNames;//    string[]    False    æƒé™ç»„名称集合
      private String identityUri        ;//string    False    è¯ä»¶ç…§,图片的相对URL
      private String identitySvrCode        ;//string    False    è¯ä»¶ç…§å¯¹åº”图片服务器serviceNodes
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.TypeReference;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.HKTools;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseRequst;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
@@ -23,13 +24,13 @@
     * èŽ·å–æ ¹ç»„ç»‡æ•°æ®
     * @return
     */
    public  static  BaseResponse<OrgListResponse>  getRootOrg(BaseRequst param){
    public  static  BaseResponse<OrgInfoResponse>  getRootOrg(BaseRequst param){
        log.info("【海康获取根组织】================开始====");
        try {
            String res = HKTools.getRootOrg ();
            TypeReference typeReference =
                    new TypeReference< BaseResponse<OrgListResponse>>(){};
            BaseResponse<OrgListResponse> result = JSONObject.parseObject(res, typeReference.getType());
                    new TypeReference< BaseResponse<OrgInfoResponse>>(){};
            BaseResponse<OrgInfoResponse> result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康获取根组织");
            return  result;
        }catch (Exception e){
@@ -782,7 +783,150 @@
        }
        return  null;
    }
    /**
     *查询访客预约记录(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>   appointmentRecords(AppointmentListRequest param){
        log.info("【海康访客预约记录查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.appointmentRecords(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>>(){};
            BaseResponse<BaseListPageResponse<AppointmentInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客预约记录查询");
            return  result;
        }catch (Exception e){
            log.error("【海康访客预约记录查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *查询访客来访记录(已登记)(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<VisitingInfoResponse>>   visitingRecords(VisitingInfoRequest param){
        log.info("【海康访客来访记录查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.visitingRecords(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference<BaseResponse<BaseListPageResponse<VisitingInfoResponse>>>(){};
            BaseResponse<BaseListPageResponse<VisitingInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康访客来访记录查询");
            return  result;
        }catch (Exception e){
            log.error("【海康访客来访记录查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *全量组织查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<OrgInfoResponse>>   orgAllList(TimeRangeListRequest param){
        log.info("【海康全量组织查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.orgAllList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<OrgInfoResponse>>> (){};
            BaseResponse<BaseListPageResponse<OrgInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康全量组织查询");
            return  result;
        }catch (Exception e){
            log.error("【海康全量组织查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *增量组织查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>>   orgTimeRangeList(TimeRangeListRequest param){
        log.info("【海康增量组织查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.orgTimeRangeList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<OrgTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康增量组织查询");
            return  result;
        }catch (Exception e){
            log.error("【海康增量组织查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *全量人员查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<UserInfoResponse>>   userAllList(TimeRangeListRequest param){
        log.info("【海康全量人员查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.userAllList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<UserInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<UserInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康全量人员查询");
            return  result;
        }catch (Exception e){
            log.error("【海康全量人员查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *增量人员查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>>   userTimeRangeList(TimeRangeListRequest param){
        log.info("【海康增量人员查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.userTimeRangeList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<UserTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康增量人员查询");
            return  result;
        }catch (Exception e){
            log.error("【海康增量人员查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *全量车辆查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<VehicleInfoResponse>>   vehicleList(TimeRangeListRequest param){
        log.info("【海康全量人员查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.vehicleList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<VehicleInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<VehicleInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康全量人员查询");
            return  result;
        }catch (Exception e){
            log.error("【海康全量人员查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *增量车辆查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   vehicleTimeRangeList(TimeRangeListRequest param){
        log.info("【海康增量人员查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.vehicleTimeRangeList(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康增量人员查询");
            return  result;
        }catch (Exception e){
            log.error("【海康增量人员查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    private static void logResult(BaseResponse res,String name) {
        if(StringUtils.equals(res.getCode(),HKConstants.RESPONSE_SUCCEE)){
            log.info("【"+name+"】================成功====\n"+res);
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -85,6 +85,7 @@
    public static  boolean DEALING_HK_ORG = false;
    public static  boolean DEALING_HK_USER = false;
    public static  boolean DEALING_HK_VISIT = false;
    public static  boolean DEALING_FROM_HK_VISIT = false;
    public static  boolean DEALING_HK_EMPOWER = false;
    public static  boolean DEALING_HK_EMPOWER_DETAIL = false;
    public static  boolean DEALING_HK_EMPOWER_RESULT = false;
server/dmvisit_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -58,6 +58,23 @@
        }
        return  null;
    }
    /**
     * ä¼ å…¥Data类型日期,返回字符串类型时间(ISO8601标准时间)
     * @param date
     * @return
     */
    public static String getISO8601Timestamp2(Date date){
        try {
            TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
            //TimeZone tz = TimeZone.getTimeZone("GMT-01");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'+'08:00");
            df.setTimeZone(tz);
            String nowAsISO = df.format(date);
            return nowAsISO;
        }catch (Exception e){
        }
        return  null;
    }
    public static Date getISO8601DateByStr(String date)  {
        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
        if(date!=null ){
@@ -68,6 +85,25 @@
        }
        //TimeZone tz = TimeZone.getTimeZone("GMT-01");
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
//        DateFormat df = new SimpleDateFormat("2023-12-08 T 09:25:54.698+08:00");
        df.setTimeZone(tz);
        Date nowAsISO = null;
        try {
            nowAsISO = df.parse(date);
        } catch (ParseException e) {
        }
        return nowAsISO;
    }
    public static Date getISO8601DateByStr2(String date)  {
        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
        if(date!=null ){
            int i = date.indexOf("+");
            if(i >0){
                date = date.substring(0,i);
            }
        }
        //TimeZone tz = TimeZone.getTimeZone("GMT-01");
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
//        DateFormat df = new SimpleDateFormat("2023-12-08 T 09:25:54.698+08:00");
        df.setTimeZone(tz);
        Date nowAsISO = null;
@@ -2788,8 +2824,11 @@
    public static void main(String[] args) {
        try {
            System.out.println(RandomStringUtils.randomNumeric(3));
            Date date = getISO8601DateByStr("2023-02-26T08:59:55.206+08:00");
            Date date = getISO8601DateByStr("2024-02-21T15:46:36.014+08:00");
            System.out.println(getISO8601Timestamp(date));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
server/dmvisit_service/src/main/java/com/doumee/dao/admin/request/MemberQuery.java
@@ -56,5 +56,7 @@
    @ApiModelProperty(value = "erp机构主键 ")
    private String erpOrgId;
    @ApiModelProperty(value = "机构主键 ")
    private String companyId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/CarsMapper.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Cars;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface CarsMapper extends BaseMapper<Cars> {
    void insertBatchSomeColumn(List<Cars> allHkList);
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarEvent.java
@@ -231,9 +231,6 @@
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "人员类型")
    @TableField(exist = false)
    private String memberType;
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
@@ -242,5 +239,23 @@
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    private Date endTime;
    @ApiModelProperty(value = "人员名称 ")
    @TableField(exist = false)
    private String memberName  ;
    @ApiModelProperty(value = "统计数量 ")
    @TableField(exist = false)
    private int num  ;
    @ApiModelProperty(value = "小时 ")
    @TableField(exist = false)
    private Integer hour  ;
    @ApiModelProperty(value = "人员编码 ")
    private Integer memberId  ;
    @ApiModelProperty(value = "人员类型 0劳务访客 1普通访客  2员工")
    @TableField(exist = false)
    private Integer memberType  ;
    @ApiModelProperty(value = "访客公司名称")
    @TableField(exist = false)
    private String visitCompanyName;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Cars.java
@@ -32,7 +32,6 @@
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码")
@@ -41,7 +40,6 @@
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Company.java
@@ -169,7 +169,6 @@
    @TableField(exist = false)
    private String parentName;
    @ApiModelProperty(value = "海康上级组织")
    @TableField(exist = false)
    private String hkParentId;
    @TableField(exist = false)
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -210,7 +210,7 @@
    private String companyName;
    @ApiModelProperty(value = "组织海康编码")
    @TableField(exist = false)
    private String companyHkId;
    private String hkOrgId;
    @ApiModelProperty(value = "角色编码查询")
    @TableField(exist = false)
    private String roleIdParam;
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/VisitEvent.java
@@ -179,4 +179,8 @@
    @ApiModelProperty(value = "公司/部门名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "统计数量 ")
    @TableField(exist = false)
    private int num  ;
}
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/ERPSyncService.java
ÎļþÃû´Ó server/dmvisit_service/src/main/java/com/doumee/service/business/ERPSyncService.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.service.business;
package com.doumee.service.business.ext;
import com.doumee.core.erp.model.openapi.request.erp.*;
import com.doumee.core.erp.model.openapi.response.erp.ApproveInfoResponse;
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
ÎļþÃû´Ó server/dmvisit_service/src/main/java/com/doumee/service/business/HkSyncService.java ÐÞ¸Ä
@@ -1,4 +1,4 @@
package com.doumee.service.business;
package com.doumee.service.business.ext;
import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest;
import com.doumee.core.haikang.model.param.request.DoorsListRequest;
@@ -9,6 +9,7 @@
import com.doumee.core.haikang.model.param.request.event.visit.EventVisitRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
 * åœè½¦åœºäº‹ä»¶æŽ¨é€è®°å½•表Service定义
@@ -57,6 +58,12 @@
    void syncOrgData();
    void syncUserData();
    void syncVistAppointData(Date date);
    void syncVehicleData();
    void syncVehicleUpdateData(Date date);
    void syncUserUpdateData(Date start, Date end);
    void syncOrgUpdateData(Date start, Date end);
    void syncVisitData();
    void syncEmpowerData();
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarEventServiceImpl.java
@@ -290,15 +290,7 @@
        if(null != carEventExcel && carEventExcel.getRecords().size() > 0) {
            carEventExcel.getRecords().stream().forEach(obj->{
                CarEventVo vo = new CarEventVo();
                if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_LINE_IN.getKey()){
                    vo.setEventTypeName(HKConstants.EventTypes.PARK_LINE_IN.getName());
                }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_PASS_IN.getKey()){
                    vo.setEventTypeName(HKConstants.EventTypes.PARK_PASS_IN.getName());
                }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_LINE_OUT.getKey()){
                    vo.setEventTypeName(HKConstants.EventTypes.PARK_LINE_OUT.getName());
                }else{
                    vo.setEventTypeName(HKConstants.EventTypes.PARK_PASS_OUT.getName());
                }
                vo.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType())) ;
                if(null != obj.getPersonType()) {
                    if(Constants.ZERO == obj.getPersonType()){
                        vo.setTypeName(Constants.Status.LW_FK.getDes());
@@ -336,8 +328,8 @@
        MPJLambdaWrapper<CarEvent> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.leftJoin(Cars.class,Cars::getCode,CarEvent::getPlateNos)
                .leftJoin(Member.class,Member::getId,Cars::getMemberId)
        queryWrapper
                .leftJoin(Member.class,Member::getId,CarEvent::getMemberId)
                .leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.selectAll(CarEvent.class)
                .selectAs(Member::getType,CarEventDTO::getPersonType)
@@ -357,7 +349,7 @@
                .like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),
                        Company::getName,
                        pageWrap.getModel().getCompanyName())
                .eq(StringUtils.isNotBlank(pageWrap.getModel().getMemberType()),
                .eq( pageWrap.getModel().getMemberType()!=null,
                        Member::getType,
                        pageWrap.getModel().getMemberType())
                .eq(Objects.nonNull(pageWrap.getModel().getEventType()),
@@ -366,7 +358,8 @@
                .ge(Objects.nonNull(pageWrap.getModel().getStartTime()),
                        CarEvent::getCreateDate, pageWrap.getModel().getStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getEndTime()),
                        CarEvent::getCreateDate, pageWrap.getModel().getEndTime());
                        CarEvent::getCreateDate, pageWrap.getModel().getEndTime())
                .orderByDesc(CarEvent::getCreateDate);
        IPage<CarEventDTO> carEventDTOIPage = carEventJoinMapper.selectJoinPage(page, CarEventDTO.class, queryWrapper);
        return carEventDTOIPage;
    }
@@ -377,18 +370,21 @@
        Map<String,SystemDictData> dataMap = list.stream().collect(Collectors.toMap(SystemDictData::getLabel, Function.identity()));
        List<CarEventDTO> newDataList = new ArrayList<>();
        newCarEventDTOList.stream().forEach(obj->{
            obj.setVehiclePicUrl(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                    +dataMap.get(Constants.CAR_EVENT_IMG).getCode()
                    +obj.getVehiclePicUrl());
            if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_LINE_IN.getKey()){
                obj.setEventTypeName(HKConstants.EventTypes.PARK_LINE_IN.getName());
            }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_PASS_IN.getKey()){
                obj.setEventTypeName(HKConstants.EventTypes.PARK_PASS_IN.getName());
            }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.PARK_LINE_OUT.getKey()){
                obj.setEventTypeName(HKConstants.EventTypes.PARK_LINE_OUT.getName());
            }else{
                obj.setEventTypeName(HKConstants.EventTypes.PARK_PASS_OUT.getName());
            if(obj.getVehiclePicUrl()!=null
                    && !obj.getVehiclePicUrl().startsWith(HKConstants.IMG_INDEX)
                    && !obj.getVehiclePicUrl().startsWith(HKConstants.IMG_INDEX_ERROR)){
                obj.setVehiclePicUrl(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                        +dataMap.get(Constants.CAR_EVENT_IMG).getCode()
                        +obj.getVehiclePicUrl());
            }
            if(obj.getPlatePicUrl()!=null
                    && !obj.getVehiclePicUrl().startsWith(HKConstants.IMG_INDEX)
                    && !obj.getVehiclePicUrl().startsWith(HKConstants.IMG_INDEX_ERROR)){
                obj.setPlatePicUrl(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                        +dataMap.get(Constants.CAR_EVENT_IMG).getCode()
                        +obj.getPlatePicUrl());
            }
             obj.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType()) );
            newDataList.add(obj);
        });
        return newDataList;
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
@@ -56,6 +57,8 @@
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -441,23 +444,29 @@
    @Override
    public List<CompanyDTO> findCompanyTreePage(Integer type) {
        //配置组员人员类型来源方式 0自建 1ERP
        String origin = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORG_USER_ORIGIN).getCode();
        LambdaQueryWrapper<Company> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Company::getIsdeleted,Constants.ZERO)
                .eq(Constants.equalsInteger(type,Constants.ONE),Company::getType,type);
        List<Company> companies = companyMapper.selectList(wrapper);
        return getCompanyTree( companies, null,origin);
        return getCompanyTree( companies, null);
    }
    private List<CompanyDTO> getCompanyTree(List<Company> companies, String parentId,String origin){
    private List<CompanyDTO> getCompanyTree(List<Company> companies, String parentId){
        if (CollectionUtils.isEmpty(companies)){
            return null;
        }
        List<Company> collect = companies.stream()
                                        .filter(s -> (StringUtils.equals(origin, Constants.ONE+"")?StringUtils.equals(s.getErpParentId(), parentId):StringUtils.equals(s.getParentId()+"", parentId)))
                                        .collect(Collectors.toList());
        int  origin =Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin());
        List<Company> collect = null;
        if(origin == DataSyncConfig.origin.erp){
            companies.stream().filter(s -> ( StringUtils.equals(s.getErpParentId()+"", parentId))).collect(Collectors.toList());
        }else if(origin == DataSyncConfig.origin.hk){
            companies.stream().filter(s -> ( StringUtils.equals(s.getHkParentId()+"", parentId))).collect(Collectors.toList());
        }else{
            companies.stream().filter(s -> ( StringUtils.equals(s.getParentId()+"", parentId))).collect(Collectors.toList());
        }
        if (CollectionUtils.isEmpty(companies)){
            return null;
        }
@@ -466,7 +475,13 @@
            Company company = collect.get(i);
            CompanyDTO companyDTO = new CompanyDTO();
            BeanUtils.copyProperties(company,companyDTO);
            companyDTO.setCompanyDTOList(getCompanyTree(companies,StringUtils.equals(origin, Constants.ONE+"")?company.getErpId(): company.getId()+"",origin));
            String pId = company.getId()+"";
            if(origin == 1){
                pId = company.getErpId();
            }else if(origin == 2){
                pId = company.getHkParentId();
            }
            companyDTO.setCompanyDTOList(getCompanyTree(companies,pId));
            companyDTOList.add(companyDTO);
        }
        return companyDTOList;
@@ -510,8 +525,7 @@
        queryWrapper.eq(Company::getType,type);
        List<Company> companyList = companyJoinMapper.selectJoinList(Company.class,queryWrapper);
        //配置组员人员类型来源方式 0自建 1ERP
        String origin = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORG_USER_ORIGIN).getCode();
        CompanyTree treeBuild = new CompanyTree(companyList,Integer.valueOf(origin));
        CompanyTree treeBuild = new CompanyTree(companyList, dataSyncConfig.getOrgUserDataOrigin());
        companyList = treeBuild.buildTree();
        return companyList;
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceEventServiceImpl.java
@@ -14,10 +14,7 @@
import com.doumee.dao.admin.response.DeviceEventDTO;
import com.doumee.dao.business.DeviceEventMapper;
import com.doumee.dao.business.join.DeviceEventJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.DeviceEvent;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemDictDataMapper;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.system.vo.DeviceEventVo;
@@ -343,11 +340,7 @@
                }else {
                    eventVo.setExtEventInOutName("");
                }
                if (Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getKey()) {
                    eventVo.setEventTypeName(HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getName());
                } else if (Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getKey()) {
                    eventVo.setEventTypeName(HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getName());
                }
                eventVo.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType())) ;
                try {
                    eventVo.setHappenTime(DateUtil.timeEscape(obj.getHappenTime()));
                } catch (ParseException e) {
@@ -393,7 +386,8 @@
                        pageWrap.getModel().getStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getEndTime()),
                        DeviceEvent::getCreateDate,
                        pageWrap.getModel().getEndTime());
                        pageWrap.getModel().getEndTime())
                .orderByDesc(DeviceEvent::getCreateDate);
        queryWrapper.orderByDesc(DeviceEvent::getHappenTime);
        IPage<DeviceEventDTO> deviceEventDTOIPage = deviceEventJoinMapper.selectJoinPage(page, DeviceEventDTO.class, queryWrapper);
        return deviceEventDTOIPage;
@@ -402,31 +396,22 @@
    // å¯¹å›¾ç‰‡è¿›è¡Œåˆ¤æ–­å¤„理
    private List<DeviceEventDTO> newDeviceEvent(List<DeviceEventDTO> DeviceEventDTOList) {
        List<DeviceEventDTO> newDeviceEventDTOS = new ArrayList<>();
        List<String> codes = Arrays.asList(Constants.FTP_RESOURCE_PATH,Constants.DEVICE_EVENT_IMG);
        List<SystemDictData> list = systemDictDataMapper.list(codes);
        for (DeviceEventDTO dto:DeviceEventDTOList) {
           if(StringUtils.isNotBlank(dto.getExtEventPictureURL())) {
               String extEventPictureURL = dto.getExtEventPictureURL();
               // ä½¿ç”¨split("/")将URL按照"/"进行分割成多个部分
               String[] parts = extEventPictureURL.split("\\\\");
               String newStr = parts[0];
               boolean number = Validator.isNumber(newStr);
               if(number) {
                   List<String> codes = Arrays.asList(Constants.FTP_RESOURCE_PATH,Constants.DEVICE_EVENT_IMG);
                   List<SystemDictData> list = systemDictDataMapper.list(codes);
           if(StringUtils.isNotBlank(dto.getExtEventPictureURL())
                   && !dto.getExtEventPictureURL().startsWith(HKConstants.IMG_INDEX)
                   && !dto.getExtEventPictureURL().startsWith(HKConstants.IMG_INDEX_ERROR)) {
                   if(null != list && list.size() > 0) {
                       Map<String,SystemDictData> dataMap = list.stream().collect(Collectors.toMap(SystemDictData::getLabel, Function.identity()));
                       dto.setExtEventPictureURL(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                                                 +dataMap.get(Constants.DEVICE_EVENT_IMG).getCode()
                                                 +dto.getExtEventPictureURL());
                       if(StringUtils.isNotBlank(dto.getExtEventPictureURL())){
                           dto.setExtEventPictureURL(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                                   +dataMap.get(Constants.DEVICE_EVENT_IMG).getCode()
                                   +dto.getExtEventPictureURL());
                       }
                   }
               }else {
                   dto.setExtEventPictureURL(null);
               }
           }
            if(Constants.formatIntegerNum(dto.getEventType()) == HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getKey()){
                dto.setEventTypeName(HKConstants.EventTypes.DOOR_FACE_AUTH_SUCCESS.getName());
            }else if(Constants.formatIntegerNum(dto.getEventType()) == HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getKey()){
                dto.setEventTypeName(HKConstants.EventTypes.DOOR_FACE_AUTH_FAIL.getName());
            }
            dto.setEventTypeName(HKConstants.EventTypes.getName(dto.getEventType())) ;
            try {
                dto.setHappenTime(DateUtil.timeEscape(dto.getHappenTime()));
            } catch (ParseException e) {
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceRoleServiceImpl.java
@@ -201,6 +201,7 @@
        IPage<DeviceRole> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<DeviceRole> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(DeviceRole::getId, pageWrap.getModel().getId());
        }
@@ -233,10 +234,9 @@
        if (StringUtils.isNotBlank(pageWrap.getModel().getType())) {
            if(pageWrap.getModel().getType().length() > 1) {
                String[] types = pageWrap.getModel().getType().split(",");
                queryWrapper.lambda()
                        .eq(DeviceRole::getType, types[0])
                queryWrapper.lambda().and(p-> p.eq(DeviceRole::getType, types[0])
                        .or()
                        .eq(DeviceRole::getType, types[1]);
                        .eq(DeviceRole::getType, types[1]));
            }else {
                queryWrapper.lambda().eq(DeviceRole::getType, pageWrap.getModel().getType());
            }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberCardServiceImpl.java
@@ -18,20 +18,17 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.admin.response.CarEventDTO;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.MemberCardJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberCard;
import com.doumee.dao.business.model.Retention;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.MemberCardService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.business.impl.hksync.HkSyncOrgUserServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
@@ -41,8 +38,6 @@
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * ç”¨æˆ·å¡ç‰‡ç»‘定信息表Service实现
@@ -90,7 +85,7 @@
        }
        CardInfoRequest cr = new CardInfoRequest();
        cr.setCardNo(memberCard.getCode());
        cr.setOrgIndexCode(member.getCompanyHkId());
        cr.setOrgIndexCode(member.getHkOrgId());
        cr.setPersonId(member.getHkId());
        cr.setCardType(memberCard.getType());
        List<CardInfoRequest> cardList = new ArrayList<>();
@@ -232,8 +227,8 @@
     */
    private void dealMemberRoleEmpower(Member member ) {
        //处理新增的人员卡片数据(与海康同步)
        List<MemberCard> cards = HkSyncOrgUserServiceImpl.getNormalCardList(member,memberCardMapper);
        HkSyncOrgUserServiceImpl.dealMemberRoleEmpowerDo(cards,member,deviceRoleMapper,empowerMapper,deviceMapper);
        List<MemberCard> cards = HkSyncOrgUserToHKServiceImpl.getNormalCardList(member,memberCardMapper);
        HkSyncOrgUserToHKServiceImpl.dealMemberRoleEmpowerDo(cards,member,deviceRoleMapper,empowerMapper,deviceMapper);
    }
    @Override
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -9,6 +9,7 @@
import cn.hutool.core.util.ReUtil;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.config.Jwt.JwtPayLoad;
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.core.annotation.excel.ExcelImporter;
@@ -96,6 +97,8 @@
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Override
@@ -571,7 +574,6 @@
        } catch (Exception e) {
        }
//
    }
@@ -592,12 +594,15 @@
                .isNotNull(!Objects.isNull(pageWrap.getModel().getHasFace())&&Constants.equalsInteger(pageWrap.getModel().getHasFace(),Constants.ONE),Member::getFaceId)
                .eq(Objects.nonNull(pageWrap.getModel().getCanVisit()),Member::getCanVisit,pageWrap.getModel().getCanVisit())
                .eq(Objects.nonNull(pageWrap.getModel().getStatus()),Member::getStatus,pageWrap.getModel().getStatus())
                .eq(StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId())
                .eq(Member::getIsdeleted,Constants.ZERO)
//                .eq(Member::getStatus,Constants.Status.ENABLE.getValue())
                .eq(Member::getType,Constants.memberType.internal)
                .orderByDesc(Member::getCreateDate);
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())==DataSyncConfig.origin.erp){
            queryWrapper.eq( StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId());
        }else{
            queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Member::getCompanyId,pageWrap.getModel().getCompanyId());
        }
        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
        if(CollectionUtils.isNotEmpty(memberIPage.getRecords())){
@@ -630,13 +635,23 @@
            roleIds = roleIds.replace("[","").replace("]","");
            List<String> ids = Arrays.asList(roleIds.split(","));
            ids.forEach(i->{
                DeviceRole deviceRole = deviceRoleList.stream().filter(m->m.getId().toString().equals(i)).findFirst().get();
//                DeviceRole deviceRole = deviceRoleList.stream().filter(m->m.getId().toString().equals(i)).findFirst().get();
                DeviceRole deviceRole = findRoleById(deviceRoleList,i);
                if(!Objects.isNull(deviceRole)){
                    stringList.add(deviceRole.getName());
                }
            });
        }
        return stringList;
    }
    private DeviceRole findRoleById(List<DeviceRole> deviceRoleList, String id) {
        for(DeviceRole role  : deviceRoleList){
            if(StringUtils.equals(role.getId().toString(),id)){
                return role;
            }
        }
        return null;
    }
    @Override
@@ -654,13 +669,16 @@
                .and(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()), ms->ms.like(Member::getVisitCompanyName,pageWrap.getModel().getCompanyName())
                        .or().like(Company::getName,pageWrap.getModel().getCompanyName()))
                .like(StringUtils.isNotBlank(pageWrap.getModel().getIdcardNo()),Member::getIdcardNo,pageWrap.getModel().getIdcardNo())
                .eq(StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId())
                .eq(Objects.isNull(pageWrap.getModel().getStatus()),Member::getStatus,Constants.Status.ENABLE.getValue())
                .eq(!Objects.isNull(pageWrap.getModel().getStatus()),Member::getStatus,pageWrap.getModel().getStatus())
                .eq(Member::getType,Constants.memberType.visitor)
                .eq(Member::getIsdeleted,Constants.ZERO)
                .orderByDesc(Member::getCreateDate);
        if(Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin())==DataSyncConfig.origin.erp){
            queryWrapper.eq( StringUtils.isNotBlank(pageWrap.getModel().getErpOrgId()),Member::getErpOrgId,pageWrap.getModel().getErpOrgId());
        }else{
            queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getCompanyId()),Member::getCompanyId,pageWrap.getModel().getCompanyId());
        }
        IPage<MemberInfoDTO> memberIPage = memberJoinMapper.selectJoinPage(page, MemberInfoDTO.class,queryWrapper);
        return PageData.from(memberIPage);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ParksServiceImpl.java
@@ -107,10 +107,9 @@
        queryWrapper.leftJoin(" parks p on p.id=t.PARENT_HK_ID");
        queryWrapper.isNotNull(Parks::getParentHkId);
        queryWrapper.eq(Parks::getIsdeleted, Constants.ZERO);
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Parks::getName,pageWrap.getModel().getName());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getParentHkId()),Parks::getName,pageWrap.getModel().getParentHkId());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getParentHkId()),Parks::getParentHkId,pageWrap.getModel().getParentHkId());
        queryWrapper.orderByDesc(Parks::getCreateDate);
        IPage<Parks> result = parksJoinMapper.selectJoinPage(page, Parks.class,queryWrapper);
        return PageData.from(result);
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitEventServiceImpl.java
@@ -257,11 +257,7 @@
                eventVo.setPersonCompanyName(obj.getPersonCompanyName());
                eventVo.setCarNo(obj.getCarNo());
                eventVo.setBeVisitedPersonName(obj.getBeVisitedPersonName()+"-"+obj.getBeVisitedPersonOrg());
                if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_IN.getKey()){
                    eventVo.setEventTypeName(HKConstants.EventTypes.VISIT_SIGN_IN.getName());
                }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()){
                    eventVo.setEventTypeName(HKConstants.EventTypes.VISIT_SIGN_OUT.getName());
                }
                eventVo.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType()));
                eventVo.setHappenTime(obj.getHappenTime());
                voList.add(eventVo);
            });
@@ -315,14 +311,17 @@
        Map<String,SystemDictData> dataMap = list.stream().collect(Collectors.toMap(SystemDictData::getLabel, Function.identity()));
        List<VisitEventDTO> newDataList = new ArrayList<>();
        VisitEventDTOList.stream().forEach(obj->{
            obj.setCaptureUrl(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                    +dataMap.get(Constants.MEMBER_IMG).getCode()
                    +obj.getCaptureUrl());
            if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_IN.getKey()){
                obj.setEventTypeName(HKConstants.EventTypes.VISIT_SIGN_IN.getName());
            }else if(Constants.formatIntegerNum(obj.getEventType()) == HKConstants.EventTypes.VISIT_SIGN_OUT.getKey()){
                obj.setEventTypeName(HKConstants.EventTypes.VISIT_SIGN_OUT.getName());
            if(StringUtils.isNotBlank( obj.getCaptureUrl())
                    && !obj.getCaptureUrl().startsWith(HKConstants.IMG_INDEX)
                    && !obj.getCaptureUrl().startsWith(HKConstants.IMG_INDEX_ERROR)) {
                if(null != list && list.size() > 0) {
                    obj.setCaptureUrl(dataMap.get(Constants.FTP_RESOURCE_PATH).getCode()
                            +dataMap.get(Constants.MEMBER_IMG).getCode()
                            +obj.getCaptureUrl());
                }
            }
            obj.setEventTypeName(HKConstants.EventTypes.getName(obj.getEventType())) ;
            newDataList.add(obj);
        });
        return newDataList;
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.config.Jwt.JwtPayLoad;
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.core.constants.ResponseStatus;
@@ -32,7 +33,7 @@
import com.doumee.dao.business.join.DeviceEventJoinMapper;
import com.doumee.dao.business.join.VisitEventJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.InterfaceLogService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.Synchronized;
@@ -59,6 +60,8 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
@@ -131,7 +134,7 @@
    @Transactional
    @Synchronized
    public String syncCompany(OrgListRequest param){
        if(!StringUtils.equals(Constants.ONE+"", systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORG_USER_ORIGIN).getCode())){
        if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.erp){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
        }
        //获取ERP组织信息(全量同步)
@@ -282,8 +285,8 @@
    @Transactional
    @Synchronized
    public  String syncUsers(UserListRequest param){
        if(!StringUtils.equals(Constants.ONE+"", systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ORG_USER_ORIGIN).getCode())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持人员同步操作~");
        if( Constants.formatIntegerNum(dataSyncConfig.getOrgUserDataOrigin()) != DataSyncConfig.origin.erp){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
        }
        List<ErpUserListResponse>  list = erpTool.getErpUserList(ErpConstants.userListUrl,param);
        if(list !=null && list.size()>0) {
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -11,12 +11,13 @@
import com.doumee.core.haikang.model.param.respose.TaskAdditionResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.dao.business.model.Device;
import com.doumee.service.business.HkSyncService;
import com.doumee.service.business.ext.HkSyncService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -84,9 +85,24 @@
    public  void syncUserData(){
    }
    @Override
    public  void syncUserUpdateData(Date start, Date end){
    }
    @Override
    public  void syncVistAppointData(Date date){
    }
    public  void syncVehicleData(){
    }
    @Override
    public  void syncVehicleUpdateData(Date date){
    }
    @Override
    public  void syncOrgData( ){
    }
    @Override
    public  void syncOrgUpdateData( Date start, Date end){
    }
    @Override
    public  void  syncVisitData() {
    }
    @Override
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
@@ -15,19 +16,14 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.business.model.Device;
import com.doumee.dao.business.model.DeviceEvent;
import com.doumee.dao.business.model.VisitEvent;
import com.doumee.dao.business.model.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -44,6 +40,8 @@
    @Autowired
    private CarEventMapper carEventMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private DeviceEventMapper deviceEventMapper;
    @Autowired
@@ -63,6 +61,8 @@
            startDealCarImg();
            //查询所有门禁事件记录中所有下载的海康端 æŠ“拍照片 å’Œ   èº«ä»½è¯å›¾ç‰‡URL
            startDealDeviceImg();
            //查询所有人员人脸照片
            startDealMemberImg();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
@@ -71,6 +71,35 @@
        return  null;
    }
    private void startDealMemberImg() {
        List<Member> list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .eq(Member::getIsdeleted,Constants.ZERO)
                .likeRight(Member::getFaceImg,HKConstants.IMG_INDEX));
        Date date= new Date();
        if(list !=null && list.size()>0){
            for(Member model:list){
                String serverIndex = model.getFaceServerIndexCode();//服务器编码
                if(StringUtils.isBlank(serverIndex)){
                    continue;
                }
                String rs1 = null;
                Member event = new Member();
                event.setId(model.getId());
                event.setEditDate(date);
                if(StringUtils.isNotBlank(model.getFaceImg())){
                    String img1 = model.getFaceImg().replace(HKConstants.IMG_INDEX_ERROR, "").replace(HKConstants.IMG_INDEX, "");
                    rs1 = downHkImgToFtp(img1,serverIndex,Constants.MEMBER_IMG);
                    if(StringUtils.isNotBlank(rs1)){
                        event.setFaceImg(rs1);
                    }else{
                        event.setFaceImg(model.getFaceImg().replace(HKConstants.IMG_INDEX, HKConstants.IMG_INDEX_ERROR));
                    }
                }
                memberMapper.updateById(event);
            }
        }
    }
    private void startDealDeviceImg() {
        List<DeviceEvent> deviceEventList = deviceEventMapper.selectList(new QueryWrapper<DeviceEvent>().lambda()
                .eq(DeviceEvent::getIsdeleted,Constants.ZERO)
@@ -225,11 +254,17 @@
            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
            param.setSvrIndexCode(serverIndex);
            is = HKService.getVisitPicture(param);
        }else if(StringUtils.equals(folder_code,Constants.MEMBER_IMG)){
            //访客事件图片
            FacePictureRequest param = new FacePictureRequest();
            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
            param.setServerIndexCode(serverIndex);
            is = HKService.getFaceInputStream(param);
        }
        if(is ==null){
            return  null;
        }
        //TODO------jiangping---------
        try {
            if(ftp == null){
                 ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
@@ -240,7 +275,7 @@
                ftp.connect();
            }
            String date = DateUtil.getNowShortDate();
            String fName =  date+"/"+ UUID.randomUUID().toString()+".jpg";
            String fName =  date+"/"+ UUID.randomUUID().toString()+".png";
            String fileName = folder+fName;
            boolean r = ftp.uploadInputstream(is,fileName);//上传
            if(r){
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncInitConfigServiceImpl.java
@@ -2,19 +2,12 @@
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.EventSubRequest;
import com.doumee.core.haikang.model.param.respose.OrgListResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.dao.system.model.SystemDictData;
import com.hikvision.artemis.sdk.config.ArtemisConfig;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
/**
 * æµ·åº·äº‹ä»¶è®¢é˜…表Service实现
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPrivilegeServiceImpl.java
@@ -56,7 +56,7 @@
            List<Integer> types = new ArrayList<>();
            types.add(Constants.DOOR_ROLE_TYPE.fk);
            types.add(Constants.DOOR_ROLE_TYPE.lw);
            List<DeviceRole> allList = DeviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda().in(DeviceRole::getType,types));
            List<DeviceRole> allList = DeviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda().in(DeviceRole::getType,types).eq(DeviceRole::getIsdeleted,Constants.ZERO));
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
@@ -141,7 +141,7 @@
        model.setHkId(device.getPrivilegeGroupId());
        model.setName(device.getPrivilegeGroupName());
        model.setHkStatus(Constants.ONE);
        model.setIsdeleted(Constants.ONE);
        model.setIsdeleted(Constants.ZERO);
        model.setIsDefault(device.getIsDefault());
        model.setType(String.valueOf(Constants.ZERO));
        return  model;
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -48,6 +48,8 @@
    @Autowired
    private InterfaceLogMapper interfaceLogMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Autowired
    private DeviceEventMapper deviceEventMapper;
    @Autowired
    private MemberMapper memberMapper;
@@ -440,8 +442,9 @@
        event.setVehicleColor(request.getData().getVehicleColor());
        event.setVehicleClass(request.getData().getVehicleClass());
        event.setTimestr(request.getData().getTime());
        event.setEventId(request.getEventId());
        event.setTimeout(request.getTimeout());
        event.setSvrIndex(request.getSrcIndex());
        event.setSvrIndex(request.getData().getSvrIndex());
        event.setSubModel(request.getData().getSubModel());
        event.setSubLogo(request.getData().getSubLogo());
        event.setStatus(request.getStatus());
@@ -469,6 +472,7 @@
        event.setEventCmd(request.getData().getEventCmd());
        event.setCardNo(request.getData().getCardNo());
        event.setCarAttributeName(request.getData().getCarAttributeName());
        if(request.getData().getInResult()!=null && request.getData().getInResult().getRlsResult() !=null ){
            //放行方式
            event.setReleaseWay(request.getData().getInResult().getRlsResult().getReleaseWay());
@@ -483,7 +487,15 @@
            event.setVehiclePicUrl(getHkImgUrl(request.getData().getPicUrl().getVehiclePicUrl()));
            event.setPlatePicUrl(getHkImgUrl(request.getData().getPicUrl().getPlatePicUrl()));
        }
        if(StringUtils.isNotBlank(event.getPlateNos())){
                Cars cars = carsMapper.selectOne(new QueryWrapper<Cars>().lambda()
                        .eq(Cars::getCode,event.getPlateNos())
                                .eq(Cars::getIsdeleted,Constants.ONE )
                        .last("limit 1" ));
                if(cars!=null){
                    event.setMemberId(cars.getMemberId());
                }
        }
        return event;
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncVisitServiceImpl.java
@@ -1,9 +1,7 @@
package com.doumee.service.business.impl.hksync;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
@@ -14,16 +12,11 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ImageBase64Util;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.DeviceRole;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.ERPSyncService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -49,7 +42,7 @@
    @Autowired
    private WxPlatNotice wxPlatNotice;
    /**
     * åŒæ­¥æµ·åº·ç»„织信息,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     * åŒæ­¥æµ·åº·è®¿å®¢ä¿¡æ¯,根据erp同步组织结果,定时检查需要下发到海康的组织信息
     */
    @Override
    public  void syncVisitData(){
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -4,9 +4,7 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.erp.model.openapi.request.erp.UserFailRequest;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.*;
@@ -19,7 +17,7 @@
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.MemberJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.ext.ERPSyncService;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.slf4j.Slf4j;
@@ -38,7 +36,7 @@
 */
@Service
@Slf4j
public class HkSyncOrgUserFERPServiceImpl extends HkSyncBaseServiceImpl {
public class HkSyncOrgUserToHKServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncOrgUserFromHKServiceImpl.java
@@ -36,7 +36,7 @@
 */
@Service
@Slf4j
public class HkSyncOrgUserForHKServiceImpl extends HkSyncBaseServiceImpl {
public class HkSyncOrgUserFromHKServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
@@ -65,7 +65,7 @@
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持组织同步操作~");
            }
            LoginUserInfo user =  (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
            OrgUserListRequest param = new OrgUserListRequest();
            TimeRangeListRequest param = new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
@@ -74,12 +74,15 @@
            List<Company>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param = new OrgUserListRequest();
                param = new TimeRangeListRequest();
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<OrgInfoResponse>> response = HKService.orgAllList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<OrgInfoResponse> r = response.getData();
                curTotal += 100;
@@ -152,7 +155,7 @@
            if(companies == null || companies.size() == 0){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,请先同步企业组织信息~");
            }
            OrgUserListRequest param = new OrgUserListRequest();
            TimeRangeListRequest param = new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
@@ -160,13 +163,16 @@
            List<Member>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param = new OrgUserListRequest();
                param = new TimeRangeListRequest();
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<UserInfoResponse>> response = HKService.userAllList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<UserInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVehicleFromHKServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
package com.doumee.service.business.impl.hksync.fhk;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.AppointmentListRequest;
import com.doumee.core.haikang.model.param.request.TimeRangeListRequest;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.haikang.model.param.respose.VehicleInfoResponse;
import com.doumee.core.haikang.model.param.respose.VehicleTimeRangeInfoResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * æ‹‰å–海康车辆信息通过步Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
@Slf4j
public class HkSyncVehicleFromHKServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ParksMapper parksMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    @Transactional
    public   void syncVehicleData(){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            TimeRangeListRequest param =  new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            List<Cars>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<VehicleInfoResponse>> response = HKService.vehicleList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<VehicleInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewModelBYList(r.getList()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
            }
            //清空原有的数据
            carsMapper.delete(new UpdateWrapper<>());
            carsMapper.insertBatchSomeColumn(allHkList);//插入新数据
        }catch (BusinessException e){
            throw  e;
        }
    }
    @Override
    @Transactional
    public   void syncVehicleUpdateData(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            TimeRangeListRequest param =  new TimeRangeListRequest();
            //获取ERP组织信息(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            Date start =Utils.Date.getStart(date);
            Date end = new Date();
            if(DateUtil.daysBetweenDates(end,start) >1){
                end =  Utils.Date.getEnd(date);
            }
            param.setStartTime(DateUtil.getISO8601Timestamp2( start));
            param.setEndTime(DateUtil.getISO8601Timestamp2( end));
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<VehicleTimeRangeInfoResponse>> response = HKService.vehicleTimeRangeList(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<VehicleTimeRangeInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                     dealUpdateByList(r.getList());
                }
                curPage++;
            }
        }catch (BusinessException e){
            throw  e;
        }
    }
    private void dealUpdateByList(List<VehicleTimeRangeInfoResponse> list) {
        List<Cars> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return   ;
        }
        for(VehicleTimeRangeInfoResponse model :list){
            if(Constants.formatIntegerNum(model.getStatus()) <0){
                //如果已删除
                carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                        .eq(Cars::getHkId,model.getVehicleId())
                        .set(Cars::getIsdeleted,Constants.ONE ));
            }else{
                Cars c = new Cars();
                c.setHkId(model.getVehicleId());
                c.setCode(model.getPlateNo());
                c.setRemark(JSONObject.toJSONString(model));
                c.setHkStatus(Constants.ONE);
                c.setHkDate(new Date());
                c.setIsdeleted(Constants.ZERO);
                c.setStatus(Constants.ZERO);
                c.setCreateDate(DateUtil.getISO8601DateByStr(model.getCreateTime()));
                c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
                if(StringUtils.isNotBlank(model.getPersonId())){
                    //被访问人
                    Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,model.getPersonId()).last("limit 1"));
                    c.setMemberId(member!=null?member.getId():null);
                }
                Cars cars = carsMapper.selectOne(new QueryWrapper<Cars>().lambda().eq(Cars::getHkId,model.getVehicleId()).last("limit 1"));
                if(cars!=null){
                    //更新
                    c.setId(cars.getId());
                    carsMapper.updateById(c);
                }else{
                    //新增
                    carsMapper.insert(c);
                }
            }
        }
    }
    private List<Cars> getNewModelBYList(List<VehicleInfoResponse> list ) {
        List<Cars> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(VehicleInfoResponse model :list){
            Cars c = new Cars();
            c.setHkId(model.getVehicleId());
            c.setCode(model.getPlateNo());
            c.setRemark(JSONObject.toJSONString(model));
            c.setHkStatus(Constants.ONE);
            c.setHkDate(new Date());
            c.setIsdeleted(Constants.ZERO);
            c.setCreateDate(c.getHkDate());
            c.setCreateDate(DateUtil.getISO8601DateByStr(model.getCreateTime()));
            c.setEditDate(DateUtil.getISO8601DateByStr(model.getUpdateTime()));
            if(StringUtils.isNotBlank(model.getPersonId())){
                //被访问人
                Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getHkId,model.getPersonId()).last("limit 1"));
                c.setMemberId(member!=null?member.getId():null);
            }
            newList.add(c);
        }
        return newList;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/fhk/HkSyncVisitFromHKServiceImpl.java
@@ -10,12 +10,8 @@
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.AppointmentListRequest;
import com.doumee.core.haikang.model.param.request.OrgUserListRequest;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.haikang.model.param.respose.OrgInfoResponse;
import com.doumee.core.haikang.model.param.respose.UserInfoResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
@@ -23,15 +19,12 @@
import com.doumee.dao.business.CompanyMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Visits;
import com.doumee.service.business.impl.hksync.HkSyncBaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -46,7 +39,7 @@
 */
@Service
@Slf4j
public class HkSyncVistFromHKServiceImpl extends HkSyncBaseServiceImpl {
public class HkSyncVisitFromHKServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
@@ -64,11 +57,7 @@
     */
    @Override
    @Transactional
    public   void syncVistAppointData(){
        if(Constants.DEALING_FROM_HK_VISIT){
            return ;
        }
        Constants.DEALING_FROM_HK_VISIT =true;
    public   void syncVistAppointData(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
@@ -79,7 +68,13 @@
            int curTotal = 0;
            int curPage = 1;
            //查询今天的
            param.setVisitStartTimeBegin(DateUtil.getISO8601Timestamp( Utils.Date.getStart(new Date())));
            Date start =Utils.Date.getStart(date);
            Date end = new Date();
            if(DateUtil.daysBetweenDates(end,start) >1){
                end =  Utils.Date.getEnd(date);
           }
            param.setVisitStartTimeBegin(DateUtil.getISO8601Timestamp2( start));
            param.setVisitStartTimeEnd(DateUtil.getISO8601Timestamp2( end));
            List<Visits>  allHkList = new ArrayList<>();
            while (hasNext){
@@ -87,8 +82,11 @@
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<AppointmentInfoResponse>> response = HKService.appointmentRecords(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<AppointmentInfoResponse> r = response.getData();
                curTotal += 100;
@@ -105,15 +103,14 @@
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!");
            }
            //清空原有数据
            visitsMapper.delete(new UpdateWrapper<Visits>().lambda().apply("to_days(create_date)=to_days(now())" ));
            //清空原有当天的数据
            visitsMapper.delete(new UpdateWrapper<Visits>().lambda()
                    .ge(Visits::getStarttime,start)
                    .eq(Visits::getType,Constants.ONE)
                    .le(Visits::getStarttime,end));
            visitsMapper.insertBatchSomeColumn(allHkList);//插入新数据
        }catch (BusinessException e){
            throw  e;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
        }finally {
            Constants.DEALING_FROM_HK_VISIT =false;
        }
    }
@@ -131,8 +128,8 @@
            c.setHkDate(new Date());
            c.setIsdeleted(Constants.ZERO);
            c.setCreateDate(c.getHkDate());
            c.setStarttime(DateUtil.getISO8601DateByStr(model.getVisitStartTime()));
            c.setEndtime(DateUtil.getISO8601DateByStr(model.getVisitEndTime()));
            c.setStarttime(DateUtil.getISO8601DateByStr2(model.getVisitStartTime()));
            c.setEndtime(DateUtil.getISO8601DateByStr2(model.getVisitEndTime()));
            c.setReason(model.getVisitPurpose());
            c.setStatus(model.getVisitorStatus());
            c.setType(Constants.ONE);
server/dmvisit_service/src/main/java/com/doumee/service/common/tree/CompanyTree.java
@@ -1,6 +1,8 @@
package com.doumee.service.common.tree;
import com.doumee.config.DataSyncConfig;
import com.doumee.dao.business.model.Company;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
@@ -40,13 +42,18 @@
        // treeNode:查询出的每一条数据(节点)
        for (Company treeNode : nodeList){
            // åˆ¤æ–­å½“前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
            if(origin==0){
                if (Objects.isNull(treeNode.getParentId())) {
            if(origin== DataSyncConfig.origin.hk){
                if (Objects.isNull(treeNode.getHkParentId())) {
                    // æ˜¯ï¼Œæ·»åŠ 
                    rootNodeList.add(treeNode);
                }
            }else{
            }else if(origin== DataSyncConfig.origin.erp){
                if (Objects.isNull(treeNode.getErpParentId())) {
                    // æ˜¯ï¼Œæ·»åŠ 
                    rootNodeList.add(treeNode);
                }
            }else {
                if (Objects.isNull(treeNode.getParentId())) {
                    // æ˜¯ï¼Œæ·»åŠ 
                    rootNodeList.add(treeNode);
                }
@@ -84,17 +91,21 @@
        // nodeList:所有节点集合(所有数据)
        for (Company treeNode : nodeList) {
            // åˆ¤æ–­å½“前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
            if(origin==0){
                if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
            if(origin==DataSyncConfig.origin.hk){
                if (!Objects.isNull(treeNode.getHkParentId())&&treeNode.getHkParentId().equals(pNode.getHkId())) {
                    // å†é€’归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
            }else{
            }else  if(origin==DataSyncConfig.origin.erp){
                if (!Objects.isNull(treeNode.getErpParentId())&&treeNode.getErpParentId().equals(pNode.getErpId())) {
                    // å†é€’归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
            }else  {
                if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
                    // å†é€’归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
            }
        }
        // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
server/dmvisit_service/src/main/resources/application-dev.yml
@@ -1,7 +1,7 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: doumee
    password: rtjgfEr@&0c0m
    driver-class-name: com.mysql.cj.jdbc.Driver
@@ -26,6 +26,10 @@
    password: 111111
debug_model: true
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
# Swagger配置
swagger:
@@ -53,8 +57,6 @@
    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
########################定时开启配置########################
timing: true
des_pwd: 123456SDFKDJF
server/dmvisit_service/src/main/resources/application-devYL.yml
@@ -1,7 +1,7 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit_yl?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: doumee
    password: rtjgfEr@&0c0m
    driver-class-name: com.mysql.cj.jdbc.Driver
@@ -26,6 +26,11 @@
    password: 111111
debug_model: true
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 2 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 2 #访客数据 0自建 2以海康为主 1华晟ERP系统
  need-deal-img: false #是否需要处理图片数据
# Swagger配置
swagger:
server/dmvisit_service/src/main/resources/application-pro.yml
@@ -1,7 +1,7 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: doumee
    password: rtjgfEr@&0c0m
    driver-class-name: com.mysql.cj.jdbc.Driver
@@ -45,7 +45,5 @@
    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
########################定时开启配置########################
timing: true
des_pwd: 123456SDFKDJF
server/dmvisit_service/src/main/resources/application-test.yml
@@ -1,7 +1,7 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8
    url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/dm_visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: doumee
    password: rtjgfEr@&0c0m
    driver-class-name: com.mysql.cj.jdbc.Driver
@@ -33,9 +33,15 @@
  title: ${project.name}接口文档
  description: ${project.name}接口文档
  enabled: true
  context-path: /visit_api
  context-path: /erp_api
  # ç¦ç”¨swagger时的重定向地址
  redirect-uri: /
########################同步数据模式  ########################
data-sync:
  org-user-data-origin: 1 #组织数据 0自建 2以海康为主 1华晟ERP系统
  visitor-data-origin: 1 #访客数据 0自建 2以海康为主 1华晟ERP系统
  need-deal-img: true #是否需要处理图片数据
########################微信支付相关配置########################
wx:
@@ -52,9 +58,6 @@
    remoteHost: https://apis.map.qq.com
    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
########################定时开启配置########################
timing: true
des_pwd: 123456SDFKDJF
server/dmvisit_web/src/main/java/com/doumee/api/ScheduleTool.java
@@ -48,7 +48,7 @@
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Value("${timing}")
    @Value("${debug_model}")
    private Boolean timing;
    /**
server/openapi/src/main/java/com/doumee/api/web/BizResourceController.java
@@ -8,7 +8,7 @@
import com.doumee.core.erp.model.openapi.request.*;
import com.doumee.core.erp.model.openapi.response.*;
import com.doumee.core.utils.Constants;
import com.doumee.service.business.ERPSyncService;
import com.doumee.service.business.ext.ERPSyncService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
server/openapi/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeemes
  profiles:
    active: dev
    active: test
  # JSON返回配置
  jackson: