doum
2025-10-13 145dbc2a4f5bafcb432fb35d7bc91101aa3318d8
Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao
已添加14个文件
已修改54个文件
4829 ■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkCabinet.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkCabinetGrid.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkIccard.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkKeys.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkVersion.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/BorrowingAndReturningRecords.vue 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkCabinetWindow.vue 225 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkIccardWindow.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkKeysWindow.vue 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkVersionWindow.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/alcoholTest.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/cabinetDetails.vue 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkCabinet.vue 203 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkCabinetLog.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkIccard.vue 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkKeys.vue 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkVersion.vue 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/WeatherUtil.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/business/model/Member.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/DingTalkTokenTimerController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/admin_timer/src/main/java/com/doumee/api/WeatherTimerController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java 181 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetConfigDataVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 193 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java 467 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java 438 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -2,7 +2,7 @@
NODE_ENV = 'development'
# VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
VUE_APP_API_URL  = 'http://192.168.1.46:10010'
VUE_APP_API_URL  = 'http://192.168.1.54:10010'
# VUE_APP_API_URL  = 'https://atwl.ahzyssl.com/zhyq_interface'
# VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
admin/package-lock.json
@@ -1886,63 +1886,6 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1950,28 +1893,6 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -14207,6 +14128,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-property-decorator": {
      "version": "8.5.1",
      "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz",
