43dc204f89527ba402666ba92345efbfe751f297..eb82684152ffb0acddf67da92e4533a0190eb258
2 天以前 MrShi
对接口
eb8268 对比 | 目录
2 天以前 rk
钥匙柜开发
8d2f50 对比 | 目录
2 天以前 rk
钥匙柜开发 天气预警通知
5df732 对比 | 目录
已添加4个文件
已修改44个文件
1951 ■■■■■ 文件已修改
admin/src/api/business/jkCabinet.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkCabinetGrid.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkIccard.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkKeys.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkVersion.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/BorrowingAndReturningRecords.vue 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkIccardWindow.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkKeysWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaJkVersionWindow.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/cabinetDetails.vue 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkCabinet.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkCabinetLog.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkIccard.vue 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/jkKeys.vue 36 ●●●● 补丁 | 查看 | 原始文档 | 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 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetGridCloudController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCabinetLogCloudController.java 2 ●●● 补丁 | 查看 | 原始文档 | 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/JkVersionCloudController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java 5 ●●●●● 补丁 | 查看 | 原始文档 | 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/JkVersionMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetGrid.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinetLog.java 52 ●●●●● 补丁 | 查看 | 原始文档 | 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 1 ●●●● 补丁 | 查看 | 原始文档 | 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/vo/CabinetConfigDataVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetGridService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | 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/JkCabinetGridServiceImpl.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetLogServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | 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 2 ●●●●● 补丁 | 查看 | 原始文档 | 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 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/WarningServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/jkCabinet.js
@@ -20,11 +20,21 @@
  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 deleteById (id) {
  return request.get(`/business/jkCabinet/delete/${id}`)
admin/src/api/business/jkCabinetGrid.js
@@ -25,6 +25,11 @@
  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 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
@@ -27,7 +27,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
@@ -6,21 +6,26 @@
        :withFooter="false"
    >
        <el-form ref="searchForm" :model="searchForm" label-width="100px" inline>
            <el-form-item label="钥匙" prop="keyId">
                <el-input v-model="searchForm.keyId" placeholder="请输入钥匙编码或名称" @keypress.enter.native="getList"></el-input>
            <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 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-option label="成功" :value="0"></el-option>
                    <el-option label="失败" :value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item>
@@ -29,49 +34,28 @@
            <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>
        <ul class="toolbar">
            <li><el-button type="primary">批量解绑</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"></el-table-column>
            <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-switch
                        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-column
                label="操作"
                min-width="100"
                fixed="right"
            >
                <template slot-scope="{row}">
                    <el-button type="text" v-if="row.bindStatus === 0">绑定</el-button>
                    <el-button type="text" v-if="row.bindStatus === 1">解绑</el-button>
                    <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>
@@ -90,8 +74,7 @@
<script>
  import BaseOpera from '@/components/base/BaseOpera'
  import GlobalWindow from '@/components/common/GlobalWindow'
  import { fetchList } from '@/api/business/jkCabinetGrid'
  import { allList } from '@/api/business/cars'
  import { fetchList, exportExcel } from '@/api/business/jkCabinetLog'
  export default {
    name: 'BorrowingAndReturningRecords',
    extends: BaseOpera,
@@ -101,10 +84,13 @@
        id: null,
        info: null,
        searchForm: {
          keyId: '',
          memberName: '',
          status: '',
          bindStatus: ''
          roleType: '',
          startDate: '',
          editDate: ''
        },
        date: [],
        list: [],
        page: 1,
        total: 0,
@@ -118,14 +104,26 @@
        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.keyId = ''
        this.searchForm.memberName = ''
        this.searchForm.status = ''
        this.searchForm.workingStatus = ''
        this.searchForm.roleType = ''
        this.searchForm.startDate = ''
        this.searchForm.editDate = ''
        this.date = []
        this.page = 1
        this.getList()
      },
@@ -135,18 +133,41 @@
          capacity: 10,
          page: this.page,
          model: {
            cabinetId: this.id,
            keyId: this.searchForm.keyId,
            memberName: this.searchForm.memberName,
            status: this.searchForm.status,
            workingStatus: this.searchForm.workingStatus
            roleType: this.searchForm.roleType,
            startDate: this.searchForm.startDate,
            editDate: this.searchForm.editDate,
          }
        }).then(res => {
          console.log(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(() => {})
      }
    }
  }
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
@@ -15,7 +15,7 @@
          <el-option
            v-for="item in carAll"
            :key="item.id"
            :label="item.name"
            :label="item.code"
            :value="item.id">
          </el-option>
        </el-select>
