liukangdong
2024-05-24 c70d3f2aaf0f576c4d61255c691ad335eb551606
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加2个文件
已修改29个文件
已重命名1个文件
1157 ■■■■ 文件已修改
admin/package-lock.json 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/cars.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/parkBook.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarAuthWindow.vue 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberRoleWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/layouts/TableLayout.vue 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carsSync.vue 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalCompany.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/cars.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/parkBook.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/vue.config.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CarsCloudController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HiddenDangerCloudController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/ParkBookCloudController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Cars.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ParkBook.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarsService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/HiddenDangerService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ParkBookService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ParkBookServiceImpl.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json
@@ -10174,6 +10174,30 @@
      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
      "dev": true
    },
    "path": {
      "version": "0.12.7",
      "resolved": "https://registry.npmmirror.com/path/-/path-0.12.7.tgz",
      "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==",
      "requires": {
        "process": "^0.11.1",
        "util": "^0.10.3"
      },
      "dependencies": {
        "inherits": {
          "version": "2.0.3",
          "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
        },
        "util": {
          "version": "0.10.4",
          "resolved": "https://registry.npmmirror.com/util/-/util-0.10.4.tgz",
          "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
          "requires": {
            "inherits": "2.0.3"
          }
        }
      }
    },
    "path-browserify": {
      "version": "0.0.1",
      "resolved": "https://registry.npm.taobao.org/path-browserify/download/path-browserify-0.0.1.tgz",
@@ -11044,8 +11068,7 @@
    "process": {
      "version": "0.11.10",
      "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz",
      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
      "dev": true
      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
    },
    "process-nextick-args": {
      "version": "2.0.1",
admin/package.json
@@ -22,6 +22,7 @@
    "element-ui": "^2.3.6",
    "js-cookie": "^2.2.1",
    "js-file-download": "^0.4.12",
    "path": "^0.12.7",
    "qrcodejs2": "0.0.2",
    "vue": "^2.6.11",
    "vue-clipboard2": "^0.3.1",
admin/src/api/business/cars.js
@@ -23,12 +23,12 @@
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/cars/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/cars/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/business/cars/delete/batch', {
  return request.get('/visitsAdmin/cloudService/business/cars/delete/batch', {
    params: {
      ids
    }
admin/src/api/business/member.js
@@ -9,6 +9,14 @@
    trim: true
  })
}
export function allList (data) {
  // return request.post('/business/member/page', data, {
  //   trim: true
  // })
  return request.post('/visitsAdmin/cloudService/business/member/list', data, {
    trim: true
  })
}
// éƒ¨é—¨ä¿¡æ¯åŒæ­¥
export function memberSync (data) {
  return request.post('/visitsAdmin/cloudService/business/member/syncAll', data)
admin/src/api/business/parkBook.js
@@ -11,6 +11,9 @@
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/parkBook/create', data)
}
export function batchAuth (data) {
  return request.post('/visitsAdmin/cloudService/business/parkBook/batchAuth', data)
}
// ä¿®æ”¹
export function updateById (data) {
@@ -23,7 +26,7 @@
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/parkBook/delete/${id}`)
  return request.get(`/visitsAdmin/cloudService/business/parkBook/delete/${id}`)
}
// æ‰¹é‡åˆ é™¤
admin/src/assets/style/style.scss
@@ -115,7 +115,7 @@
  }
}
.tip-warn {
  margin: 4px 0 12px 0;
  margin: 4px 0 25px 0;
  font-size: 12px;
  color: #999;
  i {
admin/src/components/business/OperaCarAuthWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,176 @@
<template>
  <GlobalWindow
      :title="title"
      width="800px"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <p class="tip-warn"><i class="el-icon-warning"></i>提醒:<br>
      1.车辆权限配置成功后,授权任务即进入权限下发队列,可前往【车辆授权申请记录】查看下发进度;<br>
      2.如果需要清空当前选中人员下发权限,以下【授权停车场】为空提交即可。
    </p>
    <p class="tip" v-if="form.codes != null">正在为<em>【{{ form.codes.map(item => `${item}`).join(',') }}】</em> é…ç½®åœè½¦åœºæƒé™</p>
      <el-form :model="form" ref="form" :rules="rules">
        <el-form-item label="授权有效期:" prop="authTimeType" >
          <el-radio-group v-model="form.authTimeType">
            <el-radio :label="0">长期有效</el-radio>
            <el-radio :label="1">自定义时间</el-radio>
            <el-radio :label="2">跟随车主</el-radio>
          </el-radio-group>
          <div v-if="form.authTimeType ==1" style="margin-top: 10px" >
            <el-date-picker
                @change="seleTime"
                v-model="time"
                type="datetimerange"
                format="yyyy-MM-dd HH:mm:ss"
                value-format="yyyy-MM-dd HH:mm:ss"
                range-separator="至"
                start-placeholder="开始日期"
                end-placeholder="结束日期">
            </el-date-picker>
          </div>
        </el-form-item>
        <el-form-item label="选择停车库" prop="parkIdList">
          <el-select multiple v-model="form.parkIdList" filterable placeholder="请选择" clearable>
            <el-option
                v-for="item in parks"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { findList } from '@/api/business/parks'
export default {
  name: 'OperaCarsWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    var validateTime = (rule, value, callback) => {
      if (this.form.authTimeType == null) {
        callback(new Error('请填写正确的授权有效期时间'))
        return
      }
      if (this.form.authTimeType === 1 && (this.form.startTime == null || this.form.endTime == null)) {
        callback(new Error('请填写正确的授权有效期时间'))
        return
      }
      callback()
    }
    return {
      // è¡¨å•数据
      form: {
        ids: [],
        codes: [],
        authTimeType: 0,
        startTime: null,
        endTime: null,
        parkIdList: []
      },
      time: null,
      parks: [],
      // éªŒè¯è§„则
      rules: {
        authTimeType: [
          { required: true, validator: validateTime, message: '请选中门禁有效期' }
        ]
      },
      options: []
    }
  },
  created () {
    this.config({
      api: '/business/parkBook',
      'field.id': 'id'
    })
  },
  methods: {
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        if (this.form.parkIdList == null || this.form.parkIdList.length === 0) {
          this.$dialog.actionConfirm('授权停车库为空,提交后即清除所选车辆已分配的全部权限,请谨慎操作!', '您确认进行该操作吗?')
            .then(() => {
              this.confirmDo()
            })
            .catch(() => {})
        } else {
          this.confirmDo()
        }
      })
    },
    confirmDo () {
      // è°ƒç”¨æ–°å»ºæŽ¥å£
      this.isWorking = true
      this.api.batchAuth({
        idList: this.form.ids,
        authTimeType: this.form.authTimeType,
        startTime: this.form.startTime,
        endTime: this.form.endTime,
        parkIdList: this.form.parkIdList
      })
        .then(() => {
          this.visible = false
          this.$tip.apiSuccess('授权成功,可前往【车辆授权申请记录】查看下发进度')
          this.$emit('success')
        })
        .catch(e => {
          // this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking = false
        })
    },
    seleTime (e) {
      if (e && e.length >= 2) {
        this.form.startTime = e[0]
        this.form.endTime = e[1]
      } else {
        this.form.startTime = null
        this.form.endTime = null
      }
    },
    open (title, ids, names, companyType) {
      this.title = title
      this.visible = true
      this.companyType = companyType
      // æ–°å»º
      this.$nextTick(() => {
        this.$refs.form.resetFields()
        this.form[this.configData['field.id']] = null
        this.form.ids = ids
        this.form.codes = names
        this.loadParks()
        console.log(names)
      })
    },
    loadParks () {
      this.parks = []
      findList({
        isdeleted: 0
      })
        .then(res => {
          this.parks = res
        })
        .catch(e => {
          this.$message.error('加载停车库信息失败')
        })
        .finally(() => {
          // this.isWorking = false
        })
    }
  }
}
</script>
admin/src/components/business/OperaCarsWindow.vue
@@ -10,36 +10,23 @@
            <el-form-item label="车牌号" prop="code">
                <el-input v-model="form.code" placeholder="请输入车牌号" v-trim/>
            </el-form-item>
            <el-form-item label="用户类型" prop="code">
                <el-radio-group v-model="form.code">
                    <el-radio label="内部员工"></el-radio>
                    <el-radio label="劳务人员"></el-radio>
          <el-form-item label="车辆类型" prop="type">
            <el-radio-group v-model="form.type" >
              <el-radio :label="0"  >员工车辆</el-radio>
              <el-radio  :label="1"  >安泰公务车</el-radio>
              <el-radio  :label="2"  >安泰物流车</el-radio>
              <el-radio  :label="3"  >市公司公车</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="选择用户" prop="code">
                <el-select v-model="form.code" filterable placeholder="请选择">
          <el-form-item label="选择车主:" prop="memberId">
            <el-select v-model="form.memberId" filterable placeholder="请选择">
                    <el-option
                        v-for="item in options"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value">
                  v-for="item in memberList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
                    </el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="授权有效期" prop="code">
                <el-date-picker
                    v-model="form.code"
                    type="daterange"
                    range-separator="至"
                    start-placeholder="开始日期"
                    end-placeholder="结束日期">
                </el-date-picker>
            </el-form-item>
            <el-form-item label="授权停车场" prop="code">
                <el-radio-group v-model="form.code">
                    <el-radio label="全部停车场"></el-radio>
                    <el-radio label="部分停车场"></el-radio>
                </el-radio-group>
            </el-form-item>
        </el-form>
    </GlobalWindow>
@@ -48,28 +35,73 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
export default {
  name: 'OperaCarsWindow',
  name: 'OperaInternalCompanyWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      // è¡¨å•数据
      memberList: [],
      form: {
        id: null,
        code: ''
        code: null,
        memberId: null,
        type: 0
      },
      // éªŒè¯è§„则
      rules: {
      },
      options: []
        code: [
          { required: true, message: '请输入车牌号' }
        ],
        type: [
          { required: true, message: '请选择车辆类型' }
        ]
      }
    }
  },
  created () {
    this.config({
      api: '/business/parkBook',
      api: '/business/cars',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, target) {
      this.title = title
      this.visible = true
      this.loadMember()
      // æ–°å»ºç»„织
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.type=0
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
      })
    },
    loadMember () {
      allList({
        type: 2
      })
        .then(res => {
          this.memberList = res
        })
        .catch(e => {
          this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.isWorking = false
        })
    }
  }
}
</script>
admin/src/components/business/OperaMemberRoleWindow.vue
@@ -2,7 +2,7 @@
    <GlobalWindow
        :title="title"
        :visible.sync="visible"
        width="900px"
        width="70%"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
@@ -145,7 +145,7 @@
        })
            .then(() => {
              this.visible = false
              this.$tip.apiSuccess('新建成功')
              this.$tip.apiSuccess('授权成功,可前往【人员授权记录】查看下发进度')
              this.$emit('success')
            })
            .catch(e => {
admin/src/layouts/TableLayout.vue
admin/src/views/business/carsSync.vue
admin/src/views/business/internalCompany.vue
@@ -50,7 +50,7 @@
                    <template slot-scope="{row}">
                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('编辑企业信息',{  id: row.parentId,name:row.parentName,type:row.parentType, companyPath:row.parentCompanyPath}, row)" icon="el-icon-edit" v-permissions="['business:company:update']">编辑</el-button>
                        <el-button type="text" @click="$refs.OperaInternalCompanyWindow.open('新建子级',  row,null)" icon="el-icon-plus">新建子级</el-button>
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:company:delete']">删除</el-button>
                        <el-button type="text" @click="deleteById(row)" style="color: red" icon="el-icon-delete" v-permissions="['business:company:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
@@ -196,7 +196,7 @@
        }
      }
      return null
    },
    }
  }
}
</script>
admin/src/views/business/internalMember.vue
@@ -6,26 +6,26 @@
                <el-input v-model="searchForm.keyword" placeholder="请输入姓名/手机号/工号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="" prop="hasFace">
                <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" placeholder="是否有人脸">
                <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" clearable placeholder="是否有人脸">
                    <el-option label="无" value="0"></el-option>
                    <el-option label="有" value="1"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="canVisit">
                <el-select v-model="searchForm.canVisit" @keypress.enter.native="search" placeholder="可拜访">
                <el-select v-model="searchForm.canVisit" clearable @keypress.enter.native="search" placeholder="可拜访">
                    <el-option label="是" value="1"></el-option>
                    <el-option label="否" value="0"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="status">
                <el-select v-model="searchForm.status" @keypress.enter.native="search" placeholder="状态">
                <el-select v-model="searchForm.status" @keypress.enter.native="search" clearable placeholder="状态">
                    <el-option label="正常" value="0"></el-option>
                    <el-option label="禁用" value="1"></el-option>
                    <el-option label="拉黑/冻结" value="2"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="" prop="hkStatus">
                <el-select v-model="searchForm.hkStatus" @keypress.enter.native="search" placeholder="海康同步状态">
                <el-select v-model="searchForm.hkStatus" @keypress.enter.native="search" clearable placeholder="海康同步状态">
                    <el-option label="待同步" value="0"></el-option>
                    <el-option label="同步成功" value="1"></el-option>
                    <el-option label="同步失败" value="2"></el-option>
@@ -170,7 +170,7 @@
                        <el-button type="text" :loading="heading" icon="el-icon-delete" @click="updateHead(row,0)" v-if="row.headStatus ==1 " v-permissions="['business:member:head']">取消主管</el-button>
                        <el-button type="text" :loading="heading"  icon="el-icon-edit" @click="updateHead(row,1)"  v-if="row.headStatus  == 0"  v-permissions="['business:member:head']">设为主管</el-button>
                        <el-button type="text"  icon="el-icon-plus" @click="empower(row.id)" v-permissions="['business:empower:create']">重新授权</el-button>
                        <el-button  type="text"  icon="el-icon-delete" @click="empower(row.id)" v-permissions="['business:empower:delete']">删除</el-button>
                        <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:member:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
admin/src/views/vehicle/cars.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,163 @@
<template>
    <TableLayout :permissions="['business:member:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
            <el-form-item label="车牌号" prop="code">
                <el-input v-model="searchForm.code" clearable placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
          <el-form-item label="车主姓名/手机号" prop="memberName">
            <el-input v-model="searchForm.memberName" clearable placeholder="车主姓名/手机号" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="车主部门" prop="companyName">
            <el-input v-model="searchForm.companyName" clearable placeholder="车主部门名称" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="授权状态" prop="authStatus">
            <el-select v-model="searchForm.authStatus" @keypress.enter.native="search" clearable placeholder="是否授权">
              <el-option label="是" value="1"></el-option>
              <el-option label="否" value="0"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="车辆类型" prop="type">
            <el-select v-model="searchForm.type" @keypress.enter.native="search" clearable placeholder="车辆类型">
              <el-option label="员工车辆" value="0"></el-option>
              <el-option label="安泰公务车" value="1"></el-option>
              <el-option label="安泰物流车" value="2"></el-option>
              <el-option label="市公司公车" value="3"></el-option>
          </el-select>
          </el-form-item>
                      <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:cars:create', 'business:parkBook:create']">
                <li><el-button type="primary" @click="$refs.operaCarsWindow.open('新建车辆')" icon="el-icon-plus" v-permissions="['business:cars:create']">新建</el-button></li>
                <li><el-button type="primary" @click="startEmpowerBatch" icon="el-icon-plus" v-permissions="['business:parkbook:create']">下发授权</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="code" label="车牌号" min-width="100px"></el-table-column>
                <el-table-column label="车辆类型" min-width="100px">
                    <template slot-scope="{row}">
                      <span v-if="row.type == 0" >员工车辆</span>
                      <span v-if="row.type == 1">安泰公务车</span>
                      <span v-if="row.type == 2" >安泰物流车</span>
                      <span v-if="row.type == 3" >市公司公车</span>
                    </template>
                </el-table-column>
              <el-table-column prop="memberName" label="车主姓名"  min-width="100px"></el-table-column>
              <el-table-column prop="memberPhone" label="车主手机号" min-width="100px"></el-table-column>
              <el-table-column prop="companyName" label="车主组织" min-width="200px"></el-table-column>
                <el-table-column label="是否授权" align="center" min-width="100px">
                  <template slot-scope="{row}">
                    <span v-if="row.authStatus == 1" style="color: green">是</span>
                    <span v-else style="color: red">否</span>
                  </template>
                </el-table-column>
                <el-table-column prop="parksName" label="已授权停车场" min-width="200px">
                  <template slot-scope="{row}">
                    <div  v-if="row.parkBookList && row.parkBookList.length" >
                      <span v-for="item in row.parkBookList"  :key="item.id" style="display: block">
                        <span  :style="(item.hkStatus== 0?'color:#2080f7':(item.hkStatus== 1?'color:green':(item.hkStatus== 2?'color:red':'')))">【{{item.hkStatus== 0?'等待下发':(item.hkStatus== 1?'下发成功':(item.hkStatus== 2?'下发失败':''))}}】 </span>{{item.parksName}}
                      </span>
                    </div>
                    <span  v-if="row.parkBookList ==null ||row.parkBookList.length ==0">-</span>
                  </template>
                </el-table-column>
              <el-table-column label="下发有效期" min-width="170px">
                <template slot-scope="{row}">
                  <div v-if="row.authStatus !=null && row.authStatus == 1 && row.parkBookList!=null && row.parkBookList.length>0">
                    <div v-if="!row.startTime || !row.endTime">长期有效</div>
                    <div v-else>
                      <span>起:{{row.startTime}}</span><br/>
                      <span>止:{{row.endTime}}</span>
                    </div>
                  </div>
                  <div v-else >-</div>
                </template>
              </el-table-column>
                <el-table-column prop="editorName" label="操作人" min-width="100px"></el-table-column>
                <el-table-column prop="editDate" label="操作时间" min-width="100px"></el-table-column>
              <el-table-column
                  v-if="containPermissions(['business:member:update', 'business:member:delete','business:empower:create'])"
                  label="操作"
                  min-width="250"
                  fixed="right"
              >
                <template slot-scope="{row}">
                  <el-button type="text" icon="el-icon-edit" @click="$refs.operaCarsWindow.open('编辑车辆信息',row)" v-permissions="['business:cars:update']">编辑</el-button>
                  <el-button type="text" icon="el-icon-edit" @click="$refs.operaCarAuthWindow.open('下发授权',[row.id],[row.code])" v-permissions="['business:parkbook:create']">下发授权</el-button>
                  <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:empower:delete']">删除</el-button>
                </template>
              </el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaCarAuthWindow ref="operaCarAuthWindow" @success="handlePageChange"/>
        <OperaCarsWindow ref="operaCarsWindow" @success="handlePageChange"/>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCarsWindow from '@/components/business/OperaCarsWindow'
import OperaCarAuthWindow from '@/components/business/OperaCarAuthWindow'
import { sync } from '@/api/business/cars'
export default {
  name: 'Cars',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCarsWindow,OperaCarAuthWindow },
  data () {
    return {
      // æœç´¢
      searchForm: {
        code: '',
        memberName: '',
        companyName: '',
        type:null,
        authStatus:null
      }
    }
  },
  created () {
    this.config({
      module: '车辆信息表',
      api: '/business/cars',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    // åŒæ­¥ä¿¡æ¯
    startEmpowerBatch () {
      if (this.tableData.selectedRows.length === 0) {
        this.$tip.warning('请至少选择一条数据')
        return
      }
      var ids = []
      var codes = []
      this.tableData.selectedRows.forEach(item => {
        ids.push(item.id)
        codes.push(item.code)
      })
      this.$refs.operaCarAuthWindow.open('车辆下发授权', ids, codes)
    },
  }
}
</script>
admin/src/views/vehicle/parkBook.vue
@@ -5,11 +5,11 @@
            <el-form-item label="车牌号" prop="carCode">
                <el-input v-model="searchForm.carCode" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="员工姓名/手机号" prop="memberName">
            <el-form-item label="车主姓名/手机号" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="请输入员工姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="部门" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入部门" @keypress.enter.native="search"></el-input>
            <el-form-item label="车主组织" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入车主组织" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="停车库名称" prop="parksName">
                <el-input v-model="searchForm.parksName" placeholder="请输入停车库名称" @keypress.enter.native="search"></el-input>
admin/vue.config.js
@@ -24,8 +24,6 @@
    }
  },
  configureWebpack: {
    // provide the app's title in webpack's name field, so that
    // it can be accessed in index.html to inject the correct title.
    resolve: {
      alias: {
        '@': resolve('src')
server/visits/dmvisit_admin/src/main/java/com/doumee/api/business/CarsController.java
@@ -45,7 +45,7 @@
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:cars:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        carsService.deleteById(id);
        carsService.deleteById(id,getLoginUser(null));
        return ApiResponse.success(null);
    }
@@ -58,7 +58,7 @@
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        carsService.deleteByIdInBatch(idList);
        carsService.deleteByIdInBatch(idList,getLoginUser(null));
        return ApiResponse.success(null);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/CarsCloudController.java
@@ -38,6 +38,7 @@
    @PostMapping("/create")
    @CloudRequiredPermission("business:cars:create")
    public ApiResponse create(@RequestBody Cars cars,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        cars.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(carsService.create(cars));
    }
@@ -45,7 +46,7 @@
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:cars:delete")
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        carsService.deleteById(id);
        carsService.deleteById(id,this.getLoginUser(token));
        return ApiResponse.success(null);
    }
@@ -58,7 +59,7 @@
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        carsService.deleteByIdInBatch(idList);
        carsService.deleteByIdInBatch(idList,this.getLoginUser(token));
        return ApiResponse.success(null);
    }
@@ -66,6 +67,7 @@
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:cars:update")
    public ApiResponse updateById(@RequestBody Cars cars,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        cars.setLoginUserInfo(this.getLoginUser(token));
        carsService.updateById(cars);
        return ApiResponse.success(null);
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/HiddenDangerCloudController.java
@@ -83,4 +83,21 @@
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(hiddenDangerService.findById(id));
    }
    @ApiOperation("隐患处理")
    @PostMapping("/dealHiddenDanger")
    public ApiResponse dealHiddenDanger (@RequestBody HiddenDanger hiddenDanger,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        hiddenDanger.setLoginUserInfo(getLoginUser(token));
        hiddenDangerService.dealHiddenDanger(hiddenDanger);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("隐患转交")
    @PostMapping("/transferHiddenDanger")
    public ApiResponse transferHiddenDanger (@RequestBody HiddenDanger hiddenDanger,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        hiddenDanger.setLoginUserInfo(getLoginUser(token));
        hiddenDangerService.transferHiddenDanger(hiddenDanger);
        return ApiResponse.success("操作成功");
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/ParkBookCloudController.java
@@ -8,10 +8,12 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.ParkBook;
import com.doumee.service.business.ParkBookService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -35,7 +37,16 @@
    @PostMapping("/create")
    @CloudRequiredPermission("business:parkbook:create")
    public ApiResponse create(@RequestBody ParkBook parkBook,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        parkBook.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(parkBookService.create(parkBook));
    }
    @PreventRepeat
    @ApiOperation("批量下发授权")
    @PostMapping("/batchAuth")
    @CloudRequiredPermission("business:parkbook:create")
    public ApiResponse batchAuth(@RequestBody Cars cars, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        cars.setLoginUserInfo(this.getLoginUser(token));
        return ApiResponse.success(parkBookService.batchAuth(cars));
    }
    @ApiOperation("根据ID删除")
@@ -63,6 +74,7 @@
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:parkbook:update")
    public ApiResponse updateById(@RequestBody ParkBook parkBook,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        parkBook.setLoginUserInfo(this.getLoginUser(token));
        parkBookService.updateById(parkBook);
        return ApiResponse.success(null);
    }
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Cars.java
@@ -11,6 +11,7 @@
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
 * è½¦è¾†ä¿¡æ¯è¡¨
@@ -29,7 +30,7 @@
    @ApiModelProperty(value = "创建人编码")
    @ExcelColumn(name="创建人编码")
    private String creator;
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
@@ -37,15 +38,27 @@
    @ApiModelProperty(value = "更新人编码")
    @ExcelColumn(name="更新人编码")
    private String edirot;
    private Integer edirot;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "授权开始时间")
    @ExcelColumn(name="授权开始时间")
    private Date startTime;
    @ApiModelProperty(value = "授权结束时间")
    @ExcelColumn(name="授权结束时间")
    private Date endTime;
    @ApiModelProperty(value = "最后一次进厂时间")
    @ExcelColumn(name="最后一次进厂时间")
    private Date lastInDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "授权时间类型  0长期有效 1自定义 2车主有效期", example = "1")
    @ExcelColumn(name="授权时间类型  0长期有效 1自定义 2车主有效期")
    private Integer authTimeType;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
@@ -63,13 +76,10 @@
    @ExcelColumn(name="车牌号")
    private String code;
    @ApiModelProperty(value = "车库编码(关联parks)", example = "1")
    @ExcelColumn(name="车库编码(关联parks)")
    private Integer parkId;
    @ApiModelProperty(value = "授权停车编码集合(关联parks)", example = "1")
    @ExcelColumn(name="授权停车编码集合(关联parks)")
    private String parkId;
    @ApiModelProperty(value = "海康标识", example = "1")
    @ExcelColumn(name="海康标识")
    private String hkId2;
    @ApiModelProperty(value = "海康同步状态 0未同步 1已同步", example = "1")
    @ExcelColumn(name="海康同步状态 0未同步 1已同步")
@@ -95,38 +105,14 @@
    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
    @ExcelColumn(name="状态 0禁用 1启用")
    private Integer status;
    @ApiModelProperty(value = "授权状态 0否 1是", example = "1")
    @ExcelColumn(name="授权状态  0否 1是")
    private Integer authStatus;
    @ApiModelProperty(value = "所属分组编码(关联car_group)", example = "1")
    @ExcelColumn(name="所属分组编码(关联car_group)")
    private Integer groupId;
    @ApiModelProperty(value = "授权时间类型  0长期有效 1自定义 2车主有效期", example = "1")
    @ExcelColumn(name="授权时间类型  0长期有效 1自定义 2车主有效期")
    private Integer authTimeType;
    //
//    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
//    @ExcelColumn(name="状态 0禁用 1启用")
//    private Integer status;
//
//
//    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
//    @ExcelColumn(name="状态 0禁用 1启用")
//    private Integer status;
//
//    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
//    @ExcelColumn(name="状态 0禁用 1启用")
//    private Integer status;
//
//    @ApiModelProperty(value = "状态 0禁用 1启用", example = "1")
//    @ExcelColumn(name="状态 0禁用 1启用")
//    private Integer status;
    @ApiModelProperty(value = "类型 0员工车辆 1安泰公务车 2自有物流车3外协物流车 4市公司物流车 5市公司注册车辆", example = "1")
    @ExcelColumn(name="类型 0员工车辆 1安泰公务车 2自有物流车3外协物流车 4市公司物流车 5市公司注册车辆")
@@ -134,10 +120,14 @@
    @ApiModelProperty(value = "停车场名称", example = "1")
    @ExcelColumn(name="停车场名称")
    @ApiModelProperty(value = "停车场名称集合", example = "1")
    @ExcelColumn(name="停车场名称集合")
    @TableField(exist = false)
    private String parksName;
    @ApiModelProperty(value = "编辑人姓名", example = "1")
    @ExcelColumn(name="编辑人姓名")
    @TableField(exist = false)
    private String editorName;
    @ApiModelProperty(value = "用户类型 0劳务访客 1普通访客  2内部人员", example = "1")
    @ExcelColumn(name="用户类型 0劳务访客 1普通访客  2内部人员")
@@ -148,6 +138,9 @@
    @ExcelColumn(name="姓名")
    @TableField(exist = false)
    private String memberName;
    @ApiModelProperty(value = "车主海康编码", example = "1")
    @TableField(exist = false)
    private String memberHkId;
    @ApiModelProperty(value = "手机号", example = "1")
    @ExcelColumn(name="手机号")
@@ -158,5 +151,28 @@
    @ExcelColumn(name="部门")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "车主是否删除", example = "1")
    @TableField(exist = false)
    private Integer memberDeleted;
    @ApiModelProperty(value = "车主授权有效期开始", example = "1")
    @TableField(exist = false)
    private Date memberStartTime;
    @ApiModelProperty(value = "车主授权有效期结束", example = "1")
    @TableField(exist = false)
    private Date memberEndTime;
    @ApiModelProperty(value = "车主授权状态", example = "1")
    @TableField(exist = false)
    private Integer memberAuthStatus;
    @ApiModelProperty(value = "授权停车场编码集合", example = "1")
    @TableField(exist = false)
    private List<Integer> parkIdList;
    @ApiModelProperty(value = "车辆编码集合", example = "1")
    @TableField(exist = false)
    private List<Integer> idList;
    @ApiModelProperty(value = "车辆包期记录集合", example = "1")
    @TableField(exist = false)
    private  List<ParkBook> parkBookList;
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java
@@ -137,6 +137,9 @@
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date submitTime;
    @ApiModelProperty(value = "处理时间(整改/退回使用)")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dealTime;
    @ApiModelProperty(value = "附件信息")
    @TableField(exist = false)
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ParkBook.java
@@ -11,6 +11,7 @@
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
 * è½¦è¾†é¢„约记录信息表
@@ -29,7 +30,7 @@
    @ApiModelProperty(value = "创建人编码")
    @ExcelColumn(name="创建人编码")
    private String creator;
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
@@ -135,9 +136,7 @@
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "停车库海康编码", example = "1")
    @ExcelColumn(name="停车库海康编码")
    @TableField(exist = false)
    private String parkHkId;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/CarsService.java
@@ -1,5 +1,6 @@
package com.doumee.service.business;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.admin.request.CarsQuery;
@@ -27,7 +28,7 @@
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    void deleteById(Integer id, LoginUserInfo user);
    /**
     * åˆ é™¤
@@ -41,7 +42,7 @@
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
    /**
     * ä¸»é”®æ›´æ–°
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/HiddenDangerService.java
@@ -94,4 +94,8 @@
     * @return long
     */
    long count(HiddenDanger hiddenDanger);
    void dealHiddenDanger(HiddenDanger hiddenDanger);
    void transferHiddenDanger(HiddenDanger hiddenDanger);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/ParkBookService.java
@@ -2,6 +2,7 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Cars;
import com.doumee.dao.business.model.ParkBook;
import java.util.List;
@@ -96,4 +97,6 @@
    long count(ParkBook parkBook);
    void reUpdate(ParkBook parkBook);
    String batchAuth(Cars parkBook);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -4,6 +4,9 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
@@ -11,18 +14,22 @@
import com.doumee.dao.admin.request.CarsQuery;
import com.doumee.dao.admin.response.CarsDTO;
import com.doumee.dao.business.CarsMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.join.CarJoinMapper;
import com.doumee.dao.business.join.ParkBookJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CarsService;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.*;
/**
 * è½¦è¾†ä¿¡æ¯è¡¨Service实现
@@ -37,19 +44,117 @@
    @Autowired
    private CarJoinMapper carJoinMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ParkBookJoinMapper parkBookJoinMapper;
    @Override
    public Integer create(Cars cars) {
        carsMapper.insert(cars);
        return cars.getId();
    public Integer create(Cars model) {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(loginUserInfo == null){
            loginUserInfo = model.getLoginUserInfo();
        }
        if(StringUtils.isBlank(model.getCode())
            ||model.getType()==null
            ||model.getType()<0
            ||model.getType()>3
        ){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(model.getMemberId()!=null){
            //检查车主信息
            Member member =memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                    .eq(Member::getId,model.getMemberId() )
                    .eq(Member::getType,Constants.TWO )
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .last("limit 1"));
            if(member == null){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,车主信息不存在,请返回刷新重试!");
            }
            model.setMemberHkId(member.getHkId());
        }
        //检查车牌号是否重复
        if(carsMapper.selectCount(new QueryWrapper<Cars>().lambda()
                .eq(Cars::getCode,model.getCode() )
                .eq(Cars::getIsdeleted,Constants.ZERO )
        ) >0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,车辆已经录入,不能重复录入!");
        }
        model.setType(Constants.formatIntegerNum(model.getType()));
        model.setCreateDate(new Date());
        model.setCreator(loginUserInfo.getId());
        model.setEditDate(new Date());
        model.setEdirot(loginUserInfo.getId());
        model.setStatus(Constants.ZERO);
        model.setIsdeleted(Constants.ZERO);
        model.setHkStatus(Constants.ZERO);
        model.setAuthStatus(Constants.ZERO);
        model.setRemark("");
//        model.setHkDate(model.getCreateDate());
//        model.setHkId(UUID.randomUUID().toString().replace("-",""));
        carsMapper.insert(model);
        return model.getId();
    }
    @Override
    public void deleteById(Integer id) {
        carsMapper.deleteById(id);
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void deleteById(Integer id, LoginUserInfo user) {
        Cars car = carJoinMapper.selectById(id);
        if(car ==null ||Constants.equalsInteger(car.getIsdeleted(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,车辆信息不存在!");
        }
        Date date = new Date();
        //删除已授权下发的包期授权
        dealCancelBookBiz(car.getCode(),date);
        Cars model = new Cars();
        model.setEditDate(date);
        model.setEdirot(user.getId());
        model.setId(id);
        model.setIsdeleted(Constants.ONE);
        carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                .eq(Cars::getId,model.getId())
                .set(Cars::getStartTime,null)
                .set(Cars::getEndTime,null)
                .set(Cars::getAuthStatus,Constants.ZERO)
                .set(Cars::getIsdeleted,Constants.ONE)
                .set(Cars::getEditDate,model.getEditDate())
                .set(Cars::getEdirot,model.getEdirot())
        );
        carsMapper.updateById(model);
    }
    public   boolean  dealCancelBookBiz(String code,Date date){
        List<ParkBook> parkBooks = parkBookJoinMapper.selectJoinList(ParkBook.class,new MPJLambdaWrapper<ParkBook>()
                .selectAll(ParkBook.class )
                .selectAs(Parks::getHkId,ParkBook::getParkHkId )
                .leftJoin(Parks.class,Parks::getId,ParkBook::getParkId)
                .eq(ParkBook::getCarCode,code)
                .eq(ParkBook::getIsdeleted,Constants.ZERO ));
        if(parkBooks !=null){
            for(ParkBook c : parkBooks){
                //如果取消预约,则进行取消包期
                if(StringUtils.isNotBlank(c.getParkHkId())
                        && StringUtils.isNotBlank(c.getCarCode())){
                    boolean result = HkSyncParkServiceImpl.cancelParkBookHk(c);
                    if(!result){
                        throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,取消已下发授权失败,请联系管理员处理~");
                    }
                    c.setHkStatus(Constants.ONE);
                    c.setRemark("取消包期成功");
                }else{
                    c.setHkStatus(Constants.TWO);//下发失败
                    c.setRemark("无效停车场授权下发,取消包期失败,直接删除记录");
                }
                c.setHkDate(date);
                c.setIsdeleted(Constants.ONE);
                parkBookJoinMapper.updateById(c);
            }
        }
        return true;
    }
    @Override
@@ -59,16 +164,74 @@
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        carsMapper.deleteBatchIds(ids);
        for(Integer id : ids){
            deleteById(id,user);
        }
    }
    @Override
    public void updateById(Cars cars) {
        carsMapper.updateById(cars);
    public void updateById(Cars model) {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(loginUserInfo == null){
            loginUserInfo = model.getLoginUserInfo();
        }
        if(StringUtils.isBlank(model.getCode())
                ||model.getId()==null
                ||model.getType()==null
                ||model.getType()<0
                ||model.getType()>3
        ){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Cars car = carJoinMapper.selectById(model.getId());
        if(car ==null ||Constants.equalsInteger(car.getIsdeleted(),Constants.ONE)){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,车辆信息不存在!");
        }
        if(model.getMemberId()!=null){
            //检查车主信息
            Member member =memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                    .eq(Member::getId,model.getMemberId() )
                    .eq(Member::getType,Constants.TWO )
                    .eq(Member::getIsdeleted,Constants.ZERO)
                    .last("limit 1"));
            if(member == null){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,车主信息不存在,请返回刷新重试!");
            }
            model.setMemberHkId(member.getHkId());
        }
        //检查车牌号是否重复
        if(carsMapper.selectCount(new QueryWrapper<Cars>().lambda()
                .eq(Cars::getCode,model.getCode() )
                .ne(Cars::getId,model.getId() )
                .eq(Cars::getIsdeleted,Constants.ZERO )
        ) >0){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,车辆已经录入,不能重复录入!");
        }
        model.setType(Constants.formatIntegerNum(model.getType()));
        model.setEditDate(new Date());
        model.setEdirot(loginUserInfo.getId());
        model.setIsdeleted(Constants.ZERO);
        model.setHkStatus(Constants.ZERO);
        model.setRemark("");
        model.setAuthStatus(Constants.ZERO);
        dealCancelBookBiz(model.getCode(),model.getEditDate());
        carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                .eq(Cars::getId,model.getId())
                .set(Cars::getAuthStatus,Constants.ZERO)
                .set(Cars::getType,model.getType())
                .set(Cars::getCode,model.getCode())
                .set(Cars::getEditDate,model.getEditDate())
                .set(Cars::getEdirot,model.getEdirot())
                .set(Cars::getMemberId,model.getMemberId())
                .set(Cars::getStartTime,null)
                .set(Cars::getEndTime,null)
        );
    }
    @Override
@@ -103,31 +266,56 @@
    public PageData<Cars> findPage(PageWrap<Cars> pageWrap) {
        IPage<Cars> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Cars> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Cars.class);
        queryWrapper.selectAs(Parks::getName,Cars::getParksName);
        queryWrapper.selectAs(Member::getType,Cars::getMemberType);
        queryWrapper.selectAs(Member::getName,Cars::getMemberName);
        queryWrapper.selectAs(SystemUser::getRealname,Cars::getEditorName);
        queryWrapper.selectAs(Member::getPhone,Cars::getMemberPhone);
        queryWrapper.selectAs(Company::getName,Cars::getCompanyName);
        queryWrapper.leftJoin(Parks.class,Parks::getId,Cars::getParkId);
        queryWrapper.selectAs(Company::getCompanyNamePath,Cars::getCompanyName);
        queryWrapper.leftJoin(Member.class,Member::getId,Cars::getMemberId);
        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Cars::getEdirot);
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
                .or().like(Member::getPhone,pageWrap.getModel().getMemberName()));
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getName,pageWrap.getModel().getCompanyName());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCompanyName()),Company::getCompanyNamePath,pageWrap.getModel().getCompanyName());
        queryWrapper.eq(Objects.nonNull(pageWrap.getModel().getMemberType()),Member::getType,pageWrap.getModel().getMemberType());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()),Cars::getCode,pageWrap.getModel().getCode());
        queryWrapper.eq(Cars::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(pageWrap.getModel().getType()!=null,Cars::getType,pageWrap.getModel().getType());
        queryWrapper.eq(pageWrap.getModel().getAuthStatus()!=null,Cars::getAuthStatus,pageWrap.getModel().getAuthStatus());
        queryWrapper.orderByDesc(Cars::getCreateDate);
        IPage<Cars> result = carJoinMapper.selectJoinPage(page, Cars.class,queryWrapper);
        if(result!=null && result.getRecords()!=null && result.getRecords().size()>0){
            List<String> codes = new ArrayList<>();
            for(Cars cars :result.getRecords()){
                codes.add(cars.getCode());
            }
            List<ParkBook> parkBooks = parkBookJoinMapper.selectJoinList(ParkBook.class,new MPJLambdaWrapper<ParkBook>()
                    .selectAll(ParkBook.class)
                    .selectAs(Parks::getName,ParkBook::getParksName)
                    .leftJoin(Parks.class,Parks::getId,ParkBook::getParkId)
                    .in(ParkBook::getCarCode,codes)
                    .eq(ParkBook::getIsdeleted,Constants.ZERO) );
            for(Cars cars :result.getRecords()){
               cars.setParkBookList(getParkbookListByCode(cars.getCode(),parkBooks));
            }
        }
        return PageData.from(result);
    }
    private List<ParkBook> getParkbookListByCode(String code, List<ParkBook> parkBooks) {
        List<ParkBook> list =null;
        for(ParkBook p : parkBooks){
            if(StringUtils.equals(p.getCarCode(),code)){
                if(list == null){
                    list = new ArrayList<>();
                }
                list.add(p);
            }
        }
        return  list;
    }
    @Override
    public long count(Cars cars) {
        QueryWrapper<Cars> wrapper = new QueryWrapper<>(cars);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -11,17 +11,20 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.HiddenDangerLogMapper;
import com.doumee.dao.business.HiddenDangerMapper;
import com.doumee.dao.business.HiddenDangerParamMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.MultifileMapper;
import com.doumee.dao.system.model.Multifile;
import com.doumee.service.business.HiddenDangerLogService;
import com.doumee.service.business.HiddenDangerService;
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.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.*;
@@ -46,11 +49,14 @@
    @Autowired
    private HiddenDangerParamMapper hiddenDangerParamMapper;
    @Autowired
    private HiddenDangerLogMapper hiddenDangerLogMapper;
    @Override
    public Integer create(HiddenDanger hiddenDanger) {
        if(Objects.isNull(hiddenDanger)
            || Objects.isNull(hiddenDanger.getCreator())
            || Objects.isNull(hiddenDanger.getLoginUserInfo())
            || Objects.isNull(hiddenDanger.getAreaId())
            || Objects.isNull(hiddenDanger.getCateId())
            || Objects.isNull(hiddenDanger.getApplyCheckUserId())
@@ -65,6 +71,7 @@
        if(Objects.isNull(hiddenDangerParam)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到隐患区域");
        }
        hiddenDanger.setCreator(hiddenDanger.getLoginUserInfo().getId());
        hiddenDanger.setAreaName(hiddenDangerParam.getName());
        hiddenDanger.setStatus(Constants.ZERO);
        if(StringUtils.isBlank(hiddenDangerParam.getMemberIds())
@@ -72,6 +79,15 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"隐患区域与处理人不匹配");
        }
        hiddenDangerMapper.insert(hiddenDanger);
        //存储 æ“ä½œæ—¥å¿—
        HiddenDangerLog hiddenDangerLog = new HiddenDangerLog();
        hiddenDangerLog.setIsdeleted(Constants.ZERO);
        hiddenDangerLog.setCreateDate(new Date());
        hiddenDangerLog.setCreator(hiddenDanger.getCreator());
        hiddenDangerLog.setHiddenDangerId(hiddenDanger.getId());
        hiddenDangerLog.setObjType(Constants.ZERO);
        hiddenDangerLogMapper.insert(hiddenDangerLog);
        List<Multifile> multifiles  = hiddenDanger.getMultifileList();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifiles)){
            for (int i = 0; i < multifiles.size(); i++) {
@@ -258,4 +274,115 @@
        QueryWrapper<HiddenDanger> wrapper = new QueryWrapper<>(hiddenDanger);
        return hiddenDangerMapper.selectCount(wrapper);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void dealHiddenDanger(HiddenDanger hiddenDanger){
        if(Objects.isNull(hiddenDanger)
            || Objects.isNull(hiddenDanger.getId())
            || Objects.isNull(hiddenDanger.getDealTime())
            || Objects.isNull(hiddenDanger.getLoginUserInfo())
            || Objects.isNull(hiddenDanger.getStatus())
            ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        HiddenDanger model = hiddenDangerMapper.selectById(hiddenDanger.getId());
        if(Objects.isNull(model)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到隐患数据");
        }
        if (!model.getStatus().equals(Constants.ZERO)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转!");
        }
        if (!model.getCheckUserId().equals(hiddenDanger.getEditor())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"处理人非当前人员!");
        }
        if(!(hiddenDanger.getStatus().equals(Constants.ONE)||hiddenDanger.getStatus().equals(Constants.TWO))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"业务类型错误!");
        }
        //整改前文件
        if(hiddenDanger.getStatus().equals(Constants.ONE)){
            List<Multifile> beforList = hiddenDanger.getDealBeforeFileList();
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(beforList)){
                for (int i = 0; i < beforList.size(); i++) {
                    Multifile multifile = beforList.get(i);
                    multifile.setCreateDate(new Date());
                    multifile.setCreator(hiddenDanger.getEditor());
                    multifile.setIsdeleted(Constants.ZERO);
                    multifile.setObjId(hiddenDanger.getId());
                    multifile.setObjType(Constants.multifileObjType.one);
                    multifile.setSortnum(i+1);
                    multifileMapper.insert(multifile);
                }
            }
        }
        List<Multifile> afterList = hiddenDanger.getDealAfterFileList();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(afterList)){
            for (int i = 0; i < afterList.size(); i++) {
                Multifile multifile = afterList.get(i);
                multifile.setCreateDate(new Date());
                multifile.setCreator(hiddenDanger.getEditor());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(hiddenDanger.getId());
                multifile.setObjType(Constants.multifileObjType.two);
                multifile.setSortnum(i+1);
                multifileMapper.insert(multifile);
            }
        }
        hiddenDanger.setEditor(hiddenDanger.getLoginUserInfo().getId());
        hiddenDanger.setEditDate(new Date());
        hiddenDangerMapper.updateById(hiddenDanger);
        //存储 æ“ä½œæ—¥å¿—
        HiddenDangerLog hiddenDangerLog = new HiddenDangerLog();
        hiddenDangerLog.setIsdeleted(Constants.ZERO);
        hiddenDangerLog.setCreateDate(new Date());
        hiddenDangerLog.setCreator(hiddenDanger.getCreator());
        hiddenDangerLog.setHiddenDangerId(hiddenDanger.getId());
        hiddenDangerLog.setObjType(hiddenDanger.getStatus().equals(Constants.ONE)?Constants.FOUR:Constants.TWO);
        hiddenDangerLogMapper.insert(hiddenDangerLog);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void transferHiddenDanger(HiddenDanger hiddenDanger){
        if(Objects.isNull(hiddenDanger)
                || Objects.isNull(hiddenDanger.getId())
                || Objects.isNull(hiddenDanger.getDealTime())
                || Objects.isNull(hiddenDanger.getLoginUserInfo())
                || Objects.isNull(hiddenDanger.getCheckUserId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        HiddenDanger model = hiddenDangerMapper.selectById(hiddenDanger.getId());
        if(Objects.isNull(model)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到隐患数据");
        }
        if (!model.getStatus().equals(Constants.ZERO)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转!");
        }
        if (!model.getCheckUserId().equals(hiddenDanger.getEditor())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"处理人非当前人员!");
        }
        if(!(hiddenDanger.getStatus().equals(Constants.ONE)||hiddenDanger.getStatus().equals(Constants.TWO))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"业务类型错误!");
        }
        if(model.getCheckUserId().equals(hiddenDanger.getCheckUserId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无法转交给自己");
        }
        hiddenDanger.setEditor(hiddenDanger.getLoginUserInfo().getId());
        hiddenDanger.setEditDate(new Date());
        hiddenDangerMapper.updateById(hiddenDanger);
        //存储 æ“ä½œæ—¥å¿—
        HiddenDangerLog hiddenDangerLog = new HiddenDangerLog();
        hiddenDangerLog.setIsdeleted(Constants.ZERO);
        hiddenDangerLog.setCreateDate(new Date());
        hiddenDangerLog.setCreator(hiddenDanger.getCreator());
        hiddenDangerLog.setHiddenDangerId(hiddenDanger.getId());
        hiddenDangerLog.setObjType(Constants.ONE);
        hiddenDangerLogMapper.insert(hiddenDangerLog);
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -202,6 +202,7 @@
        insert.setCanVisit(Constants.ZERO);//默认不可访问
        insert.setAuthStatus(Constants.ZERO);
        insert.setName(member.getName());
        insert.setHkId(UUID.randomUUID().toString().replace("-",""));
        insert.setHkStatus(Constants.ONE);
        insert.setSex(Constants.getSexByCardNo( member.getIdcardNo()));//根据身份证号获取性别
        insert.setBirthday( DateUtil.fromStringToDate("yyyyMMdd",IdcardUtil.getBirthByIdCard(member.getIdcardNo())));
@@ -472,6 +473,10 @@
        }
        member.setHkId(model.getHkId());
        member.setFaceId(model.getFaceId());//人脸编码
        if(StringUtils.equals(model.getFaceImg(),member.getFaceImg())){
            //如果人脸没变化
            member.setFaceImg(null);
        }
        return model;
    }
@@ -529,9 +534,7 @@
    }
    @Override
    public void deleteById(Integer id,LoginUserInfo user) {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
    public void deleteById(Integer id,LoginUserInfo loginUserInfo) {
        Member member=new Member();
        member.setId(id);
        member.setIsdeleted(Constants.ZERO);
@@ -586,12 +589,12 @@
                //如果员工信息不合法直接跳过
               continue;
            }
            if(StringUtils.isNotBlank(member.getFaceId()) || !Constants.equalsInteger(member.getFaceStatus(),Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,用户【"+member.getName()+"】的人脸信息不满足授权条件,请返回完善后再进行该操作!");
            }
            member.setStartTime(memberRole.getStartTime());
            member.setEndTime(memberRole.getEndTime());
            Integer ischange = getRoleIdByParam(memberRole.getRoleIds(),member,memberRoleMapper,deviceRoleMapper);
            if(ischange == 0){
                return;//未发现权限变化,直接返回
            }
            if(memberRole.getRoleIds()!=null && memberRole.getRoleIds().length>0 && StringUtils.isBlank(member.getRoleId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,未查询到有效门禁组数据");
            }
@@ -1830,17 +1833,20 @@
    private void dealHkUserBizBatch(List<Member> newList) {
        List<String> hkIds = new ArrayList<>();
        try {
            for(Member insert: newList){
                if(dealHkUserBiz(insert)){
                    //创建系统登陆账号(默认无任何角色)
                }else{
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息【"+insert.getName()+"】同步安防平台失败,请稍后重试!");
                }
            }
            memberMapper.insertBatchSomeColumn(newList);
            List<SystemUser> userList = new ArrayList<>();
            for(Member insert: newList){
                if(dealHkUserBiz(insert)){
                    //创建系统登陆账号(默认无任何角色)
                    if(Constants.equalsInteger(insert.getCompanyType(),Constants.ONE)){
                        //如果是内部组织人员,新增系统登陆账号
                        userList.add(createSystemUser(insert));
                    }
                }else{
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息【"+insert.getName()+"】同步安防平台失败,请稍后重试!");
                }
            }
            if(userList.size()>0){
@@ -1852,7 +1858,6 @@
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息导入失败,请稍后重试!");
        }
    }
    private Member checkModelParam(MemberImport model, List<Member> newList
            ,int index
            ,LoginUserInfo loginUserInfo
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ParkBookServiceImpl.java
@@ -7,7 +7,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CarsMapper;
import com.doumee.dao.business.ParkBookMapper;
import com.doumee.dao.business.ParksMapper;
import com.doumee.dao.business.join.ParkBookJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.ParkBookService;
@@ -21,10 +23,13 @@
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * è½¦è¾†é¢„约记录信息表Service实现
@@ -37,7 +42,11 @@
    @Autowired
    private ParkBookMapper parkBookMapper;
    @Autowired
    private CarsMapper carsMapper;
    @Autowired
    private HkSyncParkServiceImpl hkSyncParkService;
    @Autowired
    private ParksMapper parksMapper;
    @Autowired
    private ParkBookJoinMapper parkBookJoinMapper;
@@ -112,6 +121,111 @@
       }
        hkSyncParkService.syncParkBookBySingleModel(model);
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public   String batchAuth(Cars cars) {
        if(cars.getIdList() == null || cars.getIdList() == null
                ||cars.getAuthTimeType() == null
                ||cars.getAuthTimeType()>2
                ||cars.getAuthTimeType()<0 ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        MPJLambdaWrapper<Cars> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(Cars.class);
        queryWrapper.selectAs(Member::getStartTime,Cars::getMemberStartTime);
        queryWrapper.selectAs(Member::getEndTime,Cars::getMemberEndTime);
        queryWrapper.selectAs(Member::getIsdeleted,Cars::getMemberDeleted);
        queryWrapper.selectAs(Member::getAuthStatus,Cars::getMemberAuthStatus);
        queryWrapper.leftJoin(Member.class,Member::getId,Cars::getMemberId);
        queryWrapper.eq(Cars::getIsdeleted,Constants.ZERO)
                .in(Cars::getId,cars.getIdList());
        List<Cars> carsList = carsMapper.selectList( queryWrapper);
       if(carsList== null || carsList.size() ==0){
           throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"车辆信息有误,请返回刷新页面重试!");
       }
        List<Parks> parksList = null;
       if(cars.getParkIdList()!=null && cars.getParkIdList().size() > 0){
           MPJLambdaWrapper<Parks> queryWrapper1 = new MPJLambdaWrapper<>();
           queryWrapper1.selectAll(Parks.class);
           queryWrapper1.eq(Parks::getIsdeleted,Constants.ZERO)
                   .in(Parks::getId,cars.getParkIdList());
          parksList = parksMapper.selectList( queryWrapper1);
           if(parksList== null || parksList.size() ==0){
               throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"停车场信息有误,请返回刷新页面重试!");
           }
       }
        if(Constants.equalsInteger(cars.getAuthTimeType(),Constants.ONE)){
            if( cars.getStartTime() ==null || cars.getEndTime() == null ){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请填写正确的有效期范围");
            }
            if( cars.getEndTime().getTime() < System.currentTimeMillis()){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"有效期截止日期不能小于当前时间!");
            }
            if(cars.getEndTime().getTime() <= cars.getStartTime().getTime()){
                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"有效期截止日期不能小于开始时间!");
            }
        }
       Date date = new Date();
       for(Cars model : carsList){
           Date startTime = cars.getStartTime();
           Date endTime = cars.getEndTime();
           if(Constants.equalsInteger(cars.getAuthTimeType(),Constants.TWO)){
                if(!Constants.equalsInteger(model.getMemberAuthStatus(),Constants.ONE)){
                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,车辆【"+model.getCode()+"】车主尚未授权门禁信息,授权无法【跟随车主】有效期!");
                }
                startTime = model.getMemberStartTime();
                endTime=model.getMemberEndTime();
           }
           model.setAuthTimeType(cars.getAuthTimeType());
           model.setStartTime(startTime);
           model.setEndTime(endTime);
           dealCarAuthByModel(model,cars.getLoginUserInfo(),parksList,date);
           model.setAuthStatus(Constants.ONE);//已授权
           carsMapper.update(null,new UpdateWrapper<Cars>().lambda()
                   .eq(Cars::getId,model.getId())
                   .set(Cars::getEditDate,date)
                   .set(Cars::getEdirot,cars.getLoginUserInfo().getId())
                   .set(Cars::getAuthStatus,Constants.ONE)
                   .set(Cars::getStartTime,startTime)
                   .set(Cars::getEndTime,endTime)
           );
       }
       return  "授权成功";
    }
    private int dealCarAuthByModel(Cars model, LoginUserInfo loginUserInfo, List<Parks> parksList,Date date) {
        //删除车量库记录数据
        parkBookMapper.update(null,new UpdateWrapper<ParkBook>().lambda()
                .eq(ParkBook::getCarCode,model.getCode())
                .set(ParkBook::getIsdeleted,Constants.ONE)
                .set(ParkBook::getHkStatus,Constants.ZERO)
        );
        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(parksList)){
            List<ParkBook> parkBookList = new ArrayList<>();
            for (Parks parks:parksList) {
                ParkBook parkBook = new ParkBook();
                parkBook.setIsdeleted(Constants.ZERO);
                parkBook.setCreateDate(date);
                parkBook.setCreator(loginUserInfo.getId());
                parkBook.setEditor(loginUserInfo.getId());
                parkBook.setEditDate(date);
                parkBook.setCarCode(model.getCode());
                parkBook.setParkId(parks.getId());
                parkBook.setOrigin(Constants.ZERO);
                parkBook.setStartTime(model.getStartTime());
                parkBook.setEndTime(model.getEndTime());
                parkBook.setTimeType(model.getAuthTimeType());
                parkBook.setMemberId(model.getMemberId());
                parkBook.setHkStatus(Constants.ZERO);
                parkBook.setRemark("待同步安防平台");
                parkBookList.add(parkBook);
            }
            parkBookMapper.insertBatchSomeColumn(parkBookList);
        }
        return 0;
    }
    @Override
    public ParkBook findOne(ParkBook parkBook) {
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java
@@ -152,7 +152,7 @@
            return  false;
        }
    }
    private boolean cancelParkBookHk(ParkBook c) {
    public static boolean cancelParkBookHk(ParkBook c) {
        CarChargeDelRequest param = new CarChargeDelRequest();
        param.setPlateNo(c.getCarCode());
        param.setParkSyscode(c.getParkHkId());
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/ferp/HkSyncOrgUserToHKServiceImpl.java
@@ -861,12 +861,14 @@
        model.setOrgIndexCode(c.getHkOrgId());
        model.setJobNo(c.getCode());
        model.setPhoneNo(c.getPhone());
        if(StringUtils.isNotBlank(c.getIdcardNo())){
        model.setCertificateNo(DESUtil.decrypt(Constants.EDS_PWD, c.getIdcardNo()));
        }
        model.setCertificateType(HKConstants.CertificateType.SHENFENZHENG.getKey()+"");
        model.setPersonId(type == 0 ?UUID.randomUUID().toString().replace("-", ""):c.getHkId());
        model.setGender(Constants.formatIntegerNum(c.getSex())+"");
        model.setPersonName(c.getName());
        if(type== 0 && StringUtils.isNotBlank(c.getFaceImg())){
        if(StringUtils.isNotBlank(c.getFaceImg())){
            model.setFaces(new ArrayList<>());
            UserAddFaceRequest face = new UserAddFaceRequest();
            String imageBase = ImageBase64Util.Image2Base64(path+c.getFaceImg());