admin/src/api/business/jkCabinet.js
@@ -20,14 +20,34 @@
  return request.post('/visitsAdmin/cloudService/business/jkCabinet/create', data)
}
// åˆ—表
export function list (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinet/list', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinet/updateById', data)
}
// æ ¹æ®ID修改状态
export function updateStatusById (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinet/updateStatusById', data)
}
// æ›´æ–°é…’精检测配置
export function updateCabinetConfig (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinet/updateCabinetConfig', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/jkCabinet/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/jkCabinet/delete/${id}`)
}
// èŽ·å–é…’ç²¾æ£€æµ‹é…ç½®
export function getCabinetConfig () {
  return request.get(`/visitsAdmin/cloudService/business/jkCabinet/getCabinetConfig`)
}
// æ‰¹é‡åˆ é™¤
admin/src/api/business/jkCabinetGrid.js
@@ -25,6 +25,16 @@
  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/updateById', data)
}
// æ ¹æ®ID修改状态
export function updateStatusById (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/updateStatusById', data)
}
// è§£ç»‘钥匙
export function unBindKeys (data) {
  return request.post('/visitsAdmin/cloudService/business/jkCabinetGrid/unBindKeys', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/jkCabinetGrid/delete/${id}`)
admin/src/api/business/jkIccard.js
@@ -25,9 +25,14 @@
  return request.post('/visitsAdmin/cloudService/business/jkIccard/updateById', data)
}
// æ ¹æ®ID修改状态
export function updateStatusById (data) {
  return request.post('/visitsAdmin/cloudService/business/jkIccard/updateStatusById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/jkIccard/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/jkIccard/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
admin/src/api/business/jkKeys.js
@@ -20,6 +20,11 @@
  return request.post('/visitsAdmin/cloudService/business/jkKeys/create', data)
}
// åˆ—表查询
export function list (data) {
  return request.post('/visitsAdmin/cloudService/business/jkKeys/list', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/jkKeys/updateById', data)
@@ -27,7 +32,7 @@
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/jkKeys/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/jkKeys/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
admin/src/api/business/jkVersion.js
@@ -27,7 +27,7 @@
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/jkVersion/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/jkVersion/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
admin/src/components/business/BorrowingAndReturningRecords.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,174 @@
<template>
    <GlobalWindow
        :title="title"
        width="100%"
        :visible.sync="visible"
        :withFooter="false"
    >
        <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
            <el-form-item label="操作人" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="请输入操作人" @keypress.enter.native="getList"></el-input>
            </el-form-item>
            <el-form-item label="时间" prop="date">
                <el-date-picker
                    v-model="date"
                    type="daterange"
                    @change="setDate"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期"
                    format="yyyy å¹´ MM æœˆ dd æ—¥"
                    value-format="yyyy-MM-dd">
                </el-date-picker>
            </el-form-item>
            <el-form-item label="状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择" @change="getList">
                    <el-option label="全部" value=""></el-option>
                    <el-option label="成功" :value="0"></el-option>
                    <el-option label="失败" :value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="getList">搜索</el-button>
            </el-form-item>
            <el-form-item>
                <el-button @click="reset">重置</el-button>
            </el-form-item>
            <el-form-item>
                <el-button @click="exports">导出</el-button>
            </el-form-item>
        </el-form>
        <el-table
            v-loading="loading"
            :data="list"
            stripe
        >
            <el-table-column prop="code" label="钥匙编号" min-width="100px"></el-table-column>
            <el-table-column prop="cabinetName" label="存放位置" min-width="100px"></el-table-column>
            <el-table-column prop="gridName" label="所属钥匙柜" min-width="100px"></el-table-column>
            <el-table-column prop="memberName" label="操作人" min-width="100px"></el-table-column>
            <el-table-column label="时间" min-width="100px">
                <template slot-scope="{row}">
                    {{row.startDate}}~{{row.endDate}}
                </template>
            </el-table-column>
            <el-table-column label="状态" min-width="100px">
                <template slot-scope="{row}">
                    <el-link v-if="row.status === 0">成功</el-link>
                    <el-link type="danger" v-if="row.status === 1">失败</el-link>
                </template>
            </el-table-column>
        </el-table>
        <div style="width: 100%; text-align: right; margin-top: 20px">
            <el-pagination
                @current-change="handleCurrentChange"
                :current-page="page"
                :page-size="10"
                layout="total, prev, pager, next, jumper"
                :total="total">
            </el-pagination>
        </div>
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { fetchList, exportExcel } from '@/api/business/jkCabinetLog'
  export default {
    name: 'BorrowingAndReturningRecords',
    extends: BaseOpera,
    components: { GlobalWindow },
    data () {
      return {
        id: null,
        info: null,
        searchForm: {
          memberName: '',
          status: '',
          roleType: '',
          startDate: '',
          editDate: ''
        },
        date: [],
        list: [],
        page: 1,
        total: 0,
        loading: false
      }
    },
    methods: {
      open (title, id) {
        this.title = title
        this.id = id
        this.getList()
        this.visible = true
      },
      setDate(e) {
        if (e && e.length > 1) {
          this.searchForm.startDate = e[0]
          this.searchForm.editDate = e[1]
        } else {
          this.searchForm.startDate = ''
          this.searchForm.editDate = ''
        }
      },
      handleCurrentChange(e) {
        this.page = e
        this.getList()
      },
      reset() {
        this.searchForm.memberName = ''
        this.searchForm.status = ''
        this.searchForm.roleType = ''
        this.searchForm.startDate = ''
        this.searchForm.editDate = ''
        this.date = []
        this.page = 1
        this.getList()
      },
      getList() {
        this.loading = true
        fetchList({
          capacity: 10,
          page: this.page,
          model: {
            memberName: this.searchForm.memberName,
            status: this.searchForm.status,
            roleType: this.searchForm.roleType,
            startDate: this.searchForm.startDate,
            editDate: this.searchForm.editDate,
          }
        }).then(res => {
          this.list = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
      },
      exports() {
        this.$dialog.exportConfirm('确认导出吗?')
          .then(() => {
            exportExcel({
              page: 1,
              capacity: 1000000,
              model: {
                memberName: this.searchForm.memberName,
                status: this.searchForm.status,
                roleType: this.searchForm.roleType,
                startDate: this.searchForm.startDate,
                editDate: this.searchForm.editDate,
              }
            })
              .then(response => {
                this.download(response)
              })
              .catch(e => {
                this.$tip.apiFailed(e)
              })
          })
          .catch(() => {})
      }
    }
  }
</script>
admin/src/components/business/OperaJkCabinetWindow.vue
@@ -1,29 +1,13 @@
<template>
  <GlobalWindow
    width="50%"
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="form.info" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <h3 style="margin: 0 0 20px 0;">设备信息</h3>
      <el-form-item label="设备编号" prop="code">
        <el-input v-model="form.code" placeholder="请输入设备编号" v-trim/>
      </el-form-item>
@@ -39,53 +23,97 @@
      <el-form-item label="通讯地址" prop="linkAddr">
        <el-input v-model="form.linkAddr" placeholder="请输入通讯地址" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0未绑定 1在位 2借出" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0未绑定 1在位 2借出" v-trim/>
      <el-form-item label="端口号" prop="port">
        <el-input v-model="form.port" placeholder="请输入端口号" v-trim/>
      </el-form-item>
      <el-form-item label="端口" prop="port">
        <el-input v-model="form.port" placeholder="请输入端口" v-trim/>
      <el-form-item label="设备管理员" prop="managerIdList">
        <el-select v-model="form.managerIdList" filterable multiple placeholder="请选择设备管理员">
          <el-option
            v-for="item in memberList"
            :key="item.id"
            :label="item.name+'-'+item.companyName"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="设备管理员编码(关联member)" prop="managerId">
        <el-input v-model="form.managerId" placeholder="请输入设备管理员编码(关联member)" v-trim/>
      <el-form-item label="使用时长" prop="useTime">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input v-model="form.useTime" placeholder="请输入单次拿取钥匙可使用时长" v-trim style="flex: 1;"/>
          <span style="margin-left: 20px;">单位:分钟</span>
        </div>
      </el-form-item>
      <el-form-item label="使用时长(秒)" prop="useTime">
        <el-input v-model="form.useTime" placeholder="请输入使用时长(秒)" v-trim/>
      <el-form-item label="双重验证" prop="doubleAuth">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-switch
            v-model="form.doubleAuth"
            active-color="#13ce66"
            inactive-color="#ff4949"
            :active-value="1"
            :inactive-value="0">
          </el-switch>
          <span style="margin-left: 20px; color: #999999;">开启双重认证后,钥匙领取时先校验验证人身份,再校验司机身份</span>
        </div>
      </el-form-item>
      <el-form-item label="是否双重验证 0否 1是" prop="doubleAuth">
        <el-input v-model="form.doubleAuth" placeholder="请输入是否双重验证 0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="验证人编码(关联member)" prop="authMemberId">
        <el-input v-model="form.authMemberId" placeholder="请输入验证人编码(关联member)" v-trim/>
      </el-form-item>
      <el-form-item label="排数" prop="rowNum">
        <el-input v-model="form.rowNum" placeholder="请输入排数" v-trim/>
      </el-form-item>
      <el-form-item label="列数" prop="columnNum">
        <el-input v-model="form.columnNum" placeholder="请输入列数" v-trim/>
      </el-form-item>
      <el-form-item label="最后通讯时间" prop="haertTime">
        <el-date-picker v-model="form.haertTime" value-format="yyyy-MM-dd" placeholder="请输入最后通讯时间"></el-date-picker>
      <el-form-item label="验证人" prop="authMemberIdList">
        <el-select v-model="form.authMemberIdList" filterable multiple placeholder="请选择验证人">
          <el-option
            v-for="item in memberList"
            :key="item.id"
            :label="item.name+'-'+item.companyName"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所在位置" prop="lacation">
        <el-input v-model="form.lacation" placeholder="请输入所在位置" v-trim/>
      </el-form-item>
      <el-form-item label="经度" prop="longitude">
        <el-input v-model="form.longitude" placeholder="请输入经度" v-trim/>
      <el-form-item label="经纬度" prop="longitude">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input v-model="form.longitude" placeholder="请输入经纬度" v-trim/>
          <a style="margin-left: 20px; flex-shrink: 0;" href="https://lbs.amap.com/tools/picker" target="_blank">经纬度在线拾取地址</a>
        </div>
      </el-form-item>
      <el-form-item label="维度" prop="latitude">
        <el-input v-model="form.latitude" placeholder="请输入维度" v-trim/>
      <el-form-item label="状态" prop="status">
        <el-switch
          v-model="form.status"
          active-color="#13ce66"
          inactive-color="#ff4949"
          :active-value="0"
          :inactive-value="1">
        </el-switch>
      </el-form-item>
      <el-form-item label="编码方式 0自动编码 1手动编码" prop="noType">
        <el-input v-model="form.noType" placeholder="请输入编码方式 0自动编码 1手动编码" v-trim/>
      <h3 style="margin: 20px 0;">柜组信息</h3>
      <el-form-item label="排列" prop="rowNum">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input v-model="form.rowNum" :disabled="form.id" type="number" placeholder="请输入排数" v-trim>
            <template slot="append">排</template>
          </el-input>
          <span style="margin: 0 20px;">x</span>
          <el-input v-model="form.columnNum" :disabled="form.id" type="number" placeholder="请输入列数" v-trim>
            <template slot="append">列</template>
          </el-input>
        </div>
      </el-form-item>
      <el-form-item label="编码前缀" prop="noPrefix">
        <el-input v-model="form.noPrefix" placeholder="请输入编码前缀" v-trim/>
      <el-form-item label="编码" prop="noType">
        <el-radio-group v-model="form.noType" @change="changeNoType">
          <el-radio :label="0">自动编码</el-radio>
          <el-radio :label="1">手动编码</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="编码位数" prop="noLength">
        <el-input v-model="form.noLength" placeholder="请输入编码位数" v-trim/>
      <el-form-item label="前缀" prop="noPrefix" v-if="form.noType === 1">
        <div style="width: 100%; display: flex; align-items: center;">
          <el-input style="flex: 1;" v-model="form.noPrefix" placeholder="请输入数字或字母" v-trim/>
          <span style="margin: 0 20px;">位数</span>
          <el-input style="flex: 1;" v-model="form.noLength" placeholder="请输入数字" v-trim/>
          <span style="margin: 0 20px;">起始编号</span>
          <el-input style="flex: 1;" v-model="form.noIndex" placeholder="请输入数字" v-trim/>
        </div>
      </el-form-item>
      <el-form-item label="起始编码" prop="noIndex">
        <el-input v-model="form.noIndex" placeholder="请输入起始编码" v-trim/>
      <el-form-item label="排列顺序" prop="sortType" v-if="form.noType === 1">
        <el-radio-group v-model="form.sortType" :disabled="form.id">
          <el-radio :label="0">从左往右</el-radio>
          <el-radio :label="1">从上向下</el-radio>
        </el-radio-group>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -94,6 +122,7 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
export default {
  name: 'OperaJkCabinetWindow',
  extends: BaseOpera,
@@ -103,37 +132,65 @@
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        code: '',
        name: '',
        devId: '',
        serialNo: '',
        linkAddr: '',
        status: '',
        status: 0,
        port: '',
        managerId: '',
        managerIdList: '',
        useTime: '',
        doubleAuth: '',
        authMemberId: '',
        doubleAuth: 0,
        authMemberIdList: '',
        rowNum: '',
        columnNum: '',
        haertTime: '',
        lacation: '',
        longitude: '',
        latitude: '',
        noType: '',
        noType: 0,
        noPrefix: '',
        noLength: '',
        noIndex: ''
        noIndex: '',
        sortType: 0
      },
      // éªŒè¯è§„则
      rules: {
      }
        code: [
          { required: true, message: '请输入设备编号', trigger: 'blur' }
        ],
        name: [
          { required: true, message: '请输入设备名称', trigger: 'blur' }
        ],
        devId: [
          { required: true, message: '请输入设备ID', trigger: 'blur' }
        ],
        linkAddr: [
          { required: true, message: '请输入通讯地址', trigger: 'blur' }
        ],
        port: [
          { required: true, message: '请输入端口号', trigger: 'blur' }
        ],
        managerIdList: [
          { required: true, message: '请选择设备管理员', trigger: 'blur' }
        ],
        authMemberIdList: [
          { required: true, message: '请选择验证人', trigger: 'blur' }
        ],
        rowNum: [
          { required: true, message: '请输入排列', trigger: 'blur' }
        ],
        noType: [
          { required: true, message: '请选择编码', trigger: 'blur' }
        ],
        noPrefix: [
          { required: true, message: '请输入前缀', trigger: 'blur' }
        ],
        sortType: [
          { required: true, message: '请输入排列顺序', trigger: 'blur' }
        ]
      },
      memberList: []
    }
  },
  created () {
@@ -141,6 +198,42 @@
      api: '/business/jkCabinet',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.loadMember()
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
      })
    },
    loadMember () {
      allList({
        type: 2
      }).then(res => {
        this.memberList = res
      })
    },
    changeNoType() {
      if (this.form.noType === 0) {
        this.form.noPrefix = ''
        this.form.noLength = ''
        this.form.noIndex = ''
        this.form.sortType = 0
      }
    }
  }
}
</script>
admin/src/components/business/OperaJkIccardWindow.vue
@@ -1,43 +1,37 @@
<template>
  <GlobalWindow
    width="50%"
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      <el-form-item label="IC卡号" prop="code">
        <el-input v-model="form.code" :disabled="form.id" placeholder="请输入IC卡号,可使用读卡器/扫码枪" v-trim/>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      <el-form-item label="身份类型" prop="userType">
        <el-radio-group v-model="form.userType" :disabled="form.id" @change="getUserAll">
          <el-radio :label="0">司机</el-radio>
          <el-radio :label="1">校验人员</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      <el-form-item label="关联用户" prop="memberId">
        <div style="width: 100%; display: flex; flex-direction: column;">
          <el-select v-model="form.memberId" placeholder="请选择">
            <el-option v-for="(item, index) in userAll" :key="index" :label="item.name" :value="item.id"></el-option>
          </el-select>
          <span style="color: #999999; margin-top: 5px;">系统会通过IC关联用户,与钥匙柜上的车辆的司机/验证人员信息进行校验</span>
        </div>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="form.info" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <el-form-item label="人员编码编码(关联member)" prop="memberId">
        <el-input v-model="form.memberId" placeholder="请输入人员编码编码(关联member)" v-trim/>
      </el-form-item>
      <el-form-item label="编码" prop="code">
        <el-input v-model="form.code" placeholder="请输入编码" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0禁用 1启用" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0禁用 1启用" v-trim/>
      </el-form-item>
      <el-form-item label="卡名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入卡名称" v-trim/>
      </el-form-item>
      <el-form-item label="钥匙柜编码(关联jk_cabinet)" prop="cabinetId">
        <el-input v-model="form.cabinetId" placeholder="请输入钥匙柜编码(关联jk_cabinet)" v-trim/>
      <el-form-item label="状态" prop="status">
        <el-switch
          v-model="form.status"
          active-color="#13ce66"
          inactive-color="#ff4949"
          :active-value="1"
          :inactive-value="0">
        </el-switch>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -46,6 +40,7 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
export default {
  name: 'OperaJkIccardWindow',
  extends: BaseOpera,
@@ -55,21 +50,24 @@
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        memberId: '',
        code: '',
        status: '',
        name: '',
        cabinetId: ''
        status: 1,
        userType: 0
      },
      // éªŒè¯è§„则
      rules: {
      }
        code: [
          { required: true, message: '请输入IC卡号', trigger: 'blur' }
        ],
        userType: [
          { required: true, message: '请选择身份', trigger: 'blur' }
        ],
        memberId: [
          { required: true, message: '请选择关联用户', trigger: 'blur' }
        ]
      },
      userAll: []
    }
  },
  created () {
@@ -77,6 +75,36 @@
      api: '/business/jkIccard',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        this.getUserAll()
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.getUserAll()
      })
    },
    getUserAll() {
      allList({
        type: 2,
        queryAuth: this.form.userType === 1 ? 1 : 0
      }).then(res => {
        this.userAll = res
      })
    }
  }
}
</script>
admin/src/components/business/OperaJkKeysWindow.vue
@@ -1,46 +1,33 @@
<template>
  <GlobalWindow
    width="50%"
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="form.info" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <el-form-item label="钥匙编号" prop="code">
        <el-input v-model="form.code" placeholder="请输入钥匙编号" v-trim/>
      </el-form-item>
      <el-form-item label="车牌号" prop="carCode">
        <el-input v-model="form.carCode" placeholder="请输入车牌号" v-trim/>
      </el-form-item>
      <el-form-item label="所属车辆(关联cars)" prop="carId">
        <el-input v-model="form.carId" placeholder="请输入所属车辆(关联cars)" v-trim/>
      <el-form-item label="所属车辆" prop="carId">
        <el-select v-model="form.carId" placeholder="请选择">
          <el-option
            v-for="item in carAll"
            :key="item.id"
            :label="item.code"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="RFID标签" prop="rfidLable">
        <el-input v-model="form.rfidLable" placeholder="请输入RFID标签" v-trim/>
      </el-form-item>
      <el-form-item label="领取规则 0随车 1随派车单" prop="roleType">
        <el-input v-model="form.roleType" placeholder="请输入领取规则 0随车 1随派车单" v-trim/>
      </el-form-item>
      <el-form-item label="状态 0未绑定 1在位 2借出" prop="status">
        <el-input v-model="form.status" placeholder="请输入状态 0未绑定 1在位 2借出" v-trim/>
      <el-form-item label="领取规则" prop="roleType">
        <el-radio-group v-model="form.roleType">
          <el-radio :label="0">随车</el-radio>
          <el-radio :label="1">随派车单</el-radio>
        </el-radio-group>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -49,6 +36,7 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/cars'
export default {
  name: 'OperaJkKeysWindow',
  extends: BaseOpera,
@@ -58,22 +46,27 @@
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        code: '',
        carCode: '',
        carId: '',
        rfidLable: '',
        roleType: '',
        status: ''
        roleType: 0
      },
      // éªŒè¯è§„则
      rules: {
      }
        code: [
          { required: true, message: '请输入钥匙编号', trigger: 'blur' }
        ],
        carId: [
          { required: true, message: '请选择所属车辆', trigger: 'blur' }
        ],
        rfidLable: [
          { required: true, message: '请输入RFID标签', trigger: 'blur' }
        ],
        roleType: [
          { required: true, message: '请选择领取规则', trigger: 'blur' }
        ]
      },
      carAll: []
    }
  },
  created () {
@@ -81,6 +74,15 @@
      api: '/business/jkKeys',
      'field.id': 'id'
    })
    this.getCars()
  },
  methods: {
    getCars() {
      allList({ type: 0 })
        .then(res => {
          this.carAll = res
        })
    }
  }
}
</script>
admin/src/components/business/OperaJkVersionWindow.vue
@@ -1,52 +1,43 @@
<template>
  <GlobalWindow
    :title="title"
    width="50%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="form.creator" placeholder="请输入创建人编码" v-trim/>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="form.editor" placeholder="请输入更新人编码" v-trim/>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间"></el-date-picker>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="form.isdeleted" placeholder="请输入是否删除0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="form.info" placeholder="请输入备注" v-trim/>
      </el-form-item>
      <el-form-item label="版本号" prop="versionInfo">
        <el-input v-model="form.versionInfo" placeholder="请输入版本号" v-trim/>
      </el-form-item>
      <el-form-item label="安装包路径" prop="fileUrl">
        <el-input v-model="form.fileUrl" placeholder="请输入安装包路径" v-trim/>
      </el-form-item>
      <el-form-item label="安装版名称" prop="name">
        <el-input v-model="form.name" placeholder="请输入安装版名称" v-trim/>
      <el-form-item label="安装包" prop="fileUrl">
        <div style="width: 100%; height: 1px;"></div>
        <el-upload
          class="upload-demo"
          accept=".APK,.apk"
          :limit="1"
          :action="uploadImgUrl"
          :data="uploadData"
          :on-success="handleSuccess"
          :on-error="uploadError"
          :on-remove="handleRemove"
          :on-exceed="uploadExceed"
          :file-list="fileList">
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">支持上传APK文件,单次上传<2GB</div>
        </el-upload>
      </el-form-item>
      <el-form-item label="更新描述" prop="content">
        <el-input v-model="form.content" placeholder="请输入更新描述" v-trim/>
        <el-input type="textarea" :rows="5" maxlength="100" show-word-limit v-model="form.content" placeholder="请输入更新描述" v-trim/>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
      <el-form-item label="更新标题" prop="title">
        <el-input v-model="form.title" placeholder="请输入更新标题" v-trim/>
      </el-form-item>
      <el-form-item label="是否强制更新 0否 1是" prop="isForce">
        <el-input v-model="form.isForce" placeholder="请输入是否强制更新 0否 1是" v-trim/>
      </el-form-item>
      <el-form-item label="平台类型 0Android 1IOS" prop="type">
        <el-input v-model="form.type" placeholder="请输入平台类型 0Android 1IOS" v-trim/>
      <el-form-item label="是否强制更新" prop="isForce">
        <el-switch
          v-model="form.isForce"
          active-color="#13ce66"
          inactive-color="#ff4949"
          :active-value="1"
          :inactive-value="0">
        </el-switch>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -61,26 +52,32 @@
  components: { GlobalWindow },
  data () {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/upload',
      // è¡¨å•数据
      form: {
        id: null,
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        versionInfo: '',
        fileUrl: '',
        name: '',
        content: '',
        sortnum: '',
        title: '',
        isForce: '',
        type: ''
        fileSize: '',
        name: '',
        isForce: 1
      },
      // éªŒè¯è§„则
      rules: {
        versionInfo: [
          { required: true, message: '请输入版本号', trigger: 'blur' }
        ],
        fileUrl: [
          { required: true, message: '请上传安装包', trigger: 'blur' }
        ],
        content: [
          { required: true, message: '请输入更新描述', trigger: 'blur' }
        ]
      },
      fileList: [],
      uploadData: {
        folder: 'appFile'
      }
    }
  },
@@ -89,6 +86,70 @@
      api: '/business/jkVersion',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.fileList = []
      this.form.fileSize = ''
      this.form.name = ''
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if (this.form.fileUrl) {
          this.fileList.push({
            name: this.form.name,
            url: target.fullFileUrl
          })
        }
      })
    },
    handleSuccess(res, file) {
      if (res.code == 200) {
        let { data } = res
        this.form.fileUrl = data.imgaddr
        this.form.fileSize = data.fileSize
        this.form.name = data.originname
        this.fileList.push({
          name: data.originname,
          url: data.url
        })
        this.$message.success('上传成功')
      } else {
        this.$message.error('上传失败')
        this.form.fileUrl = ''
        this.fileList = []
        this.form.name = ''
        this.form.fileSize = ''
      }
    },
    uploadError() {
      this.form.fileUrl = ''
      this.fileList = []
      this.form.name = ''
      this.form.fileSize = ''
      this.$message.error('上传失败')
    },
    uploadExceed() {
      this.$message.error('最多只能上传一个文件')
    },
    handleRemove() {
      this.form.fileUrl = ''
      this.fileList = []
      this.form.name = ''
      this.form.fileSize = ''
    }
  }
}
</script>
admin/src/components/business/alcoholTest.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
<template>
    <GlobalWindow
        width="50%"
        :title="title"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
        <el-form :model="form" ref="form" :rules="rules">
            <el-form-item label="吹气时长" prop="blowTime">
                <el-input v-model="form.blowTime" placeholder="请输入吹气时长(秒)" v-trim/>
            </el-form-item>
            <el-form-item label="压力值" prop="pressure">
                <el-input v-model="form.pressure" placeholder="请输入压力值" v-trim/>
            </el-form-item>
            <el-form-item label="酒精浓度阈值" prop="concentration">
                <div style="width: 100%; display: flex; align-items: center;">
                    <el-input v-model="form.concentration" placeholder="请输入酒精浓度预警值" style="flex: 1;" v-trim/>
                    <el-select v-model="form.threshold" placeholder="请选择" style="flex-shrink: 0; margin-left: 15px;">
                        <el-option label="mg/100ml" value="1"></el-option>
                        <el-option label="mg/L" value="2"></el-option>
                        <el-option label="%BAC" value="3"></el-option>
                    </el-select>
                </div>
            </el-form-item>
        </el-form>
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { updateCabinetConfig } from '@/api/business/jkCabinet'
  export default {
    name: 'alcoholTest',
    extends: BaseOpera,
    components: { GlobalWindow },
    data () {
      return {
        // è¡¨å•数据
        form: {
          id: null,
          blowTime: '',
          pressure: '',
          concentration: '',
          threshold: ''
        },
        // éªŒè¯è§„则
        rules: {
          blowTime: [
            { required: true, message: '请输入吹气时长', trigger: 'blur' }
          ],
          pressure: [
            { required: true, message: '请输入压力值', trigger: 'blur' }
          ],
          concentration: [
            { required: true, message: '请选择酒精浓度预警值', trigger: 'blur' }
          ],
        }
      }
    },
    created () {
      this.config({
        api: '/business/jkCabinet',
        'field.id': 'id'
      })
    },
    methods: {
      open (title, target) {
        this.title = title
        this.form.threshold = ''
        this.visible = true
        // æ–°å»º
        if (target == null) {
          this.$nextTick(() => {
            this.$refs.form.resetFields()
            this.form[this.configData['field.id']] = null
          })
          return
        }
        // ç¼–辑
        this.$nextTick(() => {
          for (const key in this.form) {
            this.form[key] = target[key]
          }
        })
      },
      // ç¡®è®¤æ–°å»º
      __confirmCreate () {
        this.$refs.form.validate((valid) => {
          if (!valid) {
            return
          }
          // è°ƒç”¨æ–°å»ºæŽ¥å£
          this.isWorking = true
          updateCabinetConfig(this.form)
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('操作成功')
              this.$emit('success')
            })
            .catch(e => {
              // this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.isWorking = false
            })
        })
      },
    }
  }
</script>
admin/src/components/business/cabinetDetails.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,199 @@
<template>
    <GlobalWindow
        :title="title"
        width="100%"
        :visible.sync="visible"
        :withFooter="false"
    >
        <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
            <el-form-item label="钥匙" prop="keyCode">
                <el-input v-model="searchForm.keyCode" placeholder="请输入钥匙编码或名称" @keypress.enter.native="getList"></el-input>
            </el-form-item>
            <el-form-item label="状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择" @change="getList">
                    <el-option label="全部" value=""></el-option>
                    <el-option label="启用" :value="0"></el-option>
                    <el-option label="禁用" :value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="柜格状态" prop="bindStatus">
                <el-select v-model="searchForm.bindStatus" placeholder="请选择" @change="getList">
                    <el-option label="全部" value=""></el-option>
                    <el-option label="未绑定" :value="0"></el-option>
                    <el-option label="已绑定" :value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="getList">搜索</el-button>
            </el-form-item>
            <el-form-item>
                <el-button @click="reset">重置</el-button>
            </el-form-item>
        </el-form>
        <ul class="toolbar">
            <li><el-button type="primary" @click="bathUnBindKeys">批量解绑</el-button></li>
        </ul>
        <el-table
            v-loading="loading"
            :data="list"
            stripe
        >
            <el-table-column prop="code" label="柜格编码" min-width="100px"></el-table-column>
            <el-table-column prop="cabinetName" label="所属钥匙柜" min-width="100px"></el-table-column>
            <el-table-column prop="keyId" label="绑定钥匙" min-width="100px">
                <template slot-scope="{row}">
                    <el-select v-model="row.keyId" placeholder="请选择" @change="blurFunc($event, row, 1)">
                        <el-option
                            v-for="item in keysAll"
                            :key="item.id"
                            :label="item.code"
                            :value="item.id"
                            :disabled="item.isBinding === 1">
                        </el-option>
                    </el-select>
                </template>
            </el-table-column>
            <el-table-column label="板号" min-width="100px">
                <template slot-scope="{row}">
                    <el-input v-model="row.boardCode" @blur="blurFunc($event, row, 2)" placeholder="请输入板号"></el-input>
                </template>
            </el-table-column>
            <el-table-column label="通道号" min-width="100px">
                <template slot-scope="{row}">
                    <el-input v-model="row.channelCode" @blur="blurFunc($event, row, 3)" placeholder="请输入通道号"></el-input>
                </template>
            </el-table-column>
            <el-table-column label="状态" min-width="100px">
                <template slot-scope="{row}">
                    <el-switch
                        @change="changeStatus($event, row.id)"
                        v-model="row.status"
                        active-color="#13ce66"
                        inactive-color="#ff4949"
                        :active-value="0"
                        :inactive-value="1">
                    </el-switch>
                </template>
            </el-table-column>
            <el-table-column label="运行状态" min-width="100px">
                <template slot-scope="{row}">
                    <el-link type="success" v-if="row.workingStatus === 0">正常</el-link>
                    <el-link type="warning" v-if="row.workingStatus === 1">故障</el-link>
                </template>
            </el-table-column>
            <el-table-column label="柜格状态" min-width="100px">
                <template slot-scope="{row}">
                    <el-link type="warning" v-if="row.bindStatus === 0">未绑定</el-link>
                    <el-link type="success" v-if="row.bindStatus === 1">已绑定</el-link>
                </template>
            </el-table-column>
        </el-table>
    </GlobalWindow>
</template>
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { fetchList, updateStatusById, unBindKeys, updateById } from '@/api/business/jkCabinetGrid'
  import { list } from '@/api/business/jkKeys'
  export default {
    name: 'cabinetDetails',
    extends: BaseOpera,
    components: { GlobalWindow },
    data () {
      return {
        id: null,
        info: null,
        searchForm: {
          keyCode: '',
          status: '',
          bindStatus: ''
        },
        list: [],
        keysAll: [],
        loading: false
      }
    },
    methods: {
      open (title, id) {
        this.title = title
        this.id = id
        this.getList()
        this.getKeysAll()
        this.visible = true
      },
      getKeysAll() {
        list({  })
            .then(res => {
              this.keysAll = res
            })
      },
      blurFunc(e, row, type) {
        let obj = {
          id: row.id
        }
        if (type === 1) {
          obj.keyId = row.keyId
        } else if (type === 2) {
          obj.boardCode = row.boardCode
        } else if (type === 3) {
          obj.channelCode = row.channelCode
        }
        updateById(obj)
            .then(res => {
              this.getList()
              if (type === 1) {
                this.getKeysAll()
              }
            })
      },
      bathUnBindKeys() {
        this.$confirm('确认批量解绑吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          unBindKeys(this.list.map(item => item.id))
            .then(res => {
              this.getList()
            })
        }).catch(() => {
        });
      },
      changeStatus(status, id) {
        updateStatusById({ id, status })
          .then(res => {
            this.getList()
          })
      },
      handleCurrentChange(e) {
        this.page = e
        this.getList()
      },
      reset() {
        this.searchForm.keyId = ''
        this.searchForm.status = ''
        this.searchForm.workingStatus = ''
        this.getList()
      },
      getList() {
        this.loading = true
        fetchList({
          capacity: 99999,
          page: 1,
          model: {
            cabinetId: this.id,
            keyId: this.searchForm.keyId,
            status: this.searchForm.status,
            workingStatus: this.searchForm.workingStatus
          }
        }).then(res => {
          this.list = res.records
        }).finally(() => {
          this.loading = false
        })
      }
    }
  }
</script>
admin/src/views/business/jkCabinet.vue
@@ -2,146 +2,82 @@
  <TableLayout :permissions="['business:jkcabinet:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <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="name">
        <el-input v-model="searchForm.name" placeholder="请输入设备名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="设备ID" prop="devId">
        <el-input v-model="searchForm.devId" placeholder="请输入设备ID" @keypress.enter.native="search"></el-input>
      <el-form-item label="运行状态" prop="rumStatus">
        <el-select v-model="searchForm.rumStatus" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="在线" :value="0"></el-option>
          <el-option label="离线" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="序列号" prop="serialNo">
        <el-input v-model="searchForm.serialNo" placeholder="请输入序列号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="通讯地址" prop="linkAddr">
        <el-input v-model="searchForm.linkAddr" placeholder="请输入通讯地址" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0未绑定 1在位 2借出" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0未绑定 1在位 2借出" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="端口" prop="port">
        <el-input v-model="searchForm.port" placeholder="请输入端口" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="设备管理员编码(关联member)" prop="managerId">
        <el-input v-model="searchForm.managerId" placeholder="请输入设备管理员编码(关联member)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="使用时长(秒)" prop="useTime">
        <el-input v-model="searchForm.useTime" placeholder="请输入使用时长(秒)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="是否双重验证 0否 1是" prop="doubleAuth">
        <el-input v-model="searchForm.doubleAuth" placeholder="请输入是否双重验证 0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="验证人编码(关联member)" prop="authMemberId">
        <el-input v-model="searchForm.authMemberId" placeholder="请输入验证人编码(关联member)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="排数" prop="rowNum">
        <el-input v-model="searchForm.rowNum" placeholder="请输入排数" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="列数" prop="columnNum">
        <el-input v-model="searchForm.columnNum" placeholder="请输入列数" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="最后通讯时间" prop="haertTime">
        <el-date-picker v-model="searchForm.haertTime" value-format="yyyy-MM-dd" placeholder="请输入最后通讯时间" @change="search"/>
      </el-form-item>
      <el-form-item label="所在位置" prop="lacation">
        <el-input v-model="searchForm.lacation" placeholder="请输入所在位置" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="经度" prop="longitude">
        <el-input v-model="searchForm.longitude" placeholder="请输入经度" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="维度" prop="latitude">
        <el-input v-model="searchForm.latitude" placeholder="请输入维度" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="编码方式 0自动编码 1手动编码" prop="noType">
        <el-input v-model="searchForm.noType" placeholder="请输入编码方式 0自动编码 1手动编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="编码前缀" prop="noPrefix">
        <el-input v-model="searchForm.noPrefix" placeholder="请输入编码前缀" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="编码位数" prop="noLength">
        <el-input v-model="searchForm.noLength" placeholder="请输入编码位数" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="起始编码" prop="noIndex">
        <el-input v-model="searchForm.noIndex" placeholder="请输入起始编码" @keypress.enter.native="search"></el-input>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="启用" :value="1"></el-option>
          <el-option label="禁用" :value="0"></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:jkcabinet: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:jkcabinet:create', 'business:jkcabinet:delete']">
        <li><el-button type="primary" @click="$refs.operaJkCabinetWindow.open('新建钥匙柜基本信息表')" icon="el-icon-plus" v-permissions="['business:jkcabinet:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcabinet:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaJkCabinetWindow.open('新建设备')" icon="el-icon-plus" v-permissions="['business:jkcabinet:create']">新建</el-button></li>
        <li><el-button type="warning" @click="$refs.alcoholTest.open('新建酒精检测配置', form)">酒精检测配置</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="设备编号" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="设备名称" min-width="100px"></el-table-column>
        <el-table-column prop="devId" label="设备ID" min-width="100px"></el-table-column>
        <el-table-column prop="serialNo" label="序列号" min-width="100px"></el-table-column>
        <el-table-column prop="linkAddr" label="通讯地址" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0未绑定 1在位 2借出" min-width="100px"></el-table-column>
        <el-table-column prop="port" label="端口" min-width="100px"></el-table-column>
        <el-table-column prop="managerId" label="设备管理员编码(关联member)" min-width="100px"></el-table-column>
        <el-table-column prop="useTime" label="使用时长(秒)" min-width="100px"></el-table-column>
        <el-table-column prop="doubleAuth" label="是否双重验证 0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="authMemberId" label="验证人编码(关联member)" min-width="100px"></el-table-column>
        <el-table-column prop="rowNum" label="排数" min-width="100px"></el-table-column>
        <el-table-column prop="columnNum" label="列数" min-width="100px"></el-table-column>
        <el-table-column prop="haertTime" label="最后通讯时间" min-width="100px"></el-table-column>
        <el-table-column prop="port" label="端口号" min-width="100px"></el-table-column>
        <el-table-column prop="lacation" label="所在位置" min-width="100px"></el-table-column>
        <el-table-column prop="longitude" label="经度" min-width="100px"></el-table-column>
        <el-table-column prop="latitude" label="维度" min-width="100px"></el-table-column>
        <el-table-column prop="noType" label="编码方式 0自动编码 1手动编码" min-width="100px"></el-table-column>
        <el-table-column prop="noPrefix" label="编码前缀" min-width="100px"></el-table-column>
        <el-table-column prop="noLength" label="编码位数" min-width="100px"></el-table-column>
        <el-table-column prop="noIndex" label="起始编码" min-width="100px"></el-table-column>
        <el-table-column label="柜格数量" min-width="100px">
          <template slot-scope="{row}">
            <el-button @click="$refs.cabinetDetails.open(row.name + '-柜格信息', row.id)">{{row.gridNum}}</el-button>
          </template>
        </el-table-column>
        <el-table-column label="运行状态" min-width="100px">
          <template slot-scope="{row}">
            <el-link type="success" :underline="false" v-if="row.runStatus === 0">在线</el-link>
            <el-link type="danger" :underline="false" v-if="row.runStatus === 1">离线</el-link>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
              v-model="row.status"
              @change="changeStatus($event, row.id)"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="0"
              :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jkcabinet:update', 'business:jkcabinet:delete'])"
          label="操作"
          min-width="120"
          min-width="200"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkCabinetWindow.open('编辑钥匙柜基本信息表', row)" icon="el-icon-edit" v-permissions="['business:jkcabinet:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcabinet:delete']">删除</el-button>
            <el-button type="text" @click="$refs.cabinetDetails.open(row.name + '-柜格信息', row.id)">绑定钥匙</el-button>
            <el-button type="text" @click="$refs.operaJkCabinetWindow.open('编辑钥匙柜基本信息表', row)" v-permissions="['business:jkcabinet:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" v-permissions="['business:jkcabinet:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -154,6 +90,10 @@
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaJkCabinetWindow ref="operaJkCabinetWindow" @success="handlePageChange"/>
    <!-- æŸœå­è¯¦æƒ… -->
    <CabinetDetails ref="cabinetDetails" />
    <!-- æ–°å¢žé…’精检测 -->
    <AlcoholTest ref="alcoholTest" @success="GetCabinetConfig" />
  </TableLayout>
</template>
@@ -162,43 +102,23 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaJkCabinetWindow from '@/components/business/OperaJkCabinetWindow'
import CabinetDetails from '@/components/business/cabinetDetails'
import AlcoholTest from '@/components/business/alcoholTest'
import { updateStatusById, getCabinetConfig } from '@/api/business/jkCabinet'
export default {
  name: 'JkCabinet',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaJkCabinetWindow },
  components: { TableLayout, Pagination, OperaJkCabinetWindow, CabinetDetails, AlcoholTest},
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        code: '',
        name: '',
        devId: '',
        serialNo: '',
        linkAddr: '',
        status: '',
        port: '',
        managerId: '',
        useTime: '',
        doubleAuth: '',
        authMemberId: '',
        rowNum: '',
        columnNum: '',
        haertTime: '',
        lacation: '',
        longitude: '',
        latitude: '',
        noType: '',
        noPrefix: '',
        noLength: '',
        noIndex: ''
      }
        rumStatus: ''
      },
      form: null
    }
  },
  created () {
@@ -209,6 +129,21 @@
      'field.main': 'id'
    })
    this.search()
    this.GetCabinetConfig()
  },
  methods: {
    changeStatus(status, id) {
      updateStatusById({ id, status })
        .then(res => {
          this.search()
        })
    },
    GetCabinetConfig() {
      getCabinetConfig()
        .then(res => {
          this.form = res
        })
    }
  }
}
</script>
admin/src/views/business/jkCabinetLog.vue
@@ -2,53 +2,44 @@
  <TableLayout :permissions="['business:jkcabinetlog:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      <el-form-item label="开门时间" prop="date">
        <el-date-picker
          v-model="date"
          @change="setDate"
          type="daterange"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          format="yyyy å¹´ MM æœˆ dd æ—¥"
          value-format="yyyy-MM-dd">
        </el-date-picker>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      <el-form-item label="操作人" prop="memberName">
        <el-input v-model="searchForm.memberName" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      <el-form-item label="钥匙柜" prop="cabinetId">
        <el-select v-model="searchForm.cabinetId" placeholder="请选择" @change="search">
          <el-option
            v-for="item in keysAll"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      <el-form-item label="验证方式" prop="authType">
        <el-select v-model="searchForm.authType" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="刷脸" :value="0"></el-option>
          <el-option label="刷卡" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="钥匙柜编码(关联jk_cabinet)" prop="cabinetId">
        <el-input v-model="searchForm.cabinetId" placeholder="请输入钥匙柜编码(关联jk_cabinet)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="钥匙柜格编码(关联jk_cabinet_grid)" prop="gridId">
        <el-input v-model="searchForm.gridId" placeholder="请输入钥匙柜格编码(关联jk_cabinet_grid)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="验证方式 0刷脸 1刷卡" prop="authType">
        <el-input v-model="searchForm.authType" placeholder="请输入验证方式 0刷脸 1刷卡" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="车辆编码(关联cars)" prop="carId">
        <el-input v-model="searchForm.carId" placeholder="请输入车辆编码(关联cars)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="钥匙编码(关联jk_keys)" prop="keyId">
        <el-input v-model="searchForm.keyId" placeholder="请输入钥匙编码(关联jk_keys)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="人员编码(关联member)" prop="memberId">
        <el-input v-model="searchForm.memberId" placeholder="请输入人员编码(关联member)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="钥匙信息(车牌号-钥匙编码)" prop="keyInfo">
        <el-input v-model="searchForm.keyInfo" placeholder="请输入钥匙信息(车牌号-钥匙编码)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="领取规则 0随车 1随派车单" prop="roleType">
        <el-input v-model="searchForm.roleType" placeholder="请输入领取规则 0随车 1随派车单" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0成功 1失败" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0成功 1失败" @keypress.enter.native="search"></el-input>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="成功" :value="0"></el-option>
          <el-option label="失败" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
@@ -58,42 +49,27 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:jkcabinetlog:create', 'business:jkcabinetlog:delete']">
        <li><el-button type="primary" @click="$refs.operaJkCabinetLogWindow.open('新建钥匙柜开关门记录')" icon="el-icon-plus" v-permissions="['business:jkcabinetlog:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcabinetlog:delete']">删除</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="cabinetId" label="钥匙柜编码(关联jk_cabinet)" min-width="100px"></el-table-column>
        <el-table-column prop="gridId" label="钥匙柜格编码(关联jk_cabinet_grid)" min-width="100px"></el-table-column>
        <el-table-column prop="authType" label="验证方式 0刷脸 1刷卡" min-width="100px"></el-table-column>
        <el-table-column prop="carId" label="车辆编码(关联cars)" min-width="100px"></el-table-column>
        <el-table-column prop="keyId" label="钥匙编码(关联jk_keys)" min-width="100px"></el-table-column>
        <el-table-column prop="memberId" label="人员编码(关联member)" min-width="100px"></el-table-column>
        <el-table-column prop="keyInfo" label="钥匙信息(车牌号-钥匙编码)" min-width="100px"></el-table-column>
        <el-table-column prop="roleType" label="领取规则 0随车 1随派车单" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0成功 1失败" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jkcabinetlog:update', 'business:jkcabinetlog:delete'])"
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column prop="createDate" label="开门时间" min-width="100px"></el-table-column>
        <el-table-column prop="memberName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column label="校验方式" min-width="100px">
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkCabinetLogWindow.open('编辑钥匙柜开关门记录', row)" icon="el-icon-edit" v-permissions="['business:jkcabinetlog:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcabinetlog:delete']">删除</el-button>
            <el-link :underline="false" v-if="row.authType === 0">刷脸</el-link>
            <el-link :underline="false" v-if="row.authType === 1">刷卡</el-link>
          </template>
        </el-table-column>
        <el-table-column prop="cabinetName" label="所属钥匙柜" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="柜格编号" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="钥匙" min-width="100px"></el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-link :underline="false" v-if="row.status === 0">成功</el-link>
            <el-link type="danger" :underline="false" v-if="row.status === 1">失败</el-link>
          </template>
        </el-table-column>
      </el-table>
@@ -114,6 +90,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaJkCabinetLogWindow from '@/components/business/OperaJkCabinetLogWindow'
import { list } from '@/api/business/jkCabinet'
export default {
  name: 'JkCabinetLog',
  extends: BaseTable,
@@ -122,23 +99,15 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        endDate: '',
        startDate: '',
        cabinetId: '',
        gridId: '',
        authType: '',
        carId: '',
        keyId: '',
        memberId: '',
        keyInfo: '',
        roleType: '',
        memberName: '',
        status: ''
      }
      },
      date: [],
      keysAll: []
    }
  },
  created () {
@@ -149,6 +118,34 @@
      'field.main': 'id'
    })
    this.search()
    this.getkeysAll()
  },
  methods: {
    setDate(e) {
      if (e && e.length > 1) {
        this.searchForm.startDate = e[0]
        this.searchForm.endDate = e[1]
      } else {
        this.searchForm.startDate = ''
        this.searchForm.endDate = ''
      }
      this.search()
    },
    // æœç´¢æ¡†é‡ç½®
    reset () {
      this.$refs.searchForm.resetFields()
      this.date = []
      this.searchForm.startDate = ''
      this.searchForm.endDate = ''
      this.search()
    },
    getkeysAll() {
      list({})
        .then(res => {
          console.log(res)
          this.keysAll = res
        })
    }
  }
}
</script>
admin/src/views/business/jkIccard.vue
@@ -2,73 +2,63 @@
  <TableLayout :permissions="['business:jkiccard:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      <el-form-item label="卡号" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入卡号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      <el-form-item label="姓名" prop="memberName">
        <el-input v-model="searchForm.memberName" placeholder="请输入" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      <el-form-item label="身份类型" prop="userType">
        <el-select v-model="searchForm.userType" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="司机" :value="0"></el-option>
          <el-option label="校验人员" :value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="人员编码编码(关联member)" prop="memberId">
        <el-input v-model="searchForm.memberId" placeholder="请输入人员编码编码(关联member)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <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="状态 0禁用 1启用" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0禁用 1启用" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="卡名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入卡名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="钥匙柜编码(关联jk_cabinet)" prop="cabinetId">
        <el-input v-model="searchForm.cabinetId" placeholder="请输入钥匙柜编码(关联jk_cabinet)" @keypress.enter.native="search"></el-input>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="禁用" :value="0"></el-option>
          <el-option label="启用" :value="1"></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:jkiccard: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:jkiccard:create', 'business:jkiccard:delete']">
        <li><el-button type="primary" @click="$refs.operaJkIccardWindow.open('新建钥匙柜IC卡信息表')" icon="el-icon-plus" v-permissions="['business:jkiccard:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkiccard:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaJkIccardWindow.open('新建IC卡')" icon="el-icon-plus" v-permissions="['business:jkiccard:create']">新建</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="IC卡号" min-width="100px"></el-table-column>
        <el-table-column label="身份类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.userType === 0">司机</span>
            <span v-if="row.userType === 1">校验人员</span>
          </template>
        </el-table-column>
        <el-table-column prop="memberName" label="关联人员" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="memberId" label="人员编码编码(关联member)" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="编码" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0禁用 1启用" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="卡名称" min-width="100px"></el-table-column>
        <el-table-column prop="cabinetId" label="钥匙柜编码(关联jk_cabinet)" min-width="100px"></el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <el-switch
              v-model="row.status"
              @change="changeStatus($event, row.id)"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="1"
              :inactive-value="0">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jkiccard:update', 'business:jkiccard:delete'])"
          label="操作"
@@ -76,7 +66,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkIccardWindow.open('编辑钥匙柜IC卡信息表', row)" icon="el-icon-edit" v-permissions="['business:jkiccard:update']">编辑</el-button>
            <el-button type="text" @click="$refs.operaJkIccardWindow.open('编辑新建IC卡', row)" icon="el-icon-edit" v-permissions="['business:jkiccard:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkiccard:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -98,6 +88,7 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaJkIccardWindow from '@/components/business/OperaJkIccardWindow'
import { updateStatusById } from '@/api/business/jkIccard'
export default {
  name: 'JkIccard',
  extends: BaseTable,
@@ -106,18 +97,10 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        memberId: '',
        code: '',
        status: '',
        name: '',
        cabinetId: ''
        memberName: '',
        userType: '',
        status: ''
      }
    }
  },
@@ -129,6 +112,14 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeStatus(status, id) {
      updateStatusById({ id, status })
        .then(res => {
          this.search()
        })
    }
  }
}
</script>
admin/src/views/business/jkKeys.vue
@@ -2,86 +2,76 @@
  <TableLayout :permissions="['business:jkkeys:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <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="carCode">
        <el-input v-model="searchForm.carCode" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
      <el-form-item label="所属车辆" prop="carId">
        <el-select v-model="searchForm.carId" placeholder="请选择" @change="search">
          <el-option
            v-for="item in carAll"
            :key="item.id"
            :label="item.code"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="所属车辆(关联cars)" prop="carId">
        <el-input v-model="searchForm.carId" placeholder="请输入所属车辆(关联cars)" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="RFID标签" prop="rfidLable">
        <el-input v-model="searchForm.rfidLable" placeholder="请输入RFID标签" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="领取规则 0随车 1随派车单" prop="roleType">
        <el-input v-model="searchForm.roleType" placeholder="请输入领取规则 0随车 1随派车单" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0未绑定 1在位 2借出" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0未绑定 1在位 2借出" @keypress.enter.native="search"></el-input>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="维修保养" :value="3"></el-option>
          <el-option label="借出" :value="2"></el-option>
          <el-option label="在位" :value="1"></el-option>
          <el-option label="未绑定" :value="0"></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:jkkeys: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:jkkeys:create', 'business:jkkeys:delete']">
        <li><el-button type="primary" @click="$refs.operaJkKeysWindow.open('新建钥匙基本信息表')" icon="el-icon-plus" v-permissions="['business:jkkeys:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkkeys:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaJkKeysWindow.open('新建钥匙信息')" icon="el-icon-plus" v-permissions="['business:jkkeys:create']">新建</el-button></li>
<!--        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkkeys:delete']">删除</el-button></li>-->
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="code" label="钥匙编号" min-width="100px"></el-table-column>
        <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column prop="carId" label="所属车辆(关联cars)" min-width="100px"></el-table-column>
        <el-table-column prop="carCode" label="所属车辆" min-width="100px"></el-table-column>
        <el-table-column prop="rfidLable" label="RFID标签" min-width="100px"></el-table-column>
        <el-table-column prop="roleType" label="领取规则 0随车 1随派车单" min-width="100px"></el-table-column>
        <el-table-column prop="status" label="状态 0未绑定 1在位 2借出" min-width="100px"></el-table-column>
        <el-table-column prop="cabinetName" label="绑定钥匙柜" min-width="100px"></el-table-column>
        <el-table-column prop="gridCode" label="存放位置" min-width="100px"></el-table-column>
        <el-table-column label="绑定状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.isBinding === 0">未绑定</span>
            <span v-if="row.isBinding === 1">已绑定</span>
          </template>
        </el-table-column>
        <el-table-column label="钥匙状态" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.status === 0">未绑定</span>
            <span v-if="row.status === 1">在位</span>
            <span v-if="row.status === 2">借出</span>
            <span v-if="row.status === 3">维修保养</span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jkkeys:update', 'business:jkkeys:delete'])"
          label="操作"
          min-width="120"
          min-width="150"
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkKeysWindow.open('编辑钥匙基本信息表', row)" icon="el-icon-edit" v-permissions="['business:jkkeys:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkkeys:delete']">删除</el-button>
            <el-button type="text" @click="$refs.borrowingAndReturningRecords.open('借还记录', row)">领取记录</el-button>
            <el-button type="text" @click="$refs.operaJkKeysWindow.open('编辑钥匙信息', row)" v-permissions="['business:jkkeys:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" v-permissions="['business:jkkeys:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -94,6 +84,8 @@
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaJkKeysWindow ref="operaJkKeysWindow" @success="handlePageChange"/>
    <!-- å€Ÿè¿˜è®°å½• -->
    <BorrowingAndReturningRecords ref="borrowingAndReturningRecords"/>
  </TableLayout>
</template>
@@ -102,28 +94,21 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaJkKeysWindow from '@/components/business/OperaJkKeysWindow'
import BorrowingAndReturningRecords from '@/components/business/BorrowingAndReturningRecords'
import { allList } from '@/api/business/cars'
export default {
  name: 'JkKeys',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaJkKeysWindow },
  components: { TableLayout, Pagination, OperaJkKeysWindow, BorrowingAndReturningRecords },
  data () {
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        code: '',
        carCode: '',
        carId: '',
        rfidLable: '',
        roleType: '',
        status: ''
      }
      },
      carAll: []
    }
  },
  created () {
@@ -134,6 +119,15 @@
      'field.main': 'id'
    })
    this.search()
    this.getCars()
  },
  methods: {
    getCars() {
      allList({ type: 0 })
        .then(res => {
          this.carAll = res
        })
    }
  }
}
</script>
admin/src/views/business/jkVersion.vue
@@ -2,85 +2,50 @@
  <TableLayout :permissions="['business:jkversion:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="主键" prop="id">
        <el-input v-model="searchForm.id" placeholder="请输入主键" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建人编码" prop="creator">
        <el-input v-model="searchForm.creator" placeholder="请输入创建人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="创建时间" prop="createDate">
        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="请输入创建时间" @change="search"/>
      </el-form-item>
      <el-form-item label="更新人编码" prop="editor">
        <el-input v-model="searchForm.editor" placeholder="请输入更新人编码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新时间" prop="editDate">
        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="请输入更新时间" @change="search"/>
      </el-form-item>
      <el-form-item label="是否删除0否 1是" prop="isdeleted">
        <el-input v-model="searchForm.isdeleted" placeholder="请输入是否删除0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="备注" prop="info">
        <el-input v-model="searchForm.info" placeholder="请输入备注" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="版本号" prop="versionInfo">
        <el-input v-model="searchForm.versionInfo" placeholder="请输入版本号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="安装包路径" prop="fileUrl">
        <el-input v-model="searchForm.fileUrl" placeholder="请输入安装包路径" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="安装版名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入安装版名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新描述" prop="content">
        <el-input v-model="searchForm.content" placeholder="请输入更新描述" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="searchForm.sortnum" placeholder="请输入排序码" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="更新标题" prop="title">
        <el-input v-model="searchForm.title" placeholder="请输入更新标题" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="是否强制更新 0否 1是" prop="isForce">
        <el-input v-model="searchForm.isForce" placeholder="请输入是否强制更新 0否 1是" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="平台类型 0Android 1IOS" prop="type">
        <el-input v-model="searchForm.type" placeholder="请输入平台类型 0Android 1IOS" @keypress.enter.native="search"></el-input>
      <el-form-item label="是否强制更新" prop="isForce">
        <el-select v-model="searchForm.isForce" placeholder="请选择" @change="search">
          <el-option label="全部" value=""></el-option>
          <el-option label="否" :value="0"></el-option>
          <el-option label="是" :value="1"></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:jkversion: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:jkversion:create', 'business:jkversion:delete']">
        <li><el-button type="primary" @click="$refs.operaJkVersionWindow.open('新建交控-钥匙柜终端版本信息表')" icon="el-icon-plus" v-permissions="['business:jkversion:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkversion:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaJkVersionWindow.open('新建版本')" icon="el-icon-plus" v-permissions="['business:jkversion:create']">新建</el-button></li>
      </ul>
      <el-table
        :height="tableHeightNew"
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="creator" label="创建人编码" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="editor" label="更新人编码" min-width="100px"></el-table-column>
        <el-table-column prop="editDate" label="更新时间" min-width="100px"></el-table-column>
        <el-table-column prop="isdeleted" label="是否删除0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="info" label="备注" min-width="100px"></el-table-column>
        <el-table-column prop="versionInfo" label="版本号" min-width="100px"></el-table-column>
        <el-table-column prop="fileUrl" label="安装包路径" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="安装版名称" min-width="100px"></el-table-column>
        <el-table-column label="平台类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type === 0">Android</span>
            <span v-if="row.type === 1">IOS</span>
          </template>
        </el-table-column>
        <el-table-column prop="content" label="更新描述" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="title" label="更新标题" min-width="100px"></el-table-column>
        <el-table-column prop="isForce" label="是否强制更新 0否 1是" min-width="100px"></el-table-column>
        <el-table-column prop="type" label="平台类型 0Android 1IOS" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="安装包" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="文件大小" min-width="100px"></el-table-column>
        <el-table-column label="是否强制更新" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.isForce === 0">否</span>
            <span v-if="row.isForce === 1">是</span>
          </template>
        </el-table-column>
        <el-table-column prop="createUserName" label="创建者" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:jkversion:update', 'business:jkversion:delete'])"
          label="操作"
@@ -88,7 +53,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaJkVersionWindow.open('编辑交控-钥匙柜终端版本信息表', row)" icon="el-icon-edit" v-permissions="['business:jkversion:update']">编辑</el-button>
            <el-button type="text" @click="$refs.operaJkVersionWindow.open('编辑版本', row)" icon="el-icon-edit" v-permissions="['business:jkversion:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkversion:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -118,21 +83,8 @@
    return {
      // æœç´¢
      searchForm: {
        id: '',
        creator: '',
        createDate: '',
        editor: '',
        editDate: '',
        isdeleted: '',
        info: '',
        versionInfo: '',
        fileUrl: '',
        name: '',
        content: '',
        sortnum: '',
        title: '',
        isForce: '',
        type: ''
        isForce: ''
      }
    }
  },
admin/src/views/login.vue
@@ -278,7 +278,7 @@
        align-items: center;
        justify-content: center;
        border-radius: 4px;
        width: 186px;
        width: 208px;
        display: flex;
        margin-bottom: 12px;
      }
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -55,6 +55,15 @@
    public static final String SIGN_IN_QRCODE_PREFIX ="SIGN_IN_QRCODE_PREFIX" ;
    public static final String WEATHER_CONFIG ="WEATHER_CONFIG" ;
    public static final String REQUEST_URL ="REQUEST_URL" ;
    public static final String LOCATION ="LOCATION" ;
    public static final String API_KEY ="API_KEY" ;
    public static final String CABINET_CONFIG ="CABINET_CONFIG" ;
    public static final String BLOW_TIME ="BLOW_TIME" ;
    public static final String PRESSURE ="PRESSURE" ;
    public static final String CONCENTRATION ="CONCENTRATION" ;
    public static final String THRESHOLD ="THRESHOLD" ;
    //被拜访人信息校验方式(0手机号单独校验 1手机号和姓名组合校验)
    public static final String BEVISITED_USER_VALID = "BEVISITED_USER_VALID";
    public static final String LW_BEVISITED_USER_VALID = "LW_BEVISITED_USER_VALID";
@@ -108,6 +117,7 @@
    public static final String FTP_USERNAME ="FTP_USERNAME" ;
    public static final String FTP_PWD ="FTP_PWD" ;
    public static final String COMPANY_DOCUMENTS ="COMPANY_DOCUMENTS" ;
    public static final String APP_FILE ="APP_FILE" ;
    public static final String FTP_RESOURCE_PATH ="FTP_RESOURCE_PATH" ;
    public static final String FTP_LOCAL_RESOURCE_PATH ="FTP_LOCAL_RESOURCE_PATH" ;
server/system_service/src/main/java/com/doumee/core/utils/WeatherUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.doumee.core.utils;
import lombok.extern.slf4j.Slf4j;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/10 11:31
 */
@Slf4j
public class WeatherUtil {
    //API地址: https://dev.qweather.com/docs/api/warning/weather-warning/
    private static final String apiPath = "/v7/warning/now";
    public  static  String getWeatherWarningInfo(String apiUrl,String apiKey,String location){
        String url = apiUrl + apiPath + "?key=" + apiKey + "&location=" + location;
        log.error(DateUtil.getCurrDateTime() + "天气请求地址:"+url);
        String response = HttpsUtil.get(url,false);
        log.error(DateUtil.getCurrDateTime() + "天气请求返回:"+response);
        return response;
    }
}
server/system_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -300,4 +300,9 @@
    @ApiModelProperty(value = "是否查询固定人员:0=否;1=是" )
    @TableField(exist = false)
    private Integer querySpecial;
    @ApiModelProperty(value = "是否查询钥匙柜校验人员:0=否;1=是" )
    @TableField(exist = false)
    private Integer queryAuth;
}
server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -103,5 +103,11 @@
    @PostMapping("/timer/platformJob/sendUnFinishNotice")
    ApiResponse sendUnFinishNotice();
    @ApiOperation("【钉钉数据】钉钉token定时器接口")
    @PostMapping("/timer/dingTalkToken/updateDingTalkTokenOrigin")
    ApiResponse updateDingTalkTokenOrigin() throws Exception;
    @ApiOperation("【天气信息】定时同步天气预警")
    @PostMapping("/timer/weather/syncWeatherInfo")
    ApiResponse syncWeatherInfo();
}
server/visits/admin_timer/src/main/java/com/doumee/api/DingTalkTokenTimerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.doumee.api;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.wx.WXConstant;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.system.SystemDictDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Objects;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "钉钉token定时器接口")
@RestController
@RequestMapping("/timer/dingTalkToken")
public class DingTalkTokenTimerController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private SystemDictDataService systemDictDataService;
    @Autowired
    private DingTalk dingTalk;
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Value("${debug_model}")
    private Boolean timing;
    @ApiOperation("开启定时更新钉钉业务token")
    @PostMapping("/updateDingTalkTokenOrigin")
    public ApiResponse updateDingTalkTokenOrigin() throws Exception {
        dingTalk.updTokenInfo();
        return ApiResponse.success("开启定时更新微信公众号accesstoken成功");
    }
}
server/visits/admin_timer/src/main/java/com/doumee/api/WeatherTimerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.doumee.api;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.service.business.WarningService;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.system.SystemDictDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Api(tags = "天气预警同步")
@RestController
@RequestMapping("/timer/weather")
public class WeatherTimerController extends BaseController {
    @Autowired
    private WarningService warningService;
    /**
     * æ˜¯å¦å¼€å‘者
     */
    @Value("${debug_model}")
    private Boolean timing;
    @ApiOperation("定时同步天气预警信息")
    @PostMapping("/syncWeatherInfo")
    public ApiResponse syncWeatherInfo(){
        warningService.getWeatherInfo();
        return ApiResponse.success("定时同步天气预警信息");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetCloudController.java
@@ -6,6 +6,7 @@
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.vo.CabinetConfigDataVO;
import com.doumee.service.business.JkCabinetService;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
@@ -35,57 +36,81 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkcabinet:create")
    public ApiResponse create(@RequestBody JkCabinet jkCabinet) {
    public ApiResponse create(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(jkCabinetService.create(jkCabinet));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkcabinet:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkcabinet:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        jkCabinetService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkcabinet:update")
    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet) {
    public ApiResponse updateById(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
        jkCabinetService.updateById(jkCabinet);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改状态")
    @PostMapping("/updateStatusById")
    @CloudRequiredPermission("business:jkcabinet:update")
    public ApiResponse updateStatusById(@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinet.setLoginUserInfo(this.getLoginUser(token));
        jkCabinetService.updateStatusById(jkCabinet);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkcabinet:query")
    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap) {
    public ApiResponse<PageData<JkCabinet>> findPage (@RequestBody PageWrap<JkCabinet> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetService.findPage(pageWrap));
    }
    @ApiOperation("列表查询")
    @PostMapping("/list")
    @CloudRequiredPermission("business:jkcabinet:query")
    public ApiResponse<List<JkCabinet>> findList (@RequestBody JkCabinet jkCabinet,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetService.findList(jkCabinet));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkcabinet:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkCabinet> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkCabinet.class).export(jkCabinetService.findPage(pageWrap).getRecords(), "钥匙柜基本信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkcabinet:query")
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(jkCabinetService.findById(id));
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetService.getDetail(id));
    }
    @ApiOperation("更新酒精检测配置")
    @PostMapping("/updateCabinetConfig")
    @CloudRequiredPermission("business:jkcabinet:update")
    public ApiResponse updateCabinetConfig(@RequestBody CabinetConfigDataVO cabinetConfigDataVO, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetService.updCabinetConfig(cabinetConfigDataVO);
        return ApiResponse.success(null);
    }
    @ApiOperation("获取酒精检测配置")
    @GetMapping("/getCabinetConfig")
    @CloudRequiredPermission("business:jkcabinet:query")
    public ApiResponse<CabinetConfigDataVO> getCabinetConfig( @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetService.getCabinetConfigDataVO());
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java
@@ -6,6 +6,7 @@
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.doumee.dao.business.model.JkIccard;
import com.doumee.service.business.JkCabinetGridService;
import com.doumee.service.business.third.model.ApiResponse;
import com.doumee.service.business.third.model.PageData;
@@ -35,14 +36,14 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkcabinetgrid:create")
    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid) {
    public ApiResponse create(@RequestBody JkCabinetGrid jkCabinetGrid,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetGridService.create(jkCabinetGrid));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkcabinetgrid:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetGridService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +51,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkcabinetgrid:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,29 +64,53 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkcabinetgrid:update")
    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid) {
    public ApiResponse updateById(@RequestBody JkCabinetGrid jkCabinetGrid,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetGrid.setLoginUserInfo(getLoginUser(token));
        jkCabinetGridService.updateById(jkCabinetGrid);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改状态")
    @PostMapping("/updateStatusById")
    @CloudRequiredPermission("business:jkcabinetgrid:update")
    public ApiResponse updateStatusById(@RequestBody JkCabinetGrid jkCabinetGrid, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetGrid.setLoginUserInfo(this.getLoginUser(token));
        jkCabinetGridService.updateStatusById(jkCabinetGrid);
        return ApiResponse.success(null);
    }
    @ApiOperation("解绑钥匙")
    @PostMapping("/unBindKeys")
    @CloudRequiredPermission("business:jkcabinetgrid:update")
    public ApiResponse unBindKeys(@RequestBody List<Integer> idList, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetGridService.unBindKeys(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkcabinetgrid:query")
    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap) {
    public ApiResponse<PageData<JkCabinetGrid>> findPage (@RequestBody PageWrap<JkCabinetGrid> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetGridService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkcabinetgrid:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkCabinetGrid> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkCabinetGrid.class).export(jkCabinetGridService.findPage(pageWrap).getRecords(), "钥匙柜柜格基本信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkcabinetgrid:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetGridService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java
@@ -35,14 +35,14 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkcabinetlog:create")
    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog) {
    public ApiResponse create(@RequestBody JkCabinetLog jkCabinetLog,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetLogService.create(jkCabinetLog));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkcabinetlog:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetLogService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +50,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkcabinetlog:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,7 +63,7 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkcabinetlog:update")
    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog) {
    public ApiResponse updateById(@RequestBody JkCabinetLog jkCabinetLog,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkCabinetLogService.updateById(jkCabinetLog);
        return ApiResponse.success(null);
    }
@@ -71,21 +71,21 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkcabinetlog:query")
    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap) {
    public ApiResponse<PageData<JkCabinetLog>> findPage (@RequestBody PageWrap<JkCabinetLog> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetLogService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkcabinetlog:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response) {
        ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "钥匙柜开关门记录", response);
    public void exportExcel (@RequestBody PageWrap<JkCabinetLog> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "钥匙柜开关门记录_"+System.currentTimeMillis(), response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkcabinetlog:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkCabinetLogService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkIccardCloudController.java
@@ -5,6 +5,7 @@
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.model.JkIccard;
import com.doumee.service.business.JkIccardService;
import com.doumee.service.business.third.model.ApiResponse;
@@ -35,14 +36,15 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkiccard:create")
    public ApiResponse create(@RequestBody JkIccard jkIccard) {
    public ApiResponse create(@RequestBody JkIccard jkIccard,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkIccard.setLoginUserInfo(getLoginUser(token));
        return ApiResponse.success(jkIccardService.create(jkIccard));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkiccard:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkIccardService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +52,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkiccard:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,29 +65,40 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkiccard:update")
    public ApiResponse updateById(@RequestBody JkIccard jkIccard) {
    public ApiResponse updateById(@RequestBody JkIccard jkIccard,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkIccard.setLoginUserInfo(getLoginUser(token));
        jkIccardService.updateById(jkIccard);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改状态")
    @PostMapping("/updateStatusById")
    @CloudRequiredPermission("business:jkiccard:update")
    public ApiResponse updateStatusById(@RequestBody JkIccard jkIccard, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkIccard.setLoginUserInfo(this.getLoginUser(token));
        jkIccardService.updateStatusById(jkIccard);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkiccard:query")
    public ApiResponse<PageData<JkIccard>> findPage (@RequestBody PageWrap<JkIccard> pageWrap) {
    public ApiResponse<PageData<JkIccard>> findPage (@RequestBody PageWrap<JkIccard> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkIccardService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkiccard:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkIccard> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkIccard> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkIccard.class).export(jkIccardService.findPage(pageWrap).getRecords(), "钥匙柜IC卡信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkiccard:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkIccardService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkKeysCloudController.java
@@ -5,6 +5,7 @@
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.model.JkKeys;
import com.doumee.service.business.JkKeysService;
import com.doumee.service.business.third.model.ApiResponse;
@@ -35,14 +36,15 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkkeys:create")
    public ApiResponse create(@RequestBody JkKeys jkKeys) {
    public ApiResponse create(@RequestBody JkKeys jkKeys,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkKeys.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(jkKeysService.create(jkKeys));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkkeys:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkKeysService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +52,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkkeys:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,7 +65,8 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkkeys:update")
    public ApiResponse updateById(@RequestBody JkKeys jkKeys) {
    public ApiResponse updateById(@RequestBody JkKeys jkKeys,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkKeys.setLoginUserInfo(this.getLoginUser(token));
        jkKeysService.updateById(jkKeys);
        return ApiResponse.success(null);
    }
@@ -71,21 +74,29 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkkeys:query")
    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap) {
    public ApiResponse<PageData<JkKeys>> findPage (@RequestBody PageWrap<JkKeys> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkKeysService.findPage(pageWrap));
    }
    @ApiOperation("列表查询")
    @PostMapping("/list")
    @CloudRequiredPermission("business:jkkeys:query")
    public ApiResponse<List<JkKeys>> findList (@RequestBody JkKeys jkKeys, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkKeysService.findList(jkKeys));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkkeys:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkKeys> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkKeys.class).export(jkKeysService.findPage(pageWrap).getRecords(), "钥匙基本信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkkeys:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkKeysService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkVersionCloudController.java
@@ -35,14 +35,15 @@
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:jkversion:create")
    public ApiResponse create(@RequestBody JkVersion jkVersion) {
    public ApiResponse create(@RequestBody JkVersion jkVersion,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkVersion.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(jkVersionService.create(jkVersion));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:jkversion:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkVersionService.deleteById(id);
        return ApiResponse.success(null);
    }
@@ -50,7 +51,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:jkversion:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
@@ -63,7 +64,8 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkversion:update")
    public ApiResponse updateById(@RequestBody JkVersion jkVersion) {
    public ApiResponse updateById(@RequestBody JkVersion jkVersion,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        jkVersion.setLoginUserInfo(this.getLoginUser(token));
        jkVersionService.updateById(jkVersion);
        return ApiResponse.success(null);
    }
@@ -71,21 +73,21 @@
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:jkversion:query")
    public ApiResponse<PageData<JkVersion>> findPage (@RequestBody PageWrap<JkVersion> pageWrap) {
    public ApiResponse<PageData<JkVersion>> findPage (@RequestBody PageWrap<JkVersion> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkVersionService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkversion:exportExcel")
    public void exportExcel (@RequestBody PageWrap<JkVersion> pageWrap, HttpServletResponse response) {
    public void exportExcel (@RequestBody PageWrap<JkVersion> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(JkVersion.class).export(jkVersionService.findPage(pageWrap).getRecords(), "交控-钥匙柜终端版本信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:jkversion:query")
    public ApiResponse findById(@PathVariable Integer id) {
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(jkVersionService.findById(id));
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java
@@ -373,20 +373,26 @@
     * api åœ°å€ https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages
     * @throws ApiException
     */
    public void workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg)throws ApiException {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setAgentId(agentId);
        request.setUseridList(userIds);
        request.setToAllUser(false);
    public Boolean workInfoOANotice(Long agentId,String userIds,OapiMessageCorpconversationAsyncsendV2Request.Msg msg){
        try{
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
            request.setAgentId(agentId);
            request.setUseridList(userIds);
            request.setToAllUser(false);
        request.setMsg(msg);
        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, "60c2df248ca93d4eafb4a04a2330d3d3");//getToken());
        if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
            request.setMsg(msg);
            OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, "60c2df248ca93d4eafb4a04a2330d3d3");//getToken());
            if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){
                return true;
            }else{
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
            }
        }catch (ApiException apiException){
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage());
        }
        return false;
    }
@@ -532,79 +538,83 @@
     * unionIdList å¾…办通知人员集合
     * @throws Exception
     */
    public String toDoNotice(String title,List<String> unionIdList,List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> fieldList) throws Exception {
        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
        CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
        createTodoTaskHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
        //待办截止前的提醒
        CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs remindNotifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs()
                .setDingNotify("1")
                .setSendTodoApn("true");
        //待办通知配置
        CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
                .setDingNotify("1")
                .setSendTodoApn("true")
                .setSendAssistantChat("true");
        //按钮事件
        CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam actionList0Param = new CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam()
                .setBody("");
        CreateTodoTaskRequest.CreateTodoTaskRequestActionList actionList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestActionList()
                .setTitle("去处理")
                .setActionType(2)
                .setParam(actionList0Param)
                .setUrl("https://www.baidu.com") //TODO è¯¦æƒ…地址
                .setActionKey("ak-1-1");
        //详情页url跳转地址
        CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl = new CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
                .setAppUrl("https://www.baidu.com")
                .setPcUrl("https://www.baidu.com");
        CreateTodoTaskRequest createTodoTaskRequest = new CreateTodoTaskRequest()
                .setSubject(title)
                .setCreatorId(unionIdList.get(Constants.ZERO))
                .setDescription(title)
                .setExecutorIds(unionIdList)
                .setDetailUrl(detailUrl)
                .setContentFieldList(fieldList)
                .setIsOnlyShowExecutor(true)
                .setPriority(20)
                .setNotifyConfigs(notifyConfigs)
                .setActionList(java.util.Arrays.asList(actionList0))
                .setTodoType("TODO")
                .setRemindNotifyConfigs(remindNotifyConfigs);
        try {
            CreateTodoTaskResponse response = client.createTodoTaskWithOptions(unionIdList.get(Constants.ZERO), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
            log.error("待办通知发送成功,发送内容:{}"+JSONObject.toJSONString(response));
            return response.getBody().getId();
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                log.error("待办通知发送失败,失败原因:{}"+err.message);
    public String toDoNotice(String title,List<String> unionIdList,List<CreateTodoTaskRequest.CreateTodoTaskRequestContentFieldList> fieldList,String url) {
        try{
            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
            CreateTodoTaskHeaders createTodoTaskHeaders = new CreateTodoTaskHeaders();
            createTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
            //待办截止前的提醒
            CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs remindNotifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestRemindNotifyConfigs()
                    .setDingNotify("1")
                    .setSendTodoApn("true");
            //待办通知配置
            CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs notifyConfigs = new CreateTodoTaskRequest.CreateTodoTaskRequestNotifyConfigs()
                    .setDingNotify("1")
                    .setSendTodoApn("true")
                    .setSendAssistantChat("true");
            //按钮事件
            CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam actionList0Param = new CreateTodoTaskRequest.CreateTodoTaskRequestActionListParam()
                    .setBody("");
            CreateTodoTaskRequest.CreateTodoTaskRequestActionList actionList0 = new CreateTodoTaskRequest.CreateTodoTaskRequestActionList()
                    .setTitle("去处理")
                    .setActionType(2)
                    .setParam(actionList0Param)
                    .setUrl("https://www.baidu.com") //TODO è¯¦æƒ…地址
                    .setActionKey("ak-1-1");
            //详情页url跳转地址
            CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl detailUrl = new CreateTodoTaskRequest.CreateTodoTaskRequestDetailUrl()
                    .setAppUrl("https://www.baidu.com")
                    .setPcUrl("https://www.baidu.com");
            CreateTodoTaskRequest createTodoTaskRequest = new CreateTodoTaskRequest()
                    .setSubject(title)
                    .setCreatorId(unionIdList.get(Constants.ZERO))
                    .setDescription(title)
                    .setExecutorIds(unionIdList)
                    .setDetailUrl(detailUrl)
                    .setContentFieldList(fieldList)
                    .setIsOnlyShowExecutor(true)
                    .setPriority(20)
                    .setNotifyConfigs(notifyConfigs)
                    .setActionList(java.util.Arrays.asList(actionList0))
                    .setTodoType("TODO")
                    .setRemindNotifyConfigs(remindNotifyConfigs);
            try {
                CreateTodoTaskResponse response = client.createTodoTaskWithOptions(unionIdList.get(Constants.ZERO), createTodoTaskRequest, createTodoTaskHeaders, new com.aliyun.teautil.models.RuntimeOptions());
                log.error("待办通知发送成功,发送内容:{}"+JSONObject.toJSONString(response));
                return response.getBody().getId();
            } catch (TeaException err) {
                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                    log.error("待办通知发送失败,失败原因:{}"+err.message);
                }
            } catch (Exception _err) {
                TeaException err = new TeaException(_err.getMessage(), _err);
                if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                    // err ä¸­å«æœ‰ code å’Œ message å±žæ€§ï¼Œå¯å¸®åŠ©å¼€å‘å®šä½é—®é¢˜
                    log.error("待办通知发送失败,失败原因:{}"+err.message);
                }
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err ä¸­å«æœ‰ code å’Œ message å±žæ€§ï¼Œå¯å¸®åŠ©å¼€å‘å®šä½é—®é¢˜
                log.error("待办通知发送失败,失败原因:{}"+err.message);
            }
            return null;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钉钉待办任务通知发送失败");
        }
        return null;
    }
    /**
     * å¤„理全部人的待办信息
     * å¤„理全部人的待办信息 ï¼ˆæµç¨‹å®¡æ‰¹å®Œæˆã€æœ¬çº§å®¡æ‰¹å®Œæˆ ä½¿ç”¨ï¼‰
     * @param unionId
     * @param taskId
     * api地址 https://open.dingtalk.com/document/orgapp/updates-dingtalk-to-do-tasks
     * @throws Exception
     */
    public void updToDoNoticeInfoStatus(String unionId,String taskId) throws Exception {
        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
        UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
        updateTodoTaskHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
        UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest()
                .setOperatorId(unionId)
                .setDone(true);
    public void updToDoNoticeInfoStatus(String unionId,String taskId){
        try {
            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
            UpdateTodoTaskHeaders updateTodoTaskHeaders = new UpdateTodoTaskHeaders();
            updateTodoTaskHeaders.xAcsDingtalkAccessToken = getToken();
            UpdateTodoTaskRequest updateTodoTaskRequest = new UpdateTodoTaskRequest()
                    .setOperatorId(unionId)
                    .setDone(true);
            UpdateTodoTaskResponse response = client.updateTodoTaskWithOptions(unionId, taskId, updateTodoTaskRequest, updateTodoTaskHeaders, new RuntimeOptions());
            log.error("待办通知发送成功,发送内容:{}"+JSONObject.toJSONString(response));
        } catch (TeaException err) {
@@ -612,7 +622,6 @@
                // err ä¸­å«æœ‰ code å’Œ message å±žæ€§ï¼Œå¯å¸®åŠ©å¼€å‘å®šä½é—®é¢˜
                log.error("待办通知发送失败,失败原因:{}"+err.message);
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
@@ -630,18 +639,18 @@
     * api åœ°å€ https://open.dingtalk.com/document/orgapp/update-dingtalk-to-do-status
     * @throws Exception
     */
    public void updUserToDoNoticeInfoStatus(String unionId,String taskId,String dealUnionId) throws Exception {
        com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
        UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders();
        updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = "43cf8213909f34ef81e7447905b822fb";//getToken();
        UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList()
                .setId(dealUnionId)
                .setIsDone(true);
        UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest()
                .setExecutorStatusList(java.util.Arrays.asList(
                        executorStatusList0
                ));
    public void updUserToDoNoticeInfoStatus(String unionId,String taskId,String dealUnionId){
        try {
            com.aliyun.dingtalktodo_1_0.Client client = DingTalk.createV1Client();
            UpdateTodoTaskExecutorStatusHeaders updateTodoTaskExecutorStatusHeaders = new UpdateTodoTaskExecutorStatusHeaders();
            updateTodoTaskExecutorStatusHeaders.xAcsDingtalkAccessToken = getToken();
            UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList executorStatusList0 = new UpdateTodoTaskExecutorStatusRequest.UpdateTodoTaskExecutorStatusRequestExecutorStatusList()
                    .setId(dealUnionId)
                    .setIsDone(true);
            UpdateTodoTaskExecutorStatusRequest updateTodoTaskExecutorStatusRequest = new UpdateTodoTaskExecutorStatusRequest()
                    .setExecutorStatusList(java.util.Arrays.asList(
                            executorStatusList0
                    ));
            UpdateTodoTaskExecutorStatusResponse response = client.updateTodoTaskExecutorStatusWithOptions(unionId, taskId, updateTodoTaskExecutorStatusRequest, updateTodoTaskExecutorStatusHeaders, new RuntimeOptions());
            log.error("待办通知发送成功,发送内容:{}"+JSONObject.toJSONString(response));
        } catch (TeaException err) {
@@ -729,10 +738,10 @@
        carUseBook.setType(Constants.ZERO);
        dingTalk.workInfoOANotice(4015267031L,"1568490244651036",dingTalk.getCarUseNoticeMsg(carUseBook,"用车申请"));
//        dingTalk.workInfoOANotice(4015267031L,"1568490244651036",dingTalk.getCarUseNoticeMsg(carUseBook,"用车申请"));
//        dingTalk.toDoNotice("小豆丁提交的公务车用车",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE","XiPYJKRAv9eCoO4UPM20HQQiEiE","eWbHiSp3uRtrMtiiOX5LXamgiEiE") ,dingTalk.getToDoCarUseBookFiledInfo(carUseBook));
        dingTalk.toDoNotice("小豆丁提交的公务车用车",java.util.Arrays.asList("iPsP86axviPHiSP4nm5YgQNCQiEiE","XiPYJKRAv9eCoO4UPM20HQQiEiE","eWbHiSp3uRtrMtiiOX5LXamgiEiE") ,dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"");
//
//        dingTalk.updUserToDoNoticeInfoStatus("iPsP86axviPHiSP4nm5YgQNCQiEiE",
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetGridMapper.java
@@ -2,11 +2,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.github.yulichang.base.mapper.MPJJoinMapper;
import com.github.yulichang.interfaces.MPJBaseJoin;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkCabinetGridMapper extends BaseMapper<JkCabinetGrid> {
public interface JkCabinetGridMapper extends MPJJoinMapper<JkCabinetGrid> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCabinetLogMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkCabinetLog;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkCabinetLogMapper extends BaseMapper<JkCabinetLog> {
public interface JkCabinetLogMapper extends MPJJoinMapper<JkCabinetLog> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkIccardMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkIccard;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkIccardMapper extends BaseMapper<JkIccard> {
public interface JkIccardMapper extends MPJJoinMapper<JkIccard> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkKeysMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkKeys;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkKeysMapper extends BaseMapper<JkKeys> {
public interface JkKeysMapper extends MPJJoinMapper<JkKeys> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkVersionMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.JkVersion;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
public interface JkVersionMapper extends BaseMapper<JkVersion> {
public interface JkVersionMapper extends MPJJoinMapper<JkVersion> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/CloseGridDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.doumee.dao.business.dto;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class CloseGridDTO{
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
    @ApiModelProperty(value = "验证方式 0刷脸 1刷卡 2管理员操作")
    private Integer authType;
    @ApiModelProperty(value = "柜格主键")
    private Integer gridId;
    @ApiModelProperty(value = "用户主键")
    private Integer memberId;
    @ApiModelProperty(value = "钥匙状态:1在位 2借出")
    private Integer keyStatus;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/GetDriverGridDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.business.dto;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class GetDriverGridDTO{
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
    @ApiModelProperty(value = "0=取 1=还")
    private Integer type;
    @ApiModelProperty(value = "用户主键")
    private Integer memberId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OpenGridDriverDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.business.dto;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class OpenGridDriverDTO extends LoginUserModel {
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
    @ApiModelProperty(value = "验证方式 0刷脸 1刷卡")
    private Integer authType;
    @ApiModelProperty(value = "柜格主键")
    private Integer gridId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/OptGridDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.business.dto;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/10/11 16:01
 */
@Data
public class OptGridDTO extends LoginUserModel {
    @ApiModelProperty(value = "钥匙柜主键")
    private Integer cabinetId;
    @ApiModelProperty(value = "柜格主键列表")
    private List<Integer> gridIdList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
@@ -145,6 +145,12 @@
    //@ExcelColumn(name="司机编码(关联memberId)")
    private Integer driverId;
    @ApiModelProperty(value = "钉钉待办任务主键")
    private String ddToDoId;
    @ApiModelProperty(value = "钉钉待办任务归属人主键")
    private String ddBelongToUnionId;
    @ApiModelProperty(value = "司机姓名", example = "1")
    @TableField(exist = false)
    private String driverName;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -11,6 +12,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * é’¥åŒ™æŸœåŸºæœ¬ä¿¡æ¯è¡¨
@@ -73,17 +75,27 @@
    @ExcelColumn(name="通讯地址")
    private String linkAddr;
    @ApiModelProperty(value = "状态 0未绑定 1在位 2借出", example = "1")
    @ExcelColumn(name="状态 0未绑定 1在位 2借出")
    @ApiModelProperty(value = "状态 0启用 1禁用", example = "1")
    @ExcelColumn(name="状态 0启用 1禁用")
    private Integer status;
    @ApiModelProperty(value = "运行状态 0=在线 1=离线", example = "1")
    @ExcelColumn(name="运行状态 0=在线 1=离线")
    private Integer runStatus;
    @ApiModelProperty(value = "端口", example = "1")
    @ExcelColumn(name="端口")
    private Integer port;
    @ApiModelProperty(value = "设备管理员编码(关联member)", example = "1")
    @ApiModelProperty(value = "设备管理员编码(关联member) å¤šä¸ªä»¥,分割", example = "1")
    @ExcelColumn(name="设备管理员编码(关联member)")
    private Integer managerId;
    private String managerId;
    @ApiModelProperty(value = "验证人编码(关联member)", example = "1")
    @ExcelColumn(name="验证人编码(关联member)")
    private String authMemberId;
    @ApiModelProperty(value = "使用时长(秒)", example = "1")
    @ExcelColumn(name="使用时长(秒)")
@@ -93,10 +105,6 @@
    @ExcelColumn(name="是否双重验证 0否 1是")
    private Integer doubleAuth;
    @ApiModelProperty(value = "验证人编码(关联member)", example = "1")
    @ExcelColumn(name="验证人编码(关联member)")
    private Integer authMemberId;
    @ApiModelProperty(value = "排数", example = "1")
    @ExcelColumn(name="排数")
    private Integer rowNum;
@@ -104,6 +112,10 @@
    @ApiModelProperty(value = "列数", example = "1")
    @ExcelColumn(name="列数")
    private Integer columnNum;
    @ApiModelProperty(value = "排序顺序:0=从左向右;1=从上向下", example = "1")
    @ExcelColumn(name="排序顺序")
    private Integer sortType;
    @ApiModelProperty(value = "最后通讯时间")
    @ExcelColumn(name="最后通讯时间")
@@ -138,4 +150,21 @@
    @ExcelColumn(name="起始编码")
    private Integer noIndex;
    @ApiModelProperty(value = "经纬度信息 å‚数值:经度,纬度")
    @TableField(exist = false)
    private String jwd;
    @ApiModelProperty(value = "柜格数量", example = "1")
    @TableField(exist = false)
    private Integer gridNum;
    @ApiModelProperty(value = "设备管理人员数组", example = "1")
    @TableField(exist = false)
    private List<String> managerIdList;
    @ApiModelProperty(value = "验证人编码数组", example = "1")
    @TableField(exist = false)
    private List<String> authMemberIdList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -68,12 +69,45 @@
    @ExcelColumn(name="序列号")
    private String serialNo;
    @ApiModelProperty(value = "状态 0未绑定 1在位 2借出", example = "1")
    @ExcelColumn(name="状态 0未绑定 1在位 2借出")
    @ApiModelProperty(value = "状态 0启用;1禁用", example = "1")
    @ExcelColumn(name="状态 0启用;1=禁用")
    private Integer status;
    @ApiModelProperty(value = "运行状态", example = "1")
    @ApiModelProperty(value = "运行状态 0正常 1故障 ", example = "1")
    @ExcelColumn(name="运行状态")
    private Integer workingStatus;
    @ApiModelProperty(value = "板号")
    @ExcelColumn(name="板号")
    private String boardCode;
    @ApiModelProperty(value = "通道号")
    @ExcelColumn(name="通道号")
    private String channelCode;
    @ApiModelProperty(value = "绑定状态 0未绑定;1已绑定", example = "1")
    @TableField(exist = false)
    private Integer bindStatus;
    @ApiModelProperty(value = "钥匙柜名称", example = "1")
    @TableField(exist = false)
    private String cabinetName;
    @ApiModelProperty(value = "钥匙编码", example = "1")
    @TableField(exist = false)
    private String keyCode;
    @ApiModelProperty(value = "车牌号", example = "1")
    @TableField(exist = false)
    private String carCode;
    @ApiModelProperty(value = "车辆主键", example = "1")
    @TableField(exist = false)
    private Integer carId;
    @ApiModelProperty(value = "钥匙状态 0未绑定 1在位 2借出 3维修保养", example = "1")
    @TableField(exist = false)
    private Integer keyStatus;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -22,70 +23,90 @@
public class JkCabinetLog  extends LoginUserModel {
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @ExcelColumn(name="开门时间",index = 0,dateFormat = "yyyy-MM-dd HH:mm:ss",width = 16)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String info;
    @ApiModelProperty(value = "钥匙柜编码(关联jk_cabinet)", example = "1")
    @ExcelColumn(name="钥匙柜编码(关联jk_cabinet)")
    private Integer cabinetId;
    @ApiModelProperty(value = "钥匙柜格编码(关联jk_cabinet_grid)", example = "1")
    @ExcelColumn(name="钥匙柜格编码(关联jk_cabinet_grid)")
    private Integer gridId;
    @ApiModelProperty(value = "验证方式 0刷脸 1刷卡", example = "1")
    @ExcelColumn(name="验证方式 0刷脸 1刷卡")
    @ExcelColumn(name="校验方式",index = 2,width = 10,valueMapping = "0=人脸;1=刷卡;2=管理授权;")
    private Integer authType;
    @ApiModelProperty(value = "车辆编码(关联cars)", example = "1")
    @ExcelColumn(name="车辆编码(关联cars)")
    private Integer carId;
    @ApiModelProperty(value = "钥匙编码(关联jk_keys)", example = "1")
    @ExcelColumn(name="钥匙编码(关联jk_keys)")
    private Integer keyId;
    @ApiModelProperty(value = "人员编码(关联member)", example = "1")
    @ExcelColumn(name="人员编码(关联member)")
    private Integer memberId;
    @ApiModelProperty(value = "钥匙信息(车牌号-钥匙编码)")
    @ExcelColumn(name="钥匙信息(车牌号-钥匙编码)")
    @ExcelColumn(name="钥匙",index = 5,width = 16)
    private String keyInfo;
    @ApiModelProperty(value = "领取规则 0随车 1随派车单", example = "1")
    @ExcelColumn(name="领取规则 0随车 1随派车单")
    private Integer roleType;
    @ApiModelProperty(value = "状态 0成功 1失败", example = "1")
    @ExcelColumn(name="状态 0成功 1失败")
    @ExcelColumn(name="状态",index = 6,width = 10,valueMapping = "0=成功;1=失败;")
    private Integer status;
    @ApiModelProperty(value = "操作类型:0=开门;1=关门;", example = "1")
    private Integer type;
    @ApiModelProperty(value = "操作人部门", example = "1",hidden = true)
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "操作人名称", example = "1")
    @ExcelColumn(name="操作人",index = 1,width = 2)
    @TableField(exist = false)
    private String memberName;
    @ApiModelProperty(value = "钥匙柜名称", example = "1")
    @ExcelColumn(name="所属钥匙柜",index = 3,width = 12)
    @TableField(exist = false)
    private String cabinetName;
    @ApiModelProperty(value = "柜格编号", example = "1")
    @ExcelColumn(name="柜格编号",index = 4,width = 12)
    @TableField(exist = false)
    private String gridCode;
    @ApiModelProperty(value = "查询开始时间 yyyy-MM-dd ")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startDate;
    @ApiModelProperty(value = "查询结束时间 yyyy-MM-dd ")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkIccard.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -72,4 +73,12 @@
    @ExcelColumn(name="钥匙柜编码(关联jk_cabinet)")
    private Integer cabinetId;
    @ApiModelProperty(value = "关联人员类型:0=司机;1=校验人员", example = "1")
    @ExcelColumn(name="关联人员类型:0=司机;1=校验人员")
    private Integer userType;
    @ApiModelProperty(value = "人员名称", example = "1")
    @TableField(exist = false)
    private String memberName;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkKeys.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -54,7 +55,7 @@
    @ApiModelProperty(value = "钥匙编号", example = "1")
    @ExcelColumn(name="钥匙编号")
    private Integer code;
    private String code;
    @ApiModelProperty(value = "车牌号")
    @ExcelColumn(name="车牌号")
@@ -72,8 +73,21 @@
    @ExcelColumn(name="领取规则 0随车 1随派车单")
    private Integer roleType;
    @ApiModelProperty(value = "状态 0未绑定 1在位 2借出", example = "1")
    @ExcelColumn(name="状态 0未绑定 1在位 2借出")
    @ApiModelProperty(value = " çŠ¶æ€ 0未绑定 1在位 2借出 3维修保养", example = "1")
    @ExcelColumn(name=" çŠ¶æ€ 0未绑定 1在位 2借出 3维修保养")
    private Integer status;
    @ApiModelProperty(value = "存放位置", example = "1")
    @TableField(exist = false)
    private String gridCode;
    @ApiModelProperty(value = "绑定钥匙柜", example = "1")
    @TableField(exist = false)
    private String cabinetName;
    @ApiModelProperty(value = "是否绑定:0=否;1=是;", example = "1")
    @TableField(exist = false)
    private Integer isBinding;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkVersion.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.service.business.third.model.LoginUserModel;
import io.swagger.annotations.ApiModel;
@@ -9,6 +10,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -84,4 +87,24 @@
    @ExcelColumn(name="平台类型 0Android 1IOS")
    private Integer type;
    @ApiModelProperty(value = "文件大小 å•位(KB)", example = "1")
    @ExcelColumn(name="文件大小 å•位(KB)")
    private Integer fileSize;
    @ApiModelProperty(value = "文件大小 å•位(MB)", example = "1")
    @TableField(exist = false)
    private double fileSizeMb;
    @ApiModelProperty(value = "创建人名称", example = "1")
    @TableField(exist = false)
    private String createUserName;
    @ApiModelProperty(value = "apk全路径", example = "1")
    @TableField(exist = false)
    private String fullFileUrl;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -242,6 +242,11 @@
    @ExcelColumn(name="施工事由")
    private String constructionReason;
    @ApiModelProperty(value = "钉钉待办任务主键")
    private String ddToDoId;
    @ApiModelProperty(value = "钉钉待办任务归属人主键")
    private String ddBelongToUnionId;
    @ApiModelProperty(value = "普通访客申请随访人员")
    @TableField(exist = false)
    private List<Visits> withUserList;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/AdminCabinetVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.dao.business.vo;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class AdminCabinetVO {
    @ApiModelProperty(value = "设备主键(系统内)")
    private Integer id;
    @ApiModelProperty(value = "设备编号")
    private String code;
    @ApiModelProperty(value = "设备名称")
    private String name;
    @ApiModelProperty(value = "设备ID")
    private String devId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetConfigDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.dao.business.vo;
import com.doumee.dao.business.model.Approve;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class CabinetConfigDataVO {
    @ApiModelProperty(value = "浓度阈值单位 (1=mg/100ml;2=mg/L;3=%BAC)")
    private String threshold;
    @ApiModelProperty(value = "吹气时长(秒)")
    private String blowTime;
    @ApiModelProperty(value = "压力值")
    private String pressure;
    @ApiModelProperty(value = "浓度阈值")
    private String concentration;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetDetailVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,53 @@
package com.doumee.dao.business.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class CabinetDetailVO {
    @ApiModelProperty(value = "设备主键(系统内)")
    private Integer id;
    @ApiModelProperty(value = "设备编号")
    private String code;
    @ApiModelProperty(value = "设备名称")
    private String name;
    @ApiModelProperty(value = "设备ID")
    private String devId;
    @ApiModelProperty(value = "柜格总数")
    private Integer gridNum;
    @ApiModelProperty(value = "在位钥匙数")
    private Integer onlineKeyNum;
    @ApiModelProperty(value = "借出钥匙数")
    private Integer outKeyNum;
    @ApiModelProperty(value = "维修保养钥匙数")
    private Integer serviceKeyNum;
    @ApiModelProperty(value = "故障柜体数量")
    private Integer errGridNum;
    @ApiModelProperty(value = "未绑定柜体数量")
    private Integer unBindGridNum;
    @ApiModelProperty(value = "柜格信息")
    private List<CabinetGridInfoVO> cabinetGridInfoVOList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/CabinetGridInfoVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
package com.doumee.dao.business.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/23 14:56
 */
@Data
public class CabinetGridInfoVO {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "编码")
    private String code;
    @ApiModelProperty(value = "钥匙编码(关联jk_keys)", example = "1")
    private Integer keyId;
    @ApiModelProperty(value = "柜体运行状态 0正常 1故障 ", example = "1")
    private Integer workingStatus;
    @ApiModelProperty(value = "绑定状态 0未绑定;1已绑定", example = "1")
    private Integer bindStatus;
    @ApiModelProperty(value = "钥匙状态 0未绑定 1在位 2借出 3维修保养", example = "1")
    private Integer keyStatus;
    @ApiModelProperty(value = "板号")
    private String boardCode;
    @ApiModelProperty(value = "通道号")
    private String channelCode;
    @ApiModelProperty(value = "车牌号", example = "1")
    private String carCode;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java
@@ -1,8 +1,11 @@
package com.doumee.service.business;
//import com.doumee.service.business.third.model.PageData;
//import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.dto.OptGridDTO;
import com.doumee.dao.business.dto.CloseGridDTO;
import com.doumee.dao.business.dto.GetDriverGridDTO;
import com.doumee.dao.business.dto.OpenGridDriverDTO;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
@@ -97,4 +100,43 @@
     * @return long
     */
    long count(JkCabinetGrid jkCabinetGrid);
    void updateStatusById(JkCabinetGrid jkCabinetGrid);
    void unBindKeys(List<Integer> idList);
    /**
     * æ ‡è®°æŸœæ ¼æ•…éšœ
     * @param loginUserInfo
     * @param cabinetId
     * @param gridIdList
     */
    void markFault(OptGridDTO dto);
    /**
     * æ ‡è®°æŸœæ ¼æ­£å¸¸
     * @param loginUserInfo
     * @param cabinetId
     * @param gridIdList
     */
    void cancelFault(OptGridDTO dto);
    /**
     * æ‰¹é‡å¼€é—¨ - ç®¡ç†å‘˜
     */
    void batchOpenGridAdmin(OptGridDTO dto);
    /**
     * æ ‡è®°ç»´ä¿®ä¿å…» - ç®¡ç†å‘˜
     * @param loginUserInfo
     * @param cabinetId
     * @param gridIdList
     */
    void markRepair(OptGridDTO dto);
    void closeGrid(CloseGridDTO dto);
    List<JkCabinetGrid> getDriverGrid(GetDriverGridDTO getDriverGridDTO);
    void openGridDriver(OpenGridDriverDTO openGridDriverDTO);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
@@ -1,5 +1,9 @@
package com.doumee.service.business;
import com.doumee.dao.business.vo.AdminCabinetVO;
import com.doumee.dao.business.vo.CabinetConfigDataVO;
import com.doumee.dao.business.vo.CabinetDetailVO;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.model.JkCabinet;
@@ -48,6 +52,8 @@
     */
    void updateById(JkCabinet jkCabinet);
    void updateStatusById(JkCabinet jkCabinet);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
@@ -63,6 +69,7 @@
     */
    JkCabinet findById(Integer id);
    JkCabinet getDetail(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
@@ -94,4 +101,23 @@
     * @return long
     */
    long count(JkCabinet jkCabinet);
    CabinetConfigDataVO getCabinetConfigDataVO();
    void updCabinetConfig(CabinetConfigDataVO cabinetConfigDataVO);
    /**
     * é’¥åŒ™æŸœç®¡ç†å‘˜ èŽ·å–å¯ç®¡ç†çš„é’¥åŒ™æŸœåˆ—è¡¨
     * @param loginUserInfo
     * @return
     */
    List<AdminCabinetVO> getAdminCabinetInfo(LoginUserInfo loginUserInfo);
    /**
     * èŽ·å–é’¥åŒ™æŸœè¯¦æƒ…
     * @param cabinetId
     * @return
     */
    CabinetDetailVO getCabinetDetail(Integer cabinetId);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkIccardService.java
@@ -94,4 +94,6 @@
     * @return long
     */
    long count(JkIccard jkIccard);
    void updateStatusById(JkIccard jkIccard);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/WarningService.java
@@ -97,4 +97,6 @@
    long count(Warning warning);
    void updateStatus(Warning param);
    void getWeatherInfo();
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
@@ -124,6 +125,8 @@
    private SmsEmailMapper smsEmailMapper;
    @Autowired
    private EmayService emayService;
    @Autowired
    private DingTalk dingTalk;
    @Override
    public Integer create(Approve approve) {
        approveMapper.insert(approve);
@@ -621,6 +624,7 @@
                                    Arrays.asList(member.getSystemOpenid().split(","))
                            );
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)){
                        //访客报备
                        SmsEmailServiceImpl.sendVisitReportSms(systemDictDataBiz,
@@ -659,9 +663,44 @@
                            }
                        }
                    }
                }
            }
            if(Constants.equalsInteger(i,Constants.ZERO) && CollectionUtils.isNotEmpty(memberList)){
                //生成第一批钉钉审批通知信息
                List<String> erpId = memberList.stream().filter(m->StringUtils.isNotBlank(m.getErpId())).map(m->m.getErpId()).collect(Collectors.toList());
                if(CollectionUtils.isNotEmpty(erpId)){
                    if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.useCar)){
                        CarUseBook carUseBook = carUseBookMapper.selectJoinOne(CarUseBook.class,
                                new MPJLambdaWrapper<CarUseBook>()
                                        .selectAll(CarUseBook.class)
                                        .selectAs(Member::getName,CarUseBook::getMemberName)
                                        .leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
                                        .eq(CarUseBook::getId,businessId)
                                        .last(" limit 1 ")
                        );
                        if(Objects.nonNull(carUseBook)){
                            if(CollectionUtils.isNotEmpty(erpId)){
                                String ddTalkId = dingTalk.toDoNotice(StringUtils.isNotBlank(carUseBook.getMemberName())?(carUseBook.getMemberName()+"提交的公务用车申请"):"公务车用车申请",
                                        erpId ,
                                        dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"pages/staff/vehicle/sendACarDetail?id="+carUseBook.getId());
                                carUseBookMapper.update(new UpdateWrapper<CarUseBook>().lambda()
                                        .set(CarUseBook::getDdBelongToUnionId,erpId.get(Constants.ZERO))
                                        .set(CarUseBook::getDdToDoId,ddTalkId).eq(CarUseBook::getId,carUseBook.getId()));
                            }
                        }
                    }else if(Constants.equalsInteger(noticeType,Constants.noticesObjectType.visit) || Constants.equalsInteger(noticeType,Constants.noticesObjectType.visitReporting)) {
                        Visits visits = visitsMapper.selectById(businessId);
                        if (Objects.nonNull(visits)) {
                            //TODO ç¼ºå°‘域名前缀内容
                            String ddTalkId = dingTalk.toDoNotice(visits.getName() + "的访客申请",
                                    erpId,
                                    dingTalk.getToDoVisitFiledInfo(visits), "pages/appointmentDetails/appointmentDetails?id=" + visits.getId());
                            visitsMapper.update(new UpdateWrapper<Visits>().lambda()
                                            .set(Visits::getDdBelongToUnionId,erpId.get(Constants.ZERO))
                                    .set(Visits::getDdToDoId, ddTalkId).eq(Visits::getId, visits.getId()));
                        }
                    }
                }
            }
        }
    }
@@ -1285,6 +1324,7 @@
        approveMapper.updateById(approve);
        //是否处理 ä¸šåŠ¡æ•°æ®
        Boolean dealBusinessBean = false;
        Boolean dealDDToDo = false;
        //审批驳回情况
        if(approveDTO.getStatus().equals(Constants.THREE)){
            dealBusinessBean = true;
@@ -1347,7 +1387,6 @@
                            .in(Approve::getId,approveList.stream().map(m->m.getId()).collect(Collectors.toList())));
                }
                /**开启下一级别的数据为待审核**/
                List<Approve> waitAuditList = approveJoinMapper.selectJoinList(Approve.class,
                        new MPJLambdaWrapper<Approve>()
                                .selectAll(Approve.class)
@@ -1383,13 +1422,17 @@
//                }
            }else if(approve.getApproveType().equals(Constants.ONE)){
                //会签 ä¸”终审
                if(!Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ZERO)){
                    //标记钉钉通知自己已处理
                    dealDDToDo = true;
                }
                //无他人审批的情况 åˆ™ä¿®æ”¹æ•°æ®çŠ¶æ€
                if(Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ONE)){
                    dealBusinessBean = true;
                }else{
                    if(Constants.equalsInteger(approveList.size(),Constants.ZERO)&&Constants.equalsInteger(approve.getIsEndCheck(),Constants.ZERO)){
                        /**开启下一级别的数据为待审核**/
                        List<Approve> waitAuditList = approveJoinMapper.selectJoinList(Approve.class,
                                new MPJLambdaWrapper<Approve>()
                                        .selectAll(Approve.class)
@@ -1419,6 +1462,7 @@
                        List<String> memberPhone = waitAuditList.stream().filter(i->StringUtils.isNotBlank(i.getMemberPhone())).map(i->i.getMemberPhone()).collect(Collectors.toList());
                        List<String> openIdList =waitAuditList.stream().filter(i->StringUtils.isNotBlank(i.getSystemOpenid())).map(i->i.getSystemOpenid()).collect(Collectors.toList());
                        this.sendNextLvSms(approve,approveDTO,memberPhone,openIdList);
                    }
@@ -1428,7 +1472,7 @@
//                    }
                }
            }
            this.passNextNotices(dealBusinessBean,notices,approve,approveList,approveCopyList,approveDTO);
            this.passNextNotices(dealBusinessBean,notices,approve,approveList,approveCopyList,approveDTO,dealDDToDo);
        }
        //处理业务数据
        if(dealBusinessBean){
@@ -1442,6 +1486,12 @@
    public void sendNextLvSms(Approve approve ,ApproveDTO approveDTO , List<String> memberPhone ,List<String> openIdList){
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        //物流车预约
        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                .in(Member::getPhone,memberPhone)
                .eq(Member::getIsdeleted,Constants.ZERO)
                .eq(Member::getStatus,Constants.ZERO)
                .isNotNull(Member::getErpId)
         );
        if(approveDTO.getObjType().equals(Constants.approveObjectType.reason)){
            SmsEmailServiceImpl.sendPlatformBookSms(systemDictDataBiz,
                    emayService,smsEmailMapper,smsConfigMapper,platformBooksMapper,approveDTO.getObjId(),
@@ -1468,9 +1518,15 @@
                    SmsConstants.carUseBookContent.carUseBookWaitAudit,
                    approveDTO.getCheckInfo(),memberPhone);
            //发送公众号通知
            if(CollectionUtils.isNotEmpty(openIdList)){
                CarUseBook carUseBook = carUseBookMapper.selectById(approve.getObjId());
                if(Objects.nonNull(carUseBook)){
            CarUseBook carUseBook = carUseBookMapper.selectJoinOne(CarUseBook.class,
                    new MPJLambdaWrapper<CarUseBook>()
                            .selectAll(CarUseBook.class)
                            .selectAs(Member::getName,CarUseBook::getMemberName)
                            .leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
                            .eq(CarUseBook::getId,approve.getObjId())
                            .last(" limit 1 ")
            );
            if(CollectionUtils.isNotEmpty(openIdList)&&Objects.nonNull(carUseBook)){
                    SystemUser systemUser = systemUserMapper.selectById(carUseBook.getCreator());
                    if(Objects.nonNull(systemUser)){
                        carUseBook.setMemberName(systemUser.getRealname());
@@ -1479,9 +1535,19 @@
                                wxNoticeConfigMapper,carUseBook,
                                WxPlatConstants.carUseBookContent.carUseBookWaitAudit, 
                                openIdList,1);
                    }
                }
                    }
            }
            //发送钉钉待办 å…¬åŠ¡è½¦ç”³è¯·
            if(Objects.nonNull(carUseBook)&&Objects.nonNull(memberList)){
                //标记当前审批人已完成
                dingTalk.updToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId());
                //TODO ç¼ºå°‘域名前缀内容
                String ddTalkId = dingTalk.toDoNotice(StringUtils.isNotBlank(carUseBook.getMemberName())?(carUseBook.getMemberName()+"提交的公务用车申请"):"公务车用车申请",
                        memberList.stream().map(i->i.getErpId()).collect(Collectors.toList()) ,
                        dingTalk.getToDoCarUseBookFiledInfo(carUseBook),"pages/staff/vehicle/sendACarDetail?id="+carUseBook.getId());
                carUseBookMapper.update(new UpdateWrapper<CarUseBook>().lambda()
                        .set(CarUseBook::getDdToDoId,ddTalkId).eq(CarUseBook::getId,carUseBook.getId()));
            }
        }else
            //访客申请/报备
            if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
@@ -1506,6 +1572,16 @@
                                openIdList
                        );
                    }
                    if(Objects.nonNull(visits)&&Objects.nonNull(memberList)){
                        //标记当前审批人已完成
                        dingTalk.updToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId());
                        //TODO ç¼ºå°‘域名前缀内容
                        String ddTalkId = dingTalk.toDoNotice(visits.getName()+"的访客申请",
                                memberList.stream().map(i->i.getErpId()).collect(Collectors.toList()) ,
                                dingTalk.getToDoVisitFiledInfo(visits),"pages/appointmentDetails/appointmentDetails?id="+visits.getId());
                        visitsMapper.update(new UpdateWrapper<Visits>().lambda()
                                .set(Visits::getDdToDoId,ddTalkId).eq(Visits::getId,visits.getId()));
                    }
                }
            }
@@ -1518,15 +1594,15 @@
     * @param dealBusinessBean  æ˜¯å¦éœ€è¦è¿›è¡Œæ›´æ–°ä¸šåŠ¡æ•°æ®çŠ¶æ€
     * @param approve  å®¡æ‰¹è®°å½•
     * @param approveList  åŒçº§å¾…审批数据
     * @param dealDDToDo  æ˜¯å¦å¤„理 å½“前审批信息人的钉钉的工作通知
     *
     */
    public void passNextNotices(Boolean dealBusinessBean,Notices notices,Approve approve,List<Approve> approveList,List<Approve> copyList,ApproveDTO approveDTO){
    public void passNextNotices(Boolean dealBusinessBean,Notices notices,Approve approve,List<Approve> approveList,List<Approve> copyList,ApproveDTO approveDTO,Boolean dealDDToDo){
        //未开启下一级时,操作后的待审批人
        String memberNames =notices.getParam5()
                .replaceAll(","+notices.getRemark(),"")
                .replaceAll(notices.getRemark()+",","")
                .replaceAll(notices.getRemark(),"");
        //1、修改自己的数据记录
        noticesJoinMapper.update(null,new UpdateWrapper<Notices>().lambda()
@@ -1607,6 +1683,30 @@
                }
            }
        }
        if(dealDDToDo){
            if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
                    ||approveDTO.getObjType().equals(Constants.approveObjectType.constructionVisit)
                    ||approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)) {
                Member member = memberMapper.selectById(approve.getChekorId());
                // è®¿å®¢ ä¸‰ç±»ä¸šåŠ¡æ•°æ®
                Visits visits = visitsMapper.selectById(approveDTO.getObjId());
                if(Objects.nonNull(member)&&Objects.nonNull(member.getErpId())
                        &&Objects.nonNull(visits)&&Objects.nonNull(visits.getDdToDoId())&&Objects.nonNull(visits.getDdBelongToUnionId())){
                    dingTalk.updUserToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId(),member.getErpId());
                }
            }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
                    Constants.approveObjectType.unCityUseCar)){
                Member member = memberMapper.selectById(approve.getChekorId());
                CarUseBook carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
                if(Objects.nonNull(member)&&Objects.nonNull(member.getErpId())
                        &&Objects.nonNull(carUseBook)&&Objects.nonNull(carUseBook.getDdToDoId())&&Objects.nonNull(carUseBook.getDdBelongToUnionId())){
                    dingTalk.updUserToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId(),member.getErpId());
                }
            }
        }
    }
@@ -1654,11 +1754,13 @@
    public void dealBusinessData(ApproveDTO approveDTO,Approve approve){
        WxPlatNotice wxPlatNotice = new WxPlatNotice();
        Visits visits = new Visits();
        CarUseBook carUseBook = new CarUseBook();
        if(approveDTO.getObjType().equals(Constants.approveObjectType.unConstructionVisit)
                ||approveDTO.getObjType().equals(Constants.approveObjectType.constructionVisit)
                ||approveDTO.getObjType().equals(Constants.approveObjectType.visitReporting)){
            // è®¿å®¢ ä¸‰ç±»ä¸šåŠ¡æ•°æ®
            Visits visits = visitsMapper.selectById(approveDTO.getObjId());
            visits = visitsMapper.selectById(approveDTO.getObjId());
            if(Objects.isNull(visits)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到申请记录");
            }
@@ -1762,12 +1864,25 @@
                            Arrays.asList(visits.getOpenid().split(","))
                    );
                }
                //钉钉通知 è®¿å®¢è¢«è®¿äººæˆ–报备提交人
                Member beVisitMember = memberMapper.selectById(Constants.equalsInteger(visits.getType(),Constants.TWO)?visits.getMemberId():visits.getReceptMemberId());
                if(Objects.nonNull(beVisitMember)&&StringUtils.isNotBlank(beVisitMember.getDdId())){
                    dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                            beVisitMember.getDdId(),
                            dingTalk.getVisitNoticeMsg(visits,visits.getName()+"的"+(Constants.equalsInteger(visits.getType(),Constants.TWO)?"访客报备":"访客申请")+","+
                                    (Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? "已审批通过":"已审批驳回"))
                    );
                }
            }
            if(StringUtils.isNotBlank(visits.getDdBelongToUnionId())
                    && StringUtils.isNotBlank(visits.getDdToDoId())){
                //标记当前钉钉审批已完成
                dingTalk.updToDoNoticeInfoStatus(visits.getDdBelongToUnionId(),visits.getDdToDoId());
            }
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.cityUseCar)||approveDTO.getObjType().equals(
                Constants.approveObjectType.unCityUseCar)){
            this.updDriver(approveDTO,approve,true);
            CarUseBook carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
            carUseBook = carUseBookJoinMapper.selectById(approveDTO.getObjId());
            if(Objects.nonNull(carUseBook)){
                SystemUser systemUser = systemUserMapper.selectById(carUseBook.getCreator());
                //发送通知短息
@@ -1787,6 +1902,20 @@
                            Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)?WxPlatConstants.carUseBookContent.carUseBookAuditSuccess: WxPlatConstants.carUseBookContent.carUseBookAuditFail,
                            Arrays.asList(systemUser.getOpenid().split(",")),0);
                }
            }
            //钉钉通知发起人
            Member creatMember = memberMapper.selectById(carUseBook.getMemberId());
            if(Objects.nonNull(creatMember)&&StringUtils.isNotBlank(creatMember.getDdId())){
                dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                        creatMember.getErpId(),
                                dingTalk.getCarUseNoticeMsg(carUseBook,carUseBook.getMemberName() + "提交的公务用车,"+
                                        (Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)? "已审批通过":"已审批驳回"))
                );
            }
            if(StringUtils.isNotBlank(carUseBook.getDdBelongToUnionId())
                && StringUtils.isNotBlank(carUseBook.getDdToDoId())){
                //标记当前钉钉审批已完成
                dingTalk.updToDoNoticeInfoStatus(carUseBook.getDdBelongToUnionId(),carUseBook.getDdToDoId());
            }
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.reason)){
@@ -1862,13 +1991,33 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(Constants.equalsInteger(approveDTO.getStatus(),Constants.TWO)){
            //处理通过 æ˜¾ç¤ºæ‰€æœ‰çš„æŠ„送记录
            approveMapper.update(null,new UpdateWrapper<Approve>().lambda().set(Approve::getStatus,Constants.TWO)
                    .set(Approve::getCheckDate,new Date())
                    .eq(Approve::getObjId,approve.getObjId())
            List<Approve> approveList = approveMapper.selectList(new QueryWrapper<Approve>().lambda().eq(Approve::getObjId,approve.getObjId())
                    .eq(Approve::getObjType,approve.getObjType())
                    .eq(Approve::getType,Constants.ONE)
            );
                    .eq(Approve::getType,Constants.ONE));
            if(CollectionUtils.isNotEmpty(approveList)){
                //处理通过 æ˜¾ç¤ºæ‰€æœ‰çš„æŠ„送记录
                approveMapper.update(null,new UpdateWrapper<Approve>().lambda().set(Approve::getStatus,Constants.TWO)
                        .set(Approve::getCheckDate,new Date())
                        .eq(Approve::getObjId,approve.getObjId())
                        .eq(Approve::getObjType,approve.getObjType())
                        .eq(Approve::getType,Constants.ONE)
                );
                List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
                        .eq(Member::getIsdeleted,Constants.ZERO)
                        .eq(Member::getStatus,Constants.ZERO)
                        .isNotNull(Member::getDdId)
                        .in(Member::getId,approveList.stream().map(i->i.getChekorId()).collect(Collectors.toList())));
                if(CollectionUtils.isNotEmpty(memberList)){
                    if(Objects.nonNull(visits)||Objects.nonNull(carUseBook)){
                        dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                                StringUtils.join(memberList.stream().map(i->i.getDdId()).collect(Collectors.toList()),","),
                                Objects.nonNull(visits)?
                                        dingTalk.getVisitNoticeMsg(visits,visits.getName()+"的"+(Constants.equalsInteger(visits.getType(),Constants.TWO)?"访客报备":"访客申请")+",抄送给您,请知晓"):
                                        dingTalk.getCarUseNoticeMsg(carUseBook,carUseBook.getMemberName() + "提交的公务用车,抄送给您,请知晓")
                        );
                    }
                }
            }
        }
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.dao.*;
import com.doumee.dao.business.vo.GeneralDataVO;
@@ -98,6 +99,9 @@
    @Autowired
    private ApproveMapper approveMapper;
    @Autowired
    private DingTalk dingTalk;
    @Override
@@ -247,6 +251,13 @@
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(checkUser.getOpenid().split(",")));
        }
        if(StringUtils.isNotBlank(member.getDdId())){
            dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                    member.getDdId(),
                    dingTalk.getHiddenDangerNoticeMsg(hiddenDanger));
        }
        return hiddenDanger.getId();
    }
@@ -794,6 +805,13 @@
                    systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_ACCESS_TOKEN).getCode(),
                    Arrays.asList(checkUser.getOpenid().split(",")));
        }
        if(StringUtils.isNotBlank(member.getDdId())){
            dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                    member.getDdId(),
                    dingTalk.getHiddenDangerNoticeMsg(hiddenDanger));
        }
    }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetGridServiceImpl.java
@@ -1,20 +1,33 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dto.OptGridDTO;
import com.doumee.dao.business.dto.CloseGridDTO;
import com.doumee.dao.business.dto.GetDriverGridDTO;
import com.doumee.dao.business.dto.OpenGridDriverDTO;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkCabinetGridMapper;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.doumee.service.business.JkCabinetGridService;
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.third.model.PageWrap;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
 * é’¥åŒ™æŸœæŸœæ ¼åŸºæœ¬ä¿¡æ¯è¡¨Service实现
@@ -26,6 +39,16 @@
    @Autowired
    private JkCabinetGridMapper jkCabinetGridMapper;
    @Autowired
    private JkKeysMapper jkKeysMapper;
    @Autowired
    private JkCabinetMapper jkCabinetMapper;
    @Autowired
    private JkCabinetLogMapper jkCabinetLogMapper;
    @Override
    public Integer create(JkCabinetGrid jkCabinetGrid) {
@@ -54,7 +77,47 @@
    @Override
    public void updateById(JkCabinetGrid jkCabinetGrid) {
        jkCabinetGridMapper.updateById(jkCabinetGrid);
        if(Objects.isNull(jkCabinetGrid)
                || Objects.isNull(jkCabinetGrid.getId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = jkCabinetGrid.getLoginUserInfo();
        JkCabinetGrid model = jkCabinetGridMapper.selectById(jkCabinetGrid.getId());
        if(Objects.isNull(model)|| Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
            if(Objects.nonNull(model.getKeyId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已绑定,请勿重复绑定");
            }
            JkKeys keysModel = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
            if(Objects.isNull(keysModel)|| Constants.equalsInteger(keysModel.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
            if(!Constants.equalsInteger(keysModel.getStatus(), (Constants.ZERO))){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙已被绑定,请选择其他钥匙绑定");
            }
            //更新钥匙柜信息
            jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
                    .set(JkCabinetGrid::getKeyId,jkCabinetGrid.getKeyId())
                    .set(JkCabinetGrid::getEditor,loginUserInfo.getId())
                    .set(JkCabinetGrid::getEditDate,DateUtil.getCurrDateTime())
                    .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
                    .eq(JkCabinetGrid::getId,jkCabinetGrid.getId()));
            //标记钥匙信息
            jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
                    .set(JkKeys::getStatus,Constants.ONE)
                    .eq(JkKeys::getId,jkCabinetGrid.getKeyId())
            );
            return;
        }else if(Objects.nonNull(jkCabinetGrid.getChannelCode())||Objects.nonNull(jkCabinetGrid.getBoardCode())){
            jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
                    .set(Objects.nonNull(jkCabinetGrid.getChannelCode()),JkCabinetGrid::getChannelCode,jkCabinetGrid.getChannelCode())
                    .set(Objects.nonNull(jkCabinetGrid.getBoardCode()),JkCabinetGrid::getBoardCode,jkCabinetGrid.getBoardCode())
                    .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
                    .eq(JkCabinetGrid::getId,jkCabinetGrid.getId()));
        }
    }
    @Override
@@ -87,57 +150,25 @@
    @Override
    public PageData<JkCabinetGrid> findPage(PageWrap<JkCabinetGrid> pageWrap) {
        IPage<JkCabinetGrid> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkCabinetGrid> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getId, pageWrap.getModel().getId());
        JkCabinetGrid model = pageWrap.getModel();
        MPJLambdaWrapper<JkCabinetGrid> wrapper = new MPJLambdaWrapper<JkCabinetGrid>()
                .selectAll(JkCabinetGrid.class)
                .selectAs(JkCabinet::getName,JkCabinetGrid::getCabinetName)
                .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(Objects.nonNull(model.getCabinetId()),JkCabinetGrid::getCabinetId,model.getCabinetId())
                .eq(Objects.nonNull(model.getStatus()),JkCabinetGrid::getStatus,model.getStatus())
                .isNull(Objects.nonNull(model.getBindStatus())&&Constants.equalsInteger(model.getBindStatus(),Constants.ZERO),JkCabinetGrid::getKeyId)
                .isNotNull(Objects.nonNull(model.getBindStatus())&&Constants.equalsInteger(model.getBindStatus(),Constants.ONE),JkCabinetGrid::getKeyId)
                .like(StringUtils.isNotBlank(model.getKeyCode()),JkKeys::getCode,model.getKeyCode());
        IPage<JkCabinetGrid> iPage = jkCabinetGridMapper.selectJoinPage(page,JkCabinetGrid.class,wrapper);
        for (JkCabinetGrid jkCabinetGrid:iPage.getRecords()) {
            jkCabinetGrid.setBindStatus(Objects.isNull(jkCabinetGrid.getKeyId())?Constants.ZERO:Constants.ONE);
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkCabinetGrid::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkCabinetGrid::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkCabinetGrid::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkCabinetGrid::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCabinetId() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getCabinetId, pageWrap.getModel().getCabinetId());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getKeyId() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getKeyId, pageWrap.getModel().getKeyId());
        }
        if (pageWrap.getModel().getSerialNo() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getSerialNo, pageWrap.getModel().getSerialNo());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getWorkingStatus() != null) {
            queryWrapper.lambda().eq(JkCabinetGrid::getWorkingStatus, pageWrap.getModel().getWorkingStatus());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkCabinetGridMapper.selectPage(page, queryWrapper));
        return PageData.from(iPage);
    }
    @Override
@@ -145,4 +176,332 @@
        QueryWrapper<JkCabinetGrid> wrapper = new QueryWrapper<>(jkCabinetGrid);
        return jkCabinetGridMapper.selectCount(wrapper);
    }
    @Override
    public void updateStatusById(JkCabinetGrid jkCabinetGrid) {
        if(Objects.isNull(jkCabinetGrid)
                || Objects.isNull(jkCabinetGrid.getId())
                || Objects.isNull(jkCabinetGrid.getStatus())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        jkCabinetGridMapper.update(null,new UpdateWrapper<JkCabinetGrid>()
                .lambda().set(JkCabinetGrid::getStatus,jkCabinetGrid.getStatus())
                .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
                .eq(JkCabinetGrid::getId,jkCabinetGrid.getId()));
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void unBindKeys(List<Integer> idList){
        if(CollectionUtils.isEmpty(idList)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(idList.size()==Constants.ONE){
            JkCabinetGrid model = jkCabinetGridMapper.selectById(idList.get(Constants.ZERO));
            if(Objects.isNull(model)|| Constants.equalsInteger(model.getIsdeleted(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
            if(Objects.isNull(model.getKeyId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前规格未绑定钥匙,请刷新查看");
            }else{
                //更新钥匙柜信息
                jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
                        .set(JkCabinetGrid::getKeyId,null)
                        .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
                        .eq(JkCabinetGrid::getId,model.getId()));
                JkKeys keysModel = jkKeysMapper.selectById(model.getKeyId());
                if(Objects.nonNull(keysModel) && !Constants.equalsInteger(keysModel.getStatus(),Constants.ZERO)){
                    jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
                            .set(JkKeys::getStatus,Constants.ZERO)
                            .eq(JkKeys::getId,keysModel.getId())
                    );
                }
            }
        }else{
            List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda()
                            .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                            .isNotNull(JkCabinetGrid::getKeyId)
                    .in(JkCabinetGrid::getId,idList));
            if(CollectionUtils.isNotEmpty(jkCabinetGridList)){
                jkCabinetGridMapper.update(new UpdateWrapper<JkCabinetGrid>().lambda()
                        .set(JkCabinetGrid::getKeyId,null)
                        .set(JkCabinetGrid::getEditDate, DateUtil.getCurrDateTime())
                        .eq(JkCabinetGrid::getId,jkCabinetGridList.stream().map(i->i.getId()).collect(Collectors.toList())));
                List<Integer> keyIdList = jkCabinetGridList.stream().filter(i->Objects.nonNull(i.getKeyId())).map(i->i.getKeyId()).collect(Collectors.toList());
                if(CollectionUtils.isNotEmpty(keyIdList)){
                    jkKeysMapper.update(new UpdateWrapper<JkKeys>().lambda()
                            .set(JkKeys::getStatus,Constants.ZERO)
                            .in(JkKeys::getId,keyIdList)
                    );
                }
            }
        }
    }
    /**
     * æ ‡è®°æ•…éšœ
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void markFault(OptGridDTO dto){
        if(Objects.isNull(dto)
                || Objects.isNull(dto.getCabinetId())
                || CollectionUtils.isEmpty(dto.getGridIdList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                .in(JkCabinetGrid::getId,dto.getGridIdList())
        );
        if(CollectionUtils.isEmpty(jkCabinetGridList)){
            return;
        }
        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
            jkCabinetGrid.setEditor(loginUserInfo.getId());
            jkCabinetGrid.setEditDate(new Date());
            jkCabinetGrid.setWorkingStatus(Constants.ONE);
            jkCabinetGridMapper.updateById(jkCabinetGrid);
        }
    }
    /**
     * æ ‡è®°ç»´ä¿®ä¿å…»
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void markRepair(OptGridDTO dto){
        if(Objects.isNull(dto)
                || Objects.isNull(dto.getCabinetId())
                || CollectionUtils.isEmpty(dto.getGridIdList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                        .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                        .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkKeys::getStatus,Constants.ONE)
                .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                .isNotNull(JkCabinetGrid::getKeyId)
                .in(JkCabinetGrid::getId,dto.getGridIdList())
        );
        if(CollectionUtils.isEmpty(jkCabinetGridList)){
            return;
        }
        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
            jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
                    .set(JkKeys::getEditDate,DateUtil.getCurrDateTime())
                    .set(JkKeys::getStatus,Constants.TWO)
                    .eq(JkKeys::getId,jkCabinetGrid.getKeyId())
            );
        }
    }
    /**
     * å–消故障
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void cancelFault(OptGridDTO dto){
        if(Objects.isNull(dto)
                || Objects.isNull(dto.getCabinetId())
                || CollectionUtils.isEmpty(dto.getGridIdList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getWorkingStatus,Constants.ONE)
                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                .in(JkCabinetGrid::getId,dto.getGridIdList())
        );
        if(CollectionUtils.isEmpty(jkCabinetGridList)){
            return;
        }
        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
        for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
            jkCabinetGrid.setEditor(loginUserInfo.getId());
            jkCabinetGrid.setEditDate(new Date());
            jkCabinetGrid.setWorkingStatus(Constants.ZERO);
            jkCabinetGridMapper.updateById(jkCabinetGrid);
        }
    }
    /**
     * è®¾å¤‡ç®¡ç†å‘˜æ‰¹é‡å¼€é”
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void batchOpenGridAdmin(OptGridDTO dto){
        if(Objects.isNull(dto)
        || Objects.isNull(dto.getCabinetId())
        || CollectionUtils.isEmpty(dto.getGridIdList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                .in(JkCabinetGrid::getId,dto.getGridIdList())
        );
        if(CollectionUtils.isEmpty(jkCabinetGridList)){
            return;
        }
        LoginUserInfo loginUserInfo = dto.getLoginUserInfo();
        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(jkCabinetGridList)){
            List<JkCabinetLog> jkCabinetLogs = new ArrayList<>();
            for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
                JkCabinetLog jkCabinetLog = new JkCabinetLog();
                jkCabinetLog.setCreateDate(new Date());
                jkCabinetLog.setCreator(loginUserInfo.getId());
                jkCabinetLog.setIsdeleted(Constants.ZERO);
                jkCabinetLog.setCabinetId(dto.getCabinetId());
                jkCabinetLog.setGridId(jkCabinetGrid.getId());
                jkCabinetLog.setAuthType(Constants.TWO);
                jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
                if(Objects.nonNull(jkCabinetGrid.getKeyId())){
                    JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
                    if(Objects.nonNull(jkKeys)){
                        if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
                            jkCabinetLog.setCarId(jkKeys.getCarId());
                            jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
                        }
                        jkCabinetLog.setRoleType(jkKeys.getRoleType());
                    }
                }
                jkCabinetLog.setType(Constants.ZERO);
                jkCabinetLogs.add(jkCabinetLog);
            }
            jkCabinetLogMapper.insert(jkCabinetLogs);
        }
    }
    /**
     * é’¥åŒ™æŸœå…³é—¨
     */
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void closeGrid(CloseGridDTO dto){
        if(Objects.isNull(dto)
            || Objects.isNull(dto.getGridId())
            || Objects.isNull(dto.getCabinetId())
            || Objects.isNull(dto.getKeyStatus())
            || Objects.isNull(dto.getAuthType())
            || Objects.isNull(dto.getMemberId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                .eq(JkCabinetGrid::getId,dto.getGridId())
                .last(" limit 1 ")
        );
        if(Objects.isNull(jkCabinetGrid)){
            return;
        }
        JkCabinetLog jkCabinetLog = new JkCabinetLog();
        jkCabinetLog.setCreateDate(new Date());
        jkCabinetLog.setIsdeleted(Constants.ZERO);
        jkCabinetLog.setCabinetId(dto.getCabinetId());
        jkCabinetLog.setGridId(jkCabinetGrid.getId());
        jkCabinetLog.setAuthType(dto.getAuthType());
        jkCabinetLog.setMemberId(dto.getMemberId());
        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
            //只有钥匙柜绑定了钥匙信息 æ‰ä¼šæ›´æ–°é’¥åŒ™çš„信息
            JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
            if(Objects.nonNull(jkKeys)){
                if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
                    jkCabinetLog.setCarId(jkKeys.getCarId());
                    jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
                }
                jkCabinetLog.setRoleType(jkKeys.getRoleType());
                //钥匙状态与当前操作状态不一致,则进行更新钥匙状态
                if(!Constants.equalsInteger(jkKeys.getStatus(),dto.getKeyStatus())){
                    jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
                            .set(JkKeys::getEditDate,DateUtil.getCurrDateTime())
                            .set(JkKeys::getStatus,dto.getKeyStatus())
                            .eq(JkKeys::getId,jkKeys.getId())
                    );
                }
            }
        }
        jkCabinetLog.setType(Constants.ONE);
        jkCabinetLogMapper.insert(jkCabinetLog);
    }
    /**
     * å¸æœºèŽ·å–å¯æ“ä½œçš„é’¥åŒ™æŸœæŸœæ ¼
     */
    @Override
    public List<JkCabinetGrid> getDriverGrid(GetDriverGridDTO dto){
        if(Objects.isNull(dto.getCabinetId())
            || Objects.isNull(dto.getCabinetId())
            || Objects.isNull(dto.getMemberId())
            || Objects.isNull(dto.getType())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class,
                new MPJLambdaWrapper<JkCabinetGrid>().selectAll(JkCabinetGrid.class)
                        .selectAs(JkKeys::getCode,JkCabinetGrid::getKeyCode)
                        .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                        .selectAs(JkKeys::getCarId,JkCabinetGrid::getCarId)
                        .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                        .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                        .eq(JkCabinetGrid::getWorkingStatus,Constants.ZERO)
                        .eq(JkCabinetGrid::getCabinetId,dto.getCabinetId())
                        .in(Constants.equalsInteger(dto.getType(),Constants.ONE),JkKeys::getStatus,Constants.TWO,Constants.THREE)
                        .in(Constants.equalsInteger(dto.getType(),Constants.ZERO),JkKeys::getStatus,Constants.ONE)
                        .isNotNull(JkCabinetGrid::getKeyId)
                        .apply(" t1.car_id in ( select c.CAR_ID from car_driver c left join cars c1 on c.car_id = c1.id  where c.ISDELETED = 0 and c.TYPE != 0 and   c.MEMBER_ID = "+dto.getMemberId()+" ) ")
        );
        return jkCabinetGridList;
    }
    /**
     * å¸æœºå¼€å¯æŸœæ ¼
     * @param openGridDriverDTO
     */
    @Override
    public void openGridDriver(OpenGridDriverDTO openGridDriverDTO){
        JkCabinetGrid jkCabinetGrid = jkCabinetGridMapper.selectOne(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,openGridDriverDTO.getCabinetId())
                .eq(JkCabinetGrid::getId,openGridDriverDTO.getGridId())
                .last(" limit 1 ")
        );
        if(Objects.isNull(jkCabinetGrid)){
            return;
        }
        LoginUserInfo loginUserInfo = openGridDriverDTO.getLoginUserInfo();
        List<JkCabinetLog> jkCabinetLogs = new ArrayList<>();
        JkCabinetLog jkCabinetLog = new JkCabinetLog();
        jkCabinetLog.setCreateDate(new Date());
        jkCabinetLog.setCreator(loginUserInfo.getId());
        jkCabinetLog.setIsdeleted(Constants.ZERO);
        jkCabinetLog.setCabinetId(openGridDriverDTO.getCabinetId());
        jkCabinetLog.setGridId(jkCabinetGrid.getId());
        jkCabinetLog.setAuthType(openGridDriverDTO.getAuthType());
        jkCabinetLog.setMemberId(loginUserInfo.getMemberId());
        jkCabinetLog.setType(Constants.ZERO);
        if(Objects.nonNull(jkCabinetGrid.getKeyId())){
            JkKeys jkKeys = jkKeysMapper.selectById(jkCabinetGrid.getKeyId());
            if(Objects.nonNull(jkKeys)){
                if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
                    jkCabinetLog.setCarId(jkKeys.getCarId());
                    jkCabinetLog.setKeyInfo(jkKeys.getCarCode() + "_" + jkKeys.getCode() );
                }
                jkCabinetLog.setRoleType(jkKeys.getRoleType());
            }
        }
        jkCabinetLogMapper.insert(jkCabinetLogs);
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java
@@ -1,20 +1,24 @@
package com.doumee.service.business.impl;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.JkCabinetLogMapper;
import com.doumee.dao.business.model.JkCabinetLog;
import com.doumee.service.business.JkCabinetLogService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
 * é’¥åŒ™æŸœå¼€å…³é—¨è®°å½•Service实现
@@ -87,66 +91,34 @@
    @Override
    public PageData<JkCabinetLog> findPage(PageWrap<JkCabinetLog> pageWrap) {
        IPage<JkCabinetLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkCabinetLog> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkCabinetLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkCabinetLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkCabinetLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkCabinetLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCabinetId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getCabinetId, pageWrap.getModel().getCabinetId());
        }
        if (pageWrap.getModel().getGridId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getGridId, pageWrap.getModel().getGridId());
        }
        if (pageWrap.getModel().getAuthType() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getAuthType, pageWrap.getModel().getAuthType());
        }
        if (pageWrap.getModel().getCarId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getCarId, pageWrap.getModel().getCarId());
        }
        if (pageWrap.getModel().getKeyId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getKeyId, pageWrap.getModel().getKeyId());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getKeyInfo() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getKeyInfo, pageWrap.getModel().getKeyInfo());
        }
        if (pageWrap.getModel().getRoleType() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getRoleType, pageWrap.getModel().getRoleType());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkCabinetLog::getStatus, pageWrap.getModel().getStatus());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        JkCabinetLog model = pageWrap.getModel();
        MPJLambdaWrapper<JkCabinetLog> wrapper = new MPJLambdaWrapper<JkCabinetLog>()
                .selectAll(JkCabinetLog.class)
                .selectAs(Member::getName,JkCabinetLog::getMemberName)
                .selectAs(Company::getName,JkCabinetLog::getCompanyName)
                .selectAs(JkCabinet::getName,JkCabinetLog::getCabinetName)
                .selectAs(JkCabinetGrid::getCode,JkCabinetLog::getGridCode)
                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetLog::getCabinetId)
                .leftJoin(JkCabinetGrid.class,JkCabinetGrid::getId,JkCabinetLog::getGridId)
                .leftJoin(Member.class,Member::getId,JkCabinetLog::getMemberId)
                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                .ge(Objects.nonNull(model.getStartDate()),JkCabinetLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getStartDate()))
                .le(Objects.nonNull(model.getEndDate()),JkCabinetLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getEndDate()))
                .like(StringUtils.isNotBlank(model.getMemberName()),Member::getName,model.getMemberName())
                .eq(Objects.nonNull(model.getCabinetId()),JkCabinetLog::getCabinetId,model.getCabinetId())
                .eq(Objects.nonNull(model.getKeyId()),JkCabinetLog::getKeyId,model.getKeyId())
                .eq(Objects.nonNull(model.getAuthType()),JkCabinetLog::getAuthType,model.getAuthType())
                .eq(Objects.nonNull(model.getStatus()),JkCabinetLog::getStatus,model.getStatus())
                .eq(JkCabinetLog::getIsdeleted, Constants.ZERO)
                .orderByDesc(JkCabinetLog::getCreateDate);
        IPage<JkCabinetLog>  iPage = jkCabinetLogMapper.selectJoinPage(page,JkCabinetLog.class,wrapper);
        for (JkCabinetLog jkCabinetLog:iPage.getRecords()) {
            if(StringUtils.isNotBlank(jkCabinetLog.getCompanyName())&&StringUtils.isNotBlank(jkCabinetLog.getMemberName())){
                jkCabinetLog.setMemberName(jkCabinetLog.getMemberName() + " - " + jkCabinetLog.getCompanyName() );
            }
        }
        return PageData.from(jkCabinetLogMapper.selectPage(page, queryWrapper));
        return PageData.from(iPage);
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
@@ -1,5 +1,21 @@
package com.doumee.service.business.impl;
import cn.hutool.core.bean.BeanUtil;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.JkCabinetGridMapper;
import com.doumee.dao.business.JkKeysMapper;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.doumee.dao.business.model.JkKeys;
import com.doumee.dao.business.vo.AdminCabinetVO;
import com.doumee.dao.business.vo.CabinetConfigDataVO;
import com.doumee.dao.business.vo.CabinetDetailVO;
import com.doumee.dao.business.vo.CabinetGridInfoVO;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -10,11 +26,18 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.java.Log;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.transaction.annotation.Transactional;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
 * é’¥åŒ™æŸœåŸºæœ¬ä¿¡æ¯è¡¨Service实现
@@ -27,15 +50,121 @@
    @Autowired
    private JkCabinetMapper jkCabinetMapper;
    @Autowired
    private JkCabinetGridMapper jkCabinetGridMapper;
    @Autowired
    private JkKeysMapper jkKeysMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public Integer create(JkCabinet jkCabinet) {
        if(Objects.isNull(jkCabinet)
            || StringUtils.isBlank(jkCabinet.getCode())
            || StringUtils.isBlank(jkCabinet.getName())
            || StringUtils.isBlank(jkCabinet.getDevId())
            || StringUtils.isBlank(jkCabinet.getLinkAddr())
            || StringUtils.isBlank(jkCabinet.getCode())
            || Objects.isNull(jkCabinet.getPort())
            || CollectionUtils.isEmpty(jkCabinet.getManagerIdList())
            || CollectionUtils.isEmpty(jkCabinet.getAuthMemberIdList())
            || Objects.isNull(jkCabinet.getDoubleAuth())
            || Objects.isNull(jkCabinet.getRowNum())
            || jkCabinet.getRowNum() <= Constants.ZERO
            || Objects.isNull(jkCabinet.getColumnNum())
            || jkCabinet.getColumnNum() <= Constants.ZERO
            || Objects.isNull(jkCabinet.getNoType())
            || Objects.isNull(jkCabinet.getSortType())
            || (
                Constants.equalsInteger(jkCabinet.getNoType(),Constants.ONE)
                && ( Objects.isNull(jkCabinet.getNoIndex()) || Objects.isNull(jkCabinet.getNoLength()) || StringUtils.isBlank(jkCabinet.getNoPrefix()) )
                )
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询编号是否重复
        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().eq(JkCabinet::getCode,jkCabinet.getCode()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙柜设备编号已存在!");
        }
        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().eq(JkCabinet::getDevId,jkCabinet.getDevId()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙柜设备ID已存在!");
        }
        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
        jkCabinet.setCreateDate(new Date());
        jkCabinet.setEditDate(jkCabinet.getCreateDate());
        jkCabinet.setCreator(loginUserInfo.getId());
        jkCabinet.setEditor(loginUserInfo.getId());
        jkCabinet.setIsdeleted(Constants.ZERO);
        jkCabinet.setStatus(Constants.ZERO);
        jkCabinet.setRunStatus(Constants.ONE);
        if(StringUtils.isNotBlank(jkCabinet.getJwd())&&jkCabinet.getJwd().split(",").length>Constants.ONE){
            jkCabinet.setLongitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ZERO]));
            jkCabinet.setLatitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ONE]));
        }
        jkCabinet.setManagerId(String.join(",",jkCabinet.getManagerIdList()));
        jkCabinet.setAuthMemberId(String.join(",",jkCabinet.getAuthMemberIdList()));
        jkCabinetMapper.insert(jkCabinet);
        this.createGrid(jkCabinet);
        return jkCabinet.getId();
    }
    public void createGrid(JkCabinet jkCabinet){
        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
        Integer startNo =  Constants.equalsInteger(jkCabinet.getNoType(),Constants.ZERO)?1:jkCabinet.getNoIndex() ;
        List<JkCabinetGrid> jkCabinetGridList = new ArrayList<>();
        Integer maxNum = jkCabinet.getRowNum() * jkCabinet.getColumnNum();
        for (int i = 0; i < maxNum; i++) {
            JkCabinetGrid grid = new JkCabinetGrid();
            grid.setCreateDate(new Date());
            grid.setEditDate(jkCabinet.getCreateDate());
            grid.setCreator(loginUserInfo.getId());
            grid.setEditor(loginUserInfo.getId());
            grid.setIsdeleted(Constants.ZERO);
            grid.setStatus(Constants.ZERO);
            grid.setCabinetId(jkCabinet.getId());
            if(Constants.equalsInteger(jkCabinet.getNoType(),Constants.ZERO)){
                grid.setCode(StringUtils.leftPad(startNo.toString(),maxNum.toString().length()+1,"0"));
            }else{
                grid.setCode(jkCabinet.getNoPrefix() +  StringUtils.leftPad(startNo.toString(),jkCabinet.getNoLength(),"0"));
            }
            jkCabinetGridList.add(grid);
            startNo = startNo + 1;
        }
        jkCabinetGridMapper.insert(jkCabinetGridList);
    }
    @Override
    public void deleteById(Integer id) {
        jkCabinetMapper.deleteById(id);
        JkCabinet jkCabinet = jkCabinetMapper.selectById(id);
        if(Constants.equalsInteger(jkCabinet.getStatus(),Constants.ZERO)){
           throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非禁用数据,无法进行删除");
        }
        //查询钥匙柜下的柜格信息
        List<JkCabinetGrid> jkCabinetGridList = jkCabinetGridMapper.selectList(new QueryWrapper<JkCabinetGrid>().lambda().eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,jkCabinet.getId())
        );
        if(Objects.nonNull(jkCabinetGridList)){
            jkCabinetGridMapper.update(null,new UpdateWrapper<JkCabinetGrid>().lambda().set(JkCabinetGrid::getIsdeleted,Constants.ONE)
                    .in(JkCabinetGrid::getId,jkCabinetGridList.stream().map(i->i.getId()).collect(Collectors.toList()))
            );
            List<Integer> keyIdList = jkCabinetGridList.stream().filter(i->Objects.nonNull(i.getKeyId())).map(i->i.getKeyId()).collect(Collectors.toList());
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(keyIdList)){
                jkKeysMapper.update(null,new UpdateWrapper<JkKeys>().lambda()
                        .set(JkKeys::getStatus,Constants.ZERO)
                        .in(JkKeys::getId,keyIdList)
                );
            }
        }
        jkCabinetMapper.update(null,new UpdateWrapper<JkCabinet>().lambda()
                .set(JkCabinet::getIsdeleted,Constants.ONE)
                .eq(JkCabinet::getId,jkCabinet.getId()));
    }
    @Override
@@ -54,8 +183,59 @@
    @Override
    public void updateById(JkCabinet jkCabinet) {
        if(Objects.isNull(jkCabinet)
                || Objects.isNull(jkCabinet.getId())
                || StringUtils.isBlank(jkCabinet.getCode())
                || StringUtils.isBlank(jkCabinet.getName())
                || StringUtils.isBlank(jkCabinet.getDevId())
                || StringUtils.isBlank(jkCabinet.getLinkAddr())
                || StringUtils.isBlank(jkCabinet.getCode())
                || CollectionUtils.isEmpty(jkCabinet.getManagerIdList())
                || CollectionUtils.isEmpty(jkCabinet.getAuthMemberIdList())
                || Objects.isNull(jkCabinet.getPort())
                || Objects.isNull(jkCabinet.getDoubleAuth())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        jkCabinet.setRowNum(null);
        jkCabinet.setColumnNum(null);
        jkCabinet.setSortType(null);
        jkCabinet.setNoType(null);
        jkCabinet.setNoIndex(null);
        jkCabinet.setNoLength(null);
        jkCabinet.setNoPrefix(null);
        //查询编号是否重复
        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().ne(JkCabinet::getId,jkCabinet.getId()).eq(JkCabinet::getCode,jkCabinet.getCode()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙柜设备编号已存在!");
        }
        if(jkCabinetMapper.selectCount(new QueryWrapper<JkCabinet>().lambda().ne(JkCabinet::getId,jkCabinet.getId()).eq(JkCabinet::getDevId,jkCabinet.getDevId()).eq(JkCabinet::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙柜设备ID已存在!");
        }
        LoginUserInfo loginUserInfo = jkCabinet.getLoginUserInfo();
        jkCabinet.setEditDate(new Date());
        jkCabinet.setEditor(loginUserInfo.getId());
        if(StringUtils.isNotBlank(jkCabinet.getJwd())&&jkCabinet.getJwd().split(",").length>Constants.ONE){
            jkCabinet.setLongitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ZERO]));
            jkCabinet.setLatitude(new BigDecimal(jkCabinet.getJwd().split(",")[Constants.ONE]));
        }
        jkCabinet.setManagerId(String.join(",",jkCabinet.getManagerIdList()));
        jkCabinet.setAuthMemberId(String.join(",",jkCabinet.getAuthMemberIdList()));
        jkCabinetMapper.updateById(jkCabinet);
    }
    @Override
    public void updateStatusById(JkCabinet jkCabinet) {
        if(Objects.isNull(jkCabinet)
        || Objects.isNull(jkCabinet.getId())
        || Objects.isNull(jkCabinet.getStatus())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        jkCabinetMapper.update(null,new UpdateWrapper<JkCabinet>()
                .lambda().set(JkCabinet::getStatus,jkCabinet.getStatus())
                .set(JkCabinet::getEditDate, DateUtil.getCurrDateTime())
                .eq(JkCabinet::getId,jkCabinet.getId()));
    }
    @Override
    public void updateByIdInBatch(List<JkCabinet> jkCabinets) {
@@ -72,6 +252,18 @@
        return jkCabinetMapper.selectById(id);
    }
    @Override
    public JkCabinet getDetail(Integer id){
        JkCabinet jkCabinet = jkCabinetMapper.selectById(id);
        if(Objects.nonNull(jkCabinet.getLongitude())
            && Objects.nonNull(jkCabinet.getLatitude())){
            jkCabinet.setJwd(jkCabinet.getLongitude() + "," + jkCabinet.getLatitude());
        }
        jkCabinet.setGridNum(jkCabinet.getColumnNum()*jkCabinet.getRowNum());
        return jkCabinet;
    }
    @Override
    public JkCabinet findOne(JkCabinet jkCabinet) {
        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
@@ -80,6 +272,8 @@
    @Override
    public List<JkCabinet> findList(JkCabinet jkCabinet) {
        jkCabinet.setIsdeleted(Constants.ZERO);
        jkCabinet.setStatus(Constants.ZERO);
        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
        return jkCabinetMapper.selectList(wrapper);
    }
@@ -87,103 +281,20 @@
    @Override
    public PageData<JkCabinet> findPage(PageWrap<JkCabinet> pageWrap) {
        IPage<JkCabinet> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkCabinet> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkCabinet::getId, pageWrap.getModel().getId());
        JkCabinet model = pageWrap.getModel();
        IPage<JkCabinet> iPage = jkCabinetMapper.selectPage(page, new QueryWrapper<JkCabinet>()
                .lambda()
                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
                .like(StringUtils.isNotBlank(model.getName()),JkCabinet::getName, model.getName())
                .like(StringUtils.isNotBlank(model.getCode()),JkCabinet::getCode, model.getCode())
                .eq(Objects.nonNull(model.getStatus()),JkCabinet::getStatus, model.getStatus())
                .eq(Objects.nonNull(model.getRunStatus()),JkCabinet::getRunStatus, model.getRunStatus())
        );
        for (JkCabinet jkCabinet:iPage.getRecords()) {
            jkCabinet.setGridNum(jkCabinet.getColumnNum()*jkCabinet.getRowNum());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkCabinet::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkCabinet::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkCabinet::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkCabinet::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkCabinet::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkCabinet::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkCabinet::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkCabinet::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(JkCabinet::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(JkCabinet::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getDevId() != null) {
            queryWrapper.lambda().eq(JkCabinet::getDevId, pageWrap.getModel().getDevId());
        }
        if (pageWrap.getModel().getSerialNo() != null) {
            queryWrapper.lambda().eq(JkCabinet::getSerialNo, pageWrap.getModel().getSerialNo());
        }
        if (pageWrap.getModel().getLinkAddr() != null) {
            queryWrapper.lambda().eq(JkCabinet::getLinkAddr, pageWrap.getModel().getLinkAddr());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkCabinet::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getPort() != null) {
            queryWrapper.lambda().eq(JkCabinet::getPort, pageWrap.getModel().getPort());
        }
        if (pageWrap.getModel().getManagerId() != null) {
            queryWrapper.lambda().eq(JkCabinet::getManagerId, pageWrap.getModel().getManagerId());
        }
        if (pageWrap.getModel().getUseTime() != null) {
            queryWrapper.lambda().eq(JkCabinet::getUseTime, pageWrap.getModel().getUseTime());
        }
        if (pageWrap.getModel().getDoubleAuth() != null) {
            queryWrapper.lambda().eq(JkCabinet::getDoubleAuth, pageWrap.getModel().getDoubleAuth());
        }
        if (pageWrap.getModel().getAuthMemberId() != null) {
            queryWrapper.lambda().eq(JkCabinet::getAuthMemberId, pageWrap.getModel().getAuthMemberId());
        }
        if (pageWrap.getModel().getRowNum() != null) {
            queryWrapper.lambda().eq(JkCabinet::getRowNum, pageWrap.getModel().getRowNum());
        }
        if (pageWrap.getModel().getColumnNum() != null) {
            queryWrapper.lambda().eq(JkCabinet::getColumnNum, pageWrap.getModel().getColumnNum());
        }
        if (pageWrap.getModel().getHaertTime() != null) {
            queryWrapper.lambda().ge(JkCabinet::getHaertTime, Utils.Date.getStart(pageWrap.getModel().getHaertTime()));
            queryWrapper.lambda().le(JkCabinet::getHaertTime, Utils.Date.getEnd(pageWrap.getModel().getHaertTime()));
        }
        if (pageWrap.getModel().getLocation() != null) {
            queryWrapper.lambda().eq(JkCabinet::getLocation, pageWrap.getModel().getLocation());
        }
        if (pageWrap.getModel().getLongitude() != null) {
            queryWrapper.lambda().eq(JkCabinet::getLongitude, pageWrap.getModel().getLongitude());
        }
        if (pageWrap.getModel().getLatitude() != null) {
            queryWrapper.lambda().eq(JkCabinet::getLatitude, pageWrap.getModel().getLatitude());
        }
        if (pageWrap.getModel().getNoType() != null) {
            queryWrapper.lambda().eq(JkCabinet::getNoType, pageWrap.getModel().getNoType());
        }
        if (pageWrap.getModel().getNoPrefix() != null) {
            queryWrapper.lambda().eq(JkCabinet::getNoPrefix, pageWrap.getModel().getNoPrefix());
        }
        if (pageWrap.getModel().getNoLength() != null) {
            queryWrapper.lambda().eq(JkCabinet::getNoLength, pageWrap.getModel().getNoLength());
        }
        if (pageWrap.getModel().getNoIndex() != null) {
            queryWrapper.lambda().eq(JkCabinet::getNoIndex, pageWrap.getModel().getNoIndex());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkCabinetMapper.selectPage(page, queryWrapper));
        return PageData.from(iPage);
    }
    @Override
@@ -191,4 +302,135 @@
        QueryWrapper<JkCabinet> wrapper = new QueryWrapper<>(jkCabinet);
        return jkCabinetMapper.selectCount(wrapper);
    }
    @Override
    public CabinetConfigDataVO getCabinetConfigDataVO(){
        CabinetConfigDataVO cabinetConfigDataVO = new CabinetConfigDataVO();
        cabinetConfigDataVO.setConcentration(systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.CONCENTRATION).getCode());
        cabinetConfigDataVO.setPressure(systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.PRESSURE).getCode());
        cabinetConfigDataVO.setBlowTime(systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.BLOW_TIME).getCode());
        cabinetConfigDataVO.setThreshold(systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.THRESHOLD).getCode());
        return cabinetConfigDataVO;
    }
    @Override
    public void updCabinetConfig(CabinetConfigDataVO cabinetConfigDataVO){
        if(Objects.isNull(cabinetConfigDataVO)
        || (StringUtils.isBlank(cabinetConfigDataVO.getBlowTime())
        && StringUtils.isBlank(cabinetConfigDataVO.getConcentration())
                && StringUtils.isBlank(cabinetConfigDataVO.getPressure())
                && StringUtils.isBlank(cabinetConfigDataVO.getThreshold())
        )){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(StringUtils.isNotBlank(cabinetConfigDataVO.getConcentration())){
            SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.CONCENTRATION);
            systemDictData.setCode(cabinetConfigDataVO.getConcentration());
            systemDictDataBiz.updateByIdNew(systemDictData);
        }
        if(StringUtils.isNotBlank(cabinetConfigDataVO.getPressure())){
            SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.PRESSURE);
            systemDictData.setCode(cabinetConfigDataVO.getPressure());
            systemDictDataBiz.updateByIdNew(systemDictData);
        }
        if(StringUtils.isNotBlank(cabinetConfigDataVO.getBlowTime())){
            SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.BLOW_TIME);
            systemDictData.setCode(cabinetConfigDataVO.getBlowTime());
            systemDictDataBiz.updateByIdNew(systemDictData);
        }
        if(StringUtils.isNotBlank(cabinetConfigDataVO.getThreshold())){
            SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.CABINET_CONFIG,Constants.THRESHOLD);
            systemDictData.setCode(cabinetConfigDataVO.getThreshold());
            systemDictDataBiz.updateByIdNew(systemDictData);
        }
    }
    @Override
    public List<AdminCabinetVO> getAdminCabinetInfo(LoginUserInfo loginUserInfo){
        List<AdminCabinetVO> adminCabinetVOList = new ArrayList<>();
        List<JkCabinet> jkCabinetList = jkCabinetMapper.selectList(new QueryWrapper<JkCabinet>()
                .lambda()
                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
                .apply(" FIND_IN_SET("+loginUserInfo.getId()+",MANAGER_ID) ")
                .orderByAsc(JkCabinet::getCreateDate)
        );
        if(CollectionUtils.isNotEmpty(jkCabinetList)){
            for (JkCabinet jkCabinet:jkCabinetList) {
                AdminCabinetVO adminCabinetVO = new AdminCabinetVO();
                BeanUtil.copyProperties(jkCabinet,adminCabinetVO);
                adminCabinetVOList.add(adminCabinetVO);
            }
        }
        return adminCabinetVOList;
    }
    @Override
    public CabinetDetailVO getCabinetDetail(Integer cabinetId){
        CabinetDetailVO cabinetDetailVO = new CabinetDetailVO();
        JkCabinet cabinet = jkCabinetMapper.selectOne(new QueryWrapper<JkCabinet>()
                .lambda()
                .eq(JkCabinet::getIsdeleted,Constants.ZERO)
                .eq(JkCabinet::getId,cabinetId)
                .last(" limit 1")
        );
        if(Objects.isNull(cabinet)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,未查询到钥匙柜信息");
        }
        BeanUtil.copyProperties(cabinet,cabinetDetailVO);
        cabinetDetailVO.setGridNum(Constants.ZERO);
        cabinetDetailVO.setErrGridNum(Constants.ZERO);
        cabinetDetailVO.setOnlineKeyNum(Constants.ZERO);
        cabinetDetailVO.setServiceKeyNum(Constants.ZERO);
        cabinetDetailVO.setOutKeyNum(Constants.ZERO);
        cabinetDetailVO.setUnBindGridNum(Constants.ZERO);
        //所有柜格信息
        List<JkCabinetGrid> jkCabinetGridList =
                jkCabinetGridMapper.selectJoinList(JkCabinetGrid.class, new MPJLambdaWrapper<JkCabinetGrid>()
                .selectAll(JkCabinetGrid.class)
                .selectAs(JkKeys::getCarCode,JkCabinetGrid::getCarCode)
                .selectAs(JkKeys::getStatus,JkCabinetGrid::getKeyStatus)
                .leftJoin(JkKeys.class,JkKeys::getId,JkCabinetGrid::getKeyId)
                .eq(JkCabinetGrid::getIsdeleted,Constants.ZERO)
                .eq(JkCabinetGrid::getCabinetId,cabinet.getId())
                .orderByDesc(JkCabinetGrid::getCode)
        );
        List<CabinetGridInfoVO> cabinetGridInfoVOList = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(jkCabinetGridList)){
            cabinetDetailVO.setGridNum(jkCabinetGridList.size());
            for (JkCabinetGrid jkCabinetGrid:jkCabinetGridList) {
                CabinetGridInfoVO cabinetGridInfoVO = new CabinetGridInfoVO();
                BeanUtil.copyProperties(jkCabinetGrid,cabinetGridInfoVO);
                cabinetGridInfoVO.setBindStatus(Objects.isNull(jkCabinetGrid.getKeyId())?Constants.ZERO:Constants.ONE);
                cabinetGridInfoVOList.add(cabinetGridInfoVO);
            }
            cabinetDetailVO.setErrGridNum(
                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getWorkingStatus(),Constants.ONE)).collect(Collectors.toList()).size()
            );
            cabinetDetailVO.setOnlineKeyNum(
                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.ONE)).collect(Collectors.toList()).size()
            );
            cabinetDetailVO.setOutKeyNum(
                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.TWO)).collect(Collectors.toList()).size()
            );
            cabinetDetailVO.setServiceKeyNum(
                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getKeyStatus(),Constants.THREE)).collect(Collectors.toList()).size()
            );
            cabinetDetailVO.setUnBindGridNum(
                    cabinetGridInfoVOList.stream().filter(i->Constants.equalsInteger(i.getBindStatus(),Constants.ZERO)).collect(Collectors.toList()).size()
            );
        }
        return cabinetDetailVO;
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkIccardServiceImpl.java
@@ -1,5 +1,12 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -10,11 +17,15 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * é’¥åŒ™æŸœIC卡信息表Service实现
@@ -29,13 +40,39 @@
    @Override
    public Integer create(JkIccard jkIccard) {
        if(Objects.isNull(jkIccard)
            || StringUtils.isBlank(jkIccard.getCode())
            || Objects.isNull(jkIccard.getStatus())
            || Objects.isNull(jkIccard.getMemberId())
            || Objects.isNull(jkIccard.getUserType())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = jkIccard.getLoginUserInfo();
        jkIccard.setCreateDate(new Date());
        jkIccard.setCreator(loginUserInfo.getId());
        jkIccard.setEditDate(jkIccard.getCreateDate());
        jkIccard.setEditor(jkIccard.getCreator());
        jkIccard.setIsdeleted(Constants.ZERO);
        //查询编号是否重复
        if(jkIccardMapper.selectCount(new QueryWrapper<JkIccard>().lambda().eq(JkIccard::getCode,jkIccard.getCode()).eq(JkIccard::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"IC卡号已存在!");
        }
        jkIccardMapper.insert(jkIccard);
        return jkIccard.getId();
    }
    @Override
    public void deleteById(Integer id) {
        jkIccardMapper.deleteById(id);
        JkIccard jkIccard = jkIccardMapper.selectById(id);
        if(Objects.isNull(jkIccard)||Constants.equalsInteger(jkIccard.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(Constants.equalsInteger(jkIccard.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"启用数据无法进行删除!");
        }
        jkIccardMapper.update(null,new UpdateWrapper<JkIccard>().lambda().set(JkIccard::getIsdeleted,Constants.ONE).eq(JkIccard::getId,jkIccard.getId()));
    }
    @Override
@@ -54,6 +91,25 @@
    @Override
    public void updateById(JkIccard jkIccard) {
        if(Objects.isNull(jkIccard)
                || Objects.isNull(jkIccard.getId())
                || StringUtils.isBlank(jkIccard.getCode())
                || Objects.isNull(jkIccard.getStatus())
                || Objects.isNull(jkIccard.getMemberId())
                || Objects.isNull(jkIccard.getUserType())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = jkIccard.getLoginUserInfo();
        jkIccard.setCreateDate(new Date());
        jkIccard.setCreator(loginUserInfo.getId());
        jkIccard.setEditDate(jkIccard.getCreateDate());
        jkIccard.setEditor(jkIccard.getCreator());
        jkIccard.setIsdeleted(Constants.ZERO);
        //查询编号是否重复
        if(jkIccardMapper.selectCount(new QueryWrapper<JkIccard>().lambda().ne(JkIccard::getId,jkIccard.getId()).eq(JkIccard::getCode,jkIccard.getCode()).eq(JkIccard::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"IC卡号已存在!");
        }
        jkIccardMapper.updateById(jkIccard);
    }
@@ -87,54 +143,20 @@
    @Override
    public PageData<JkIccard> findPage(PageWrap<JkIccard> pageWrap) {
        IPage<JkIccard> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkIccard> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkIccard::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkIccard::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkIccard::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkIccard::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkIccard::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkIccard::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkIccard::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkIccard::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkIccard::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getMemberId() != null) {
            queryWrapper.lambda().eq(JkIccard::getMemberId, pageWrap.getModel().getMemberId());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(JkIccard::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkIccard::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(JkIccard::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getCabinetId() != null) {
            queryWrapper.lambda().eq(JkIccard::getCabinetId, pageWrap.getModel().getCabinetId());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkIccardMapper.selectPage(page, queryWrapper));
        JkIccard model = pageWrap.getModel();
        MPJLambdaWrapper<JkIccard> wrapper = new MPJLambdaWrapper<JkIccard>()
                .selectAll(JkIccard.class)
                .selectAs(Member::getName,JkIccard::getMemberName)
                .leftJoin(Member.class,Member::getId,JkIccard::getMemberId)
                .eq(JkIccard::getIsdeleted,Constants.ZERO)
                .eq(Objects.nonNull(model.getStatus()),JkIccard::getStatus,model.getStatus())
                .like(StringUtils.isNotBlank(model.getCode()),JkIccard::getCode,model.getCode())
                .like(StringUtils.isNotBlank(model.getMemberName()),Member::getName,model.getMemberName())
                .orderByDesc(JkIccard::getCreateDate)
                ;
        IPage<JkIccard> iPage = jkIccardMapper.selectJoinPage(page,JkIccard.class,wrapper);
        return PageData.from(iPage);
    }
    @Override
@@ -142,4 +164,19 @@
        QueryWrapper<JkIccard> wrapper = new QueryWrapper<>(jkIccard);
        return jkIccardMapper.selectCount(wrapper);
    }
    @Override
    public void updateStatusById(JkIccard jkIccard) {
        if(Objects.isNull(jkIccard)
                || Objects.isNull(jkIccard.getId())
                || Objects.isNull(jkIccard.getStatus())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        jkIccardMapper.update(null,new UpdateWrapper<JkIccard>()
                .lambda().set(JkIccard::getStatus,jkIccard.getStatus())
                .set(JkIccard::getEditDate, DateUtil.getCurrDateTime())
                .eq(JkIccard::getId,jkIccard.getId()));
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkKeysServiceImpl.java
@@ -1,5 +1,13 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.CarsMapper;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.model.JkCabinetGrid;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -10,11 +18,16 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * é’¥åŒ™åŸºæœ¬ä¿¡æ¯è¡¨Service实现
@@ -27,14 +40,56 @@
    @Autowired
    private JkKeysMapper jkKeysMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Override
    public Integer create(JkKeys jkKeys) {
        if(Objects.isNull(jkKeys)
        || Objects.isNull(jkKeys.getCarId())
        || Objects.isNull(jkKeys.getRoleType())
        || StringUtils.isBlank(jkKeys.getCode())
        || StringUtils.isBlank(jkKeys.getRfidLable())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询编号是否重复
        if(jkKeysMapper.selectCount(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getCode,jkKeys.getCode()).eq(JkKeys::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙编号已存在!");
        }
        Cars cars = carsMapper.selectById(jkKeys.getCarId());
        if(Objects.isNull(cars)||Constants.equalsInteger(cars.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"车辆信息未查询到!");
        }
        JkKeys carsKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getCarId,jkKeys.getCarId()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        if(Objects.nonNull(carsKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前车辆已被钥匙["+carsKeys.getCode()+"]绑定使用!");
        }
        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().eq(JkKeys::getRfidLable,jkKeys.getRfidLable()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        if(Objects.nonNull(rfidKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前RFID标签已被钥匙["+rfidKeys.getCode()+"]使用!");
        }
        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
        jkKeys.setCreateDate(new Date());
        jkKeys.setEditDate(jkKeys.getCreateDate());
        jkKeys.setCreator(loginUserInfo.getId());
        jkKeys.setEditor(loginUserInfo.getId());
        jkKeys.setIsdeleted(Constants.ZERO);
        jkKeys.setStatus(Constants.ZERO);
        jkKeys.setCarCode(cars.getCode());
        jkKeysMapper.insert(jkKeys);
        return jkKeys.getId();
    }
    @Override
    public void deleteById(Integer id) {
        JkKeys jkKeys = jkKeysMapper.selectById(id);
        if(Objects.isNull(jkKeys)||Constants.equalsInteger(jkKeys.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!Constants.equalsInteger(jkKeys.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙已绑定,无法进行删除");
        }
        jkKeysMapper.deleteById(id);
    }
@@ -54,6 +109,35 @@
    @Override
    public void updateById(JkKeys jkKeys) {
        if(Objects.isNull(jkKeys)
                || Objects.isNull(jkKeys.getId())
                || Objects.isNull(jkKeys.getCarId())
                || Objects.isNull(jkKeys.getRoleType())
                || StringUtils.isBlank(jkKeys.getCode())
                || StringUtils.isBlank(jkKeys.getRfidLable())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //查询编号是否重复
        if(jkKeysMapper.selectCount(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getCode,jkKeys.getCode()).eq(JkKeys::getIsdeleted,Constants.ZERO))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"钥匙编号已存在!");
        }
        Cars cars = carsMapper.selectById(jkKeys.getCarId());
        if(Objects.isNull(cars)||Constants.equalsInteger(cars.getIsdeleted(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"车辆信息未查询到!");
        }
        JkKeys carsKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getCarId,jkKeys.getCarId()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        if(Objects.nonNull(carsKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前车辆已被钥匙["+carsKeys.getCode()+"]绑定使用!");
        }
        JkKeys rfidKeys = jkKeysMapper.selectOne(new QueryWrapper<JkKeys>().lambda().ne(JkKeys::getId,jkKeys.getId()).eq(JkKeys::getRfidLable,jkKeys.getRfidLable()).eq(JkKeys::getIsdeleted,Constants.ZERO).last("limit 1"));
        if(Objects.nonNull(rfidKeys)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前RFID标签已被钥匙["+rfidKeys.getCode()+"]使用!");
        }
        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
        jkKeys.setEditDate(new Date());
        jkKeys.setEditor(loginUserInfo.getId());
        jkKeys.setCarCode(cars.getCode());
        jkKeysMapper.updateById(jkKeys);
    }
@@ -80,6 +164,8 @@
    @Override
    public List<JkKeys> findList(JkKeys jkKeys) {
        jkKeys.setIsdeleted(Constants.ZERO);
        jkKeys.setStatus(Constants.ZERO);
        QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
        return jkKeysMapper.selectList(wrapper);
    }
@@ -89,57 +175,26 @@
        IPage<JkKeys> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkKeys> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkKeys::getId, pageWrap.getModel().getId());
        JkKeys model = pageWrap.getModel();
        MPJLambdaWrapper<JkKeys> wrapper = new MPJLambdaWrapper<JkKeys>()
                .selectAll(JkKeys.class)
                .selectAs(JkCabinetGrid::getCode,JkKeys::getGridCode)
                .selectAs(JkCabinet::getName,JkKeys::getCabinetName)
                .leftJoin(Cars.class,Cars::getId,JkKeys::getCarId)
                .leftJoin(JkCabinetGrid.class,JkCabinetGrid::getKeyId,JkKeys::getId)
                .leftJoin(JkCabinet.class,JkCabinet::getId,JkCabinetGrid::getCabinetId)
                .eq(JkKeys::getIsdeleted,Constants.ZERO)
                .like(StringUtils.isNotBlank(model.getCode()),JkKeys::getCode,model.getCode())
                .like(StringUtils.isNotBlank(model.getCarCode()),JkKeys::getCarCode,model.getCode());
        IPage<JkKeys> iPage = jkKeysMapper.selectJoinPage(page,JkKeys.class,wrapper);
        for (JkKeys jkKeys:iPage.getRecords()) {
            jkKeys.setIsBinding(StringUtils.isBlank(jkKeys.getGridCode())?Constants.ZERO:Constants.ONE);
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkKeys::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkKeys::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkKeys::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkKeys::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkKeys::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkKeys::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkKeys::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkKeys::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.lambda().eq(JkKeys::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getCarCode() != null) {
            queryWrapper.lambda().eq(JkKeys::getCarCode, pageWrap.getModel().getCarCode());
        }
        if (pageWrap.getModel().getCarId() != null) {
            queryWrapper.lambda().eq(JkKeys::getCarId, pageWrap.getModel().getCarId());
        }
        if (pageWrap.getModel().getRfidLable() != null) {
            queryWrapper.lambda().eq(JkKeys::getRfidLable, pageWrap.getModel().getRfidLable());
        }
        if (pageWrap.getModel().getRoleType() != null) {
            queryWrapper.lambda().eq(JkKeys::getRoleType, pageWrap.getModel().getRoleType());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(JkKeys::getStatus, pageWrap.getModel().getStatus());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(jkKeysMapper.selectPage(page, queryWrapper));
        return PageData.from(iPage);
    }
    @Override
    public long count(JkKeys jkKeys) {
        QueryWrapper<JkKeys> wrapper = new QueryWrapper<>(jkKeys);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkVersionServiceImpl.java
@@ -1,5 +1,14 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.model.JkCabinetLog;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
@@ -10,11 +19,16 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.extern.java.Log;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * äº¤æŽ§-钥匙柜终端版本信息表Service实现
@@ -27,15 +41,39 @@
    @Autowired
    private JkVersionMapper jkVersionMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(JkVersion jkVersion) {
        if(Objects.isNull(jkVersion)
                || Objects.isNull(jkVersion.getIsForce())
                || StringUtils.isBlank(jkVersion.getVersionInfo())
                || StringUtils.isBlank(jkVersion.getFileUrl())
                || Objects.isNull(jkVersion.getFileSize())
                || StringUtils.isBlank(jkVersion.getName())
                || StringUtils.isBlank(jkVersion.getContent())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = jkVersion.getLoginUserInfo();
        jkVersion.setCreateDate(new Date());
        jkVersion.setCreator(loginUserInfo.getId());
        jkVersion.setEditDate(jkVersion.getCreateDate());
        jkVersion.setEditor(jkVersion.getCreator());
        jkVersion.setIsdeleted(Constants.ZERO);
        jkVersion.setType(Constants.ZERO);
        jkVersionMapper.insert(jkVersion);
        return jkVersion.getId();
    }
    @Override
    public void deleteById(Integer id) {
        jkVersionMapper.deleteById(id);
        jkVersionMapper.update(null,new UpdateWrapper<JkVersion>().lambda()
                .set(JkVersion::getIsdeleted,Constants.ONE)
                .eq(JkVersion::getId,id));
//        jkVersionMapper.deleteById(id);
    }
    @Override
@@ -54,6 +92,20 @@
    @Override
    public void updateById(JkVersion jkVersion) {
        if(Objects.isNull(jkVersion)
                || Objects.isNull(jkVersion.getId())
                || Objects.isNull(jkVersion.getIsForce())
                || StringUtils.isBlank(jkVersion.getVersionInfo())
                || StringUtils.isBlank(jkVersion.getFileUrl())
                || Objects.isNull(jkVersion.getFileSize())
                || StringUtils.isBlank(jkVersion.getName())
                || StringUtils.isBlank(jkVersion.getContent())
        ){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
        }
        LoginUserInfo loginUserInfo = jkVersion.getLoginUserInfo();
        jkVersion.setEditDate(new Date());
        jkVersion.setEditor(loginUserInfo.getId());
        jkVersionMapper.updateById(jkVersion);
    }
@@ -67,9 +119,18 @@
        }
    }
    @Override
    public JkVersion findById(Integer id) {
        return jkVersionMapper.selectById(id);
        JkVersion jkVersion = jkVersionMapper.selectById(id);
        if(Objects.nonNull(jkVersion)&&StringUtils.isNotBlank(jkVersion.getFileUrl())){
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.APP_FILE).getCode();
            jkVersion.setFullFileUrl(path + jkVersion.getFileUrl());
        }
        return jkVersion;
    }
    @Override
@@ -87,63 +148,27 @@
    @Override
    public PageData<JkVersion> findPage(PageWrap<JkVersion> pageWrap) {
        IPage<JkVersion> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<JkVersion> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(JkVersion::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(JkVersion::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(JkVersion::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(JkVersion::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(JkVersion::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(JkVersion::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(JkVersion::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(JkVersion::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getInfo() != null) {
            queryWrapper.lambda().eq(JkVersion::getInfo, pageWrap.getModel().getInfo());
        }
        if (pageWrap.getModel().getVersionInfo() != null) {
            queryWrapper.lambda().eq(JkVersion::getVersionInfo, pageWrap.getModel().getVersionInfo());
        }
        if (pageWrap.getModel().getFileUrl() != null) {
            queryWrapper.lambda().eq(JkVersion::getFileUrl, pageWrap.getModel().getFileUrl());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().eq(JkVersion::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getContent() != null) {
            queryWrapper.lambda().eq(JkVersion::getContent, pageWrap.getModel().getContent());
        }
        if (pageWrap.getModel().getSortnum() != null) {
            queryWrapper.lambda().eq(JkVersion::getSortnum, pageWrap.getModel().getSortnum());
        }
        if (pageWrap.getModel().getTitle() != null) {
            queryWrapper.lambda().eq(JkVersion::getTitle, pageWrap.getModel().getTitle());
        }
        if (pageWrap.getModel().getIsForce() != null) {
            queryWrapper.lambda().eq(JkVersion::getIsForce, pageWrap.getModel().getIsForce());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(JkVersion::getType, pageWrap.getModel().getType());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        JkVersion model = pageWrap.getModel();
        MPJLambdaWrapper<JkVersion> wrapper = new MPJLambdaWrapper<JkVersion>()
                .selectAll(JkVersion.class)
                .selectAs(SystemUser::getRealname,JkVersion::getCreateUserName)
                .select(" ROUND( t.file_size / 1024, 2) ", JkVersion::getFileSizeMb)
                .leftJoin(SystemUser.class,SystemUser::getId,JkVersion::getCreator)
                .eq(JkVersion::getIsdeleted,Constants.ZERO)
                .eq(Objects.nonNull(model.getIsForce()),JkVersion::getIsForce,model.getIsForce())
                .like(StringUtils.isNotBlank(model.getVersionInfo()),JkVersion::getVersionInfo,model.getVersionInfo())
                .orderByDesc(JkVersion::getVersionInfo,JkVersion::getCreateDate)
                ;
        IPage<JkVersion> iPage = jkVersionMapper.selectJoinPage(page,JkVersion.class,wrapper);
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_LOCAL_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.APP_FILE).getCode();
        for (JkVersion jkVersion:iPage.getRecords()) {
            if(Objects.nonNull(jkVersion)&&StringUtils.isNotBlank(jkVersion.getFileUrl())){
                jkVersion.setFullFileUrl(path + jkVersion.getFileUrl());
            }
        }
        return PageData.from(jkVersionMapper.selectPage(page, queryWrapper));
        return PageData.from(iPage);
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -96,6 +96,9 @@
    private MemberJoinMapper memberJoinMapper;
    @Autowired
    private JkCabinetMapper jkCabinetMapper;
    @Autowired
    private TrainTimeMapper trainTimeMapper;
    @Autowired
@@ -1210,6 +1213,21 @@
            if(StringUtils.isNotBlank(companySpecialId)){
                queryWrapper.apply(" find_in_set('"+companySpecialId+"',REPLACE(t3.company_path,'/',',')) ");
            }
        }
        if(null != member.getQueryAuth() && Constants.equalsInteger(member.getQueryAuth(),Constants.ONE)){
            List<JkCabinet> jkCabinets = jkCabinetMapper.selectList(new QueryWrapper<JkCabinet>().lambda()
                    .eq(JkCabinet::getIsdeleted,Constants.ZERO)
                    .isNotNull(JkCabinet::getAuthMemberId)
            );
            if(CollectionUtils.isNotEmpty(jkCabinets)){
                List<String> memberIdList = new ArrayList<>();
                List<String> authMemberId = jkCabinets.stream().map(i->i.getAuthMemberId()).collect(Collectors.toList());
                for (String s:authMemberId) {
                    memberIdList.addAll(Arrays.asList(s.split(","))) ;
                }
                queryWrapper.in(Member::getId,memberIdList);
            }
        }
        queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Member::getWorkStatus,Constants.ZERO);
@@ -2491,7 +2509,7 @@
        if(Objects.nonNull(deptIdList)){
            List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
                    .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
//                    .isNotNull(Company::getHkId) æš‚时无法同步开航 å…ˆæ³¨é‡Š
//                    .isNotNull(Company::getHkId) æš‚时无法同步海康 å…ˆæ³¨é‡Š
            );
            if(CollectionUtils.isNotEmpty(companyList)){
                member.setHkOrgId(companyList.get(Constants.ZERO).getHkId());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java
@@ -1,38 +1,69 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.PlatformGroup;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.WeatherUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.dao.MemberMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.third.model.LoginUserInfo;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.WarningMapper;
import com.doumee.dao.business.model.Warning;
import com.doumee.service.business.WarningService;
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 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.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
 * æŠ¥è­¦è®°å½•信息表Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2025/09/28 09:01
 */
@Slf4j
@Service
public class WarningServiceImpl implements WarningService {
    @Autowired
    private WarningMapper warningMapper;
    @Autowired
    private WarningRuleMapper warningRuleMapper;
    @Autowired
    private WarningRuleDetailMapper warningRuleDetailMapper;
    @Autowired
    private WarningPushMapper warningPushMapper;
    @Autowired
    private WarningEventMapper warningEventMapper;
    @Autowired
    private DingTalk dingTalk;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(Warning warning) {
@@ -213,4 +244,107 @@
        model.setEditor(param.getLoginUserInfo().getId());
        warningMapper.updateById(model);
    }
    /**
     * å®šæ—¶èŽ·å–å¤©æ°”ä¿¡æ¯æ‰§è¡Œ
     */
    @Override
    public void getWeatherInfo(){
        try{
            String response = WeatherUtil.getWeatherWarningInfo(systemDictDataBiz.queryByCode(Constants.WEATHER_CONFIG,Constants.REQUEST_URL).getCode(),
                    systemDictDataBiz.queryByCode(Constants.WEATHER_CONFIG,Constants.API_KEY).getCode(),
                    systemDictDataBiz.queryByCode(Constants.WEATHER_CONFIG,Constants.LOCATION).getCode());
            if(StringUtils.isBlank(response)){
                log.error("无返回数据");
            }
            JSONObject jsonObject = JSONObject.parseObject(response);
            if(jsonObject.getString("code").equals("200")){
                if(jsonObject.containsKey("warning")){
                    Warning warning = warningMapper.selectOne(new QueryWrapper<Warning>().lambda()
                            .eq(Warning::getType,Constants.FOUR).eq(Warning::getIsdeleted,Constants.ZERO).last("limt 1"));
                    if(Objects.isNull(warning)){
                        return;
                    }
                    //查询通知人员
                    List<WarningRule> warningRuleList = warningRuleMapper.selectList(new QueryWrapper<WarningRule>().lambda()
                            .eq(WarningRule::getIsdeleted,Constants.ZERO)
                            .apply(" id in ( select w.RULE_ID from warning_rule_detail w where w.WARNING_ID = '"+warning.getId()+"' and w.ISDELETED = 0  ) ")
                    );
                    List<Member> memberList = new ArrayList<>();
                    if(org.apache.commons.collections.CollectionUtils.isNotEmpty(warningRuleList)){
                        List<String> memberIdStr =  warningRuleList.stream().map(i->i.getMemberIds()).collect(Collectors.toList());
                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(memberIdStr)){
                            List<String> memberIdList = new ArrayList<>();
                            for (String s:memberIdStr) {
                                memberIdList.addAll(
                                        Arrays.asList(s.split(","))
                                );
                            }
                            memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO)
                                    .notIn(Member::getErpId)
                                    .in(Member::getId,memberIdList)
                            );
                        }
                    }
                    JSONArray jsonArray = jsonObject.getJSONArray("warning");
                    for (int i = 0; i < jsonArray.size(); i++) {
                        List<WarningPush> warningPushList = new ArrayList<>();
                        JSONObject  weatherInfo = jsonArray.getJSONObject(i);
                        String code = weatherInfo.getString("id");
                        String title = weatherInfo.getString("title");
                        String text = weatherInfo.getString("text");
                        //存在预警 åˆ™å­˜å‚¨é¢„警信息
                        if(warningEventMapper.selectCount(new QueryWrapper<WarningEvent>()
                                .lambda()
                                .eq(WarningEvent::getEventId,code)
                        )>Constants.ZERO){
                            continue;
                        }
                        WarningEvent warningEvent = new WarningEvent();
                        warningEvent.setCreateDate(new Date());
                        warningEvent.setIsdeleted(Constants.ZERO);
                        warningEvent.setWarningId(warning.getId());
                        warningEvent.setTitle(title);
                        warningEvent.setContent(text);
                        warningEvent.setEventId(code);
                        warningEvent.setHappenTime(DateUtil.getCurrDateTime());
                        warningEvent.setJsonContent(weatherInfo.toJSONString());
                        warningEventMapper.insert(warningEvent);
                        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberList)&&memberList.size()>Constants.ZERO){
                            List<String> ddUserIdList = memberList.stream().map(j->j.getErpId()).collect(Collectors.toList());
                            //发送推送钉钉消息
                            Boolean isSuccess = dingTalk.workInfoOANotice(Long.valueOf(systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.AGENT_ID).getCode()),
                                    String.join(",",ddUserIdList),
                                    dingTalk.getWeatherNoticeMsg(title,text));
                            for (Member member:memberList) {
                                WarningPush warningPush = new WarningPush();
                                warningPush.setCreateDate(new Date());
                                warningPush.setWarningId(warning.getId());
                                warningPush.setTitle(warningEvent.getTitle());
                                warningPush.setContent(warningEvent.getContent());
                                warningPush.setStatus(isSuccess?Constants.ONE:Constants.TWO);
                                warningPush.setPushType(Constants.ZERO);
                                warningPush.setMemberId(member.getId());
                                warningPushList.add(warningPush);
                            }
                        }
                        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(warningPushList)){
                            warningPushMapper.insert(warningPushList);
                        }
                    }
                }
            }
        }catch (Exception e){
        }
    }
}