@@ -80,7 +80,7 @@
    getCars() {
      allList({ type: 0 })
        .then(res => {
          console.log(res)
          this.carAll = res
        })
    }
  }
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/cabinetDetails.vue
@@ -38,12 +38,34 @@
            :data="list"
            stripe
        >
            <el-table-column prop="code" label="柜格编号" min-width="100px"></el-table-column>
            <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"></el-table-column>
            <el-table-column prop="keyId" label="绑定钥匙" min-width="100px">
                <template slot-scope="{row}">
                    <el-select v-model="row.keyId" placeholder="请选择">
                        <el-option
                            v-for="item in keysAll"
                            :key="item.id"
                            :label="item.name"
                            :value="item.id">
                        </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" placeholder="请输入板号"></el-input>
                </template>
            </el-table-column>
            <el-table-column label="通道号" min-width="100px">
                <template slot-scope="{row}">
                    <el-input v-model="row.channelCode" 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"
@@ -64,33 +86,14 @@
                    <el-link type="success" v-if="row.bindStatus === 1">已绑定</el-link>
                </template>
            </el-table-column>
            <el-table-column
                label="操作"
                min-width="100"
                fixed="right"
            >
                <template slot-scope="{row}">
                    <el-button type="text" v-if="row.bindStatus === 0">绑定</el-button>
                    <el-button type="text" v-if="row.bindStatus === 1">解绑</el-button>
                </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 } from '@/api/business/jkCabinetGrid'
  import { fetchList, updateStatusById } from '@/api/business/jkCabinetGrid'
  export default {
    name: 'cabinetDetails',
    extends: BaseOpera,
@@ -105,8 +108,7 @@
          bindStatus: ''
        },
        list: [],
        page: 1,
        total: 0,
        keysAll: [],
        loading: false
      }
    },
@@ -117,6 +119,12 @@
        this.getList()
        this.visible = true
      },
      changeStatus(status, id) {
        updateStatusById({ id, status })
          .then(res => {
            this.getList()
          })
      },
      handleCurrentChange(e) {
        this.page = e
        this.getList()
@@ -125,14 +133,13 @@
        this.searchForm.keyId = ''
        this.searchForm.status = ''
        this.searchForm.workingStatus = ''
        this.page = 1
        this.getList()
      },
      getList() {
        this.loading = true
        fetchList({
          capacity: 10,
          page: this.page,
          capacity: 99999,
          page: 1,
          model: {
            cabinetId: this.id,
            keyId: this.searchForm.keyId,
@@ -140,9 +147,7 @@
            workingStatus: this.searchForm.workingStatus
          }
        }).then(res => {
          console.log(res)
          this.list = res.records
          this.total = res.total
        }).finally(() => {
          this.loading = false
        })
admin/src/views/business/jkCabinet.vue
@@ -60,6 +60,7 @@
          <template slot-scope="{row}">
            <el-switch
              v-model="row.status"
              @change="changeStatus($event, row.id)"
              active-color="#13ce66"
              inactive-color="#ff4949"
              :active-value="0"
@@ -101,6 +102,7 @@
import Pagination from '@/components/common/Pagination'
import OperaJkCabinetWindow from '@/components/business/OperaJkCabinetWindow'
import CabinetDetails from '@/components/business/cabinetDetails'
import { updateStatusById } from '@/api/business/jkCabinet'
export default {
  name: 'JkCabinet',
  extends: BaseTable,
@@ -124,6 +126,14 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    changeStatus(status, id) {
      updateStatusById({ id, status })
        .then(res => {
          this.search()
        })
    }
  }
}
</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
@@ -5,8 +5,15 @@
      <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="状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择" @change="search">
@@ -37,10 +44,10 @@
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="code" label="钥匙编号" min-width="100px"></el-table-column>
        <el-table-column prop="carName" label="所属车辆" 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="rfidLable" label="绑定钥匙柜" min-width="100px"></el-table-column>
        <el-table-column prop="rfidLable" label="存放位置" 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>
@@ -58,12 +65,12 @@
        <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.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="$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>
@@ -88,6 +95,7 @@
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,
@@ -97,9 +105,10 @@
      // æœç´¢
      searchForm: {
        code: '',
        carCode: '',
        carId: '',
        status: ''
      }
      },
      carAll: []
    }
  },
  created () {
@@ -110,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;
@@ -95,4 +96,21 @@
    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;
@@ -64,7 +65,27 @@
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:jkcabinetgrid:update")
    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);
    }
@@ -88,4 +109,8 @@
    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
@@ -79,7 +79,7 @@
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:jkcabinetlog:exportExcel")
    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(), "钥匙柜开关门记录", response);
        ExcelExporter.build(JkCabinetLog.class).export(jkCabinetLogService.findPage(pageWrap).getRecords(), "钥匙柜开关门记录_"+System.currentTimeMillis(), response);
    }
    @ApiOperation("根据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/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,7 +373,7 @@
     * 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){
    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();
@@ -384,13 +384,14 @@
            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){
        }
        return false;
    }
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/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/model/JkCabinetGrid.java
@@ -77,6 +77,17 @@
    @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;
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,87 @@
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 = "操作人部门", 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
@@ -77,6 +77,7 @@
    @ExcelColumn(name=" çŠ¶æ€ 0未绑定 1在位 2借出 3维修保养")
    private Integer status;
    @ApiModelProperty(value = "存放位置", example = "1")
    @TableField(exist = false)
    private String gridCode;
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/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/service/business/JkCabinetGridService.java
@@ -96,11 +96,7 @@
     */
    long count(JkCabinetGrid jkCabinetGrid);
    /**
     * ç»‘定钥匙
     * @param jkCabinetGrid
     */
    void bindingKeys(JkCabinetGrid jkCabinetGrid);
    void updateStatusById(JkCabinetGrid jkCabinetGrid);
    void unBindKeys(List<Integer> idList);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCabinetService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.dao.business.vo.CabinetConfigDataVO;
import com.doumee.service.business.third.model.PageData;
import com.doumee.service.business.third.model.PageWrap;
import com.doumee.dao.business.model.JkCabinet;
@@ -97,4 +98,8 @@
     * @return long
     */
    long count(JkCabinet jkCabinet);
    CabinetConfigDataVO getCabinetConfigDataVO();
    void updCabinetConfig(CabinetConfigDataVO cabinetConfigDataVO);
}
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/JkCabinetGridServiceImpl.java
@@ -9,6 +9,7 @@
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.JkCabinet;
import com.doumee.dao.business.model.JkKeys;
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;
@@ -72,7 +73,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
@@ -133,38 +174,17 @@
    }
    @Override
    public void bindingKeys(JkCabinetGrid jkCabinetGrid){
    public void updateStatusById(JkCabinetGrid jkCabinetGrid) {
        if(Objects.isNull(jkCabinetGrid)
        || Objects.isNull(jkCabinetGrid.getId())
        || Objects.isNull(jkCabinetGrid.getKeyId())){
                || Objects.isNull(jkCabinetGrid.getId())
                || Objects.isNull(jkCabinetGrid.getStatus())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        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(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())
        jkCabinetGridMapper.update(null,new UpdateWrapper<JkCabinetGrid>()
                .lambda().set(JkCabinetGrid::getStatus,jkCabinetGrid.getStatus())
                .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())
        );
    }
    @Override
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,69 +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());
        JkCabinetLog model = 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());
        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,6 @@
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;
@@ -8,6 +9,8 @@
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.CabinetConfigDataVO;
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;
@@ -45,6 +48,9 @@
    @Autowired
    private JkKeysMapper jkKeysMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
@@ -292,8 +298,51 @@
    @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);
        }
    }
}
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
@@ -76,6 +76,7 @@
        jkKeys.setEditor(loginUserInfo.getId());
        jkKeys.setIsdeleted(Constants.ZERO);
        jkKeys.setStatus(Constants.ZERO);
        jkKeys.setCarCode(cars.getCode());
        jkKeysMapper.insert(jkKeys);
        return jkKeys.getId();
    }
@@ -136,6 +137,7 @@
        LoginUserInfo loginUserInfo = jkKeys.getLoginUserInfo();
        jkKeys.setEditDate(new Date());
        jkKeys.setEditor(loginUserInfo.getId());
        jkKeys.setCarCode(cars.getCode());
        jkKeysMapper.updateById(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
@@ -1211,6 +1214,21 @@
                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);
        queryWrapper.orderByAsc(Member::getPinyin);
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){
        }
    }
}