k94314517
2024-10-09 8f2ad5eb040a2f3f1cae62a9c099c8f5f66750e1
Merge remote-tracking branch 'origin/master'
已添加10个文件
已删除2个文件
已修改36个文件
1945 ■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.production 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.test 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/category.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/company.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/platformEvent.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 158 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCategoryWindow.vue 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaTrainTimeImportWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/user/RoleConfigWindow.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/category.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/platformEvent.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/relativeMember.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitorManagement.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/leaveAuth.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/queueUp.vue 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformRecord.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/cars.vue 250 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/category.vue 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/components/OperaCategoryWindow.vue 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/vehicle/parkBook.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/waybill/waybillDetail.vue 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/driver/ic_dangqian.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/driver/ic_mostarted.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/driver/wuliuche_bg@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/pages/index/config.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/pages/index/index.vue 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/release/apk/__UNI__EF8BAA7__20241008151948.apk 补丁 | 查看 | 原始文档 | blame | 历史
screen/src/views/PlatformCall.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformDeviceCloudController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformEventCloudController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventPlatformCarsStatusInfoRequest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/PlatformCameraInfoResponse.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformEventMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformEvent.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformEventServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPlatformsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -2,6 +2,6 @@
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://localhost:10010'
# VUE_APP_API_URL  = 'http://192.168.0.101:10010'
# VUE_APP_API_URL  = 'http://192.168.0.103:10010'
VUE_APP_API_URL  = 'http://10.50.250.253:8088/gateway_interface'
admin/.env.production
@@ -1,4 +1,4 @@
# ç”Ÿäº§çŽ¯å¢ƒé…ç½®
NODE_ENV = 'production'
VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
# VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
admin/.env.test
@@ -1,4 +1,4 @@
# æµ‹è¯•环境配置
NODE_ENV = 'production'
VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
# VUE_APP_API_URL  = 'http://192.168.5.13/gateway_interface'
admin/src/api/business/category.js
@@ -6,12 +6,21 @@
    trim: true
  })
}
// ä¸€çº§åˆ†ç±»æŸ¥è¯¢
export function fetchCateList (data) {
  return request.post('/visitsAdmin/cloudService/business/category/list', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/category/create', data)
}
// è¯¦æƒ…
export function getInfoById (id) {
  return request.get('/visitsAdmin/cloudService/business/category/' + id)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/category/updateById', data)
admin/src/api/business/company.js
@@ -37,6 +37,10 @@
export function companySync (data) {
  return request.post('/visitsAdmin/cloudService/business/company/syncAll', data)
}
// åˆ†é¡µæŸ¥è¯¢
export function companyGetList (data) {
  return request.post('/visitsAdmin/cloudService/business/company/page', data)
}
// åˆ é™¤
export function deleteById (id) {
admin/src/api/business/platformEvent.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/platformEvent/page', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/platformEvent/exportExcel', data, {
    trim: true,
    download: true
  })
}
admin/src/api/platform/index.js
@@ -97,6 +97,10 @@
export function platformJobPage(data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/page', data)
}
// ç»Ÿè®¡æœˆå°ä½œä¸šä»»åŠ¡ åˆ†é¡µåˆ—表
export function platformLogPage(data) {
  return request.post('/visitsAdmin/cloudService/business/platformLog/page', data)
}
// æœˆå°ä½œä¸šç»Ÿè®¡ åˆ†é¡µåˆ—表
export function platformWorkReportPage(data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformWorkReportPage', data)
admin/src/assets/style/style.scss
@@ -291,6 +291,11 @@
.df{
  display: flex;
}
.df_center{
  display: flex;
  align-items: center;
  justify-content: center;
}
.df_ac{
  display: flex;
  align-items: center;
admin/src/components/business/OperaCarsWindow.vue
@@ -1,45 +1,52 @@
<template>
    <GlobalWindow
        :title="title"
        width="500px"
        :visible.sync="visible"
        :confirm-working="isWorking"
        @confirm="confirm"
    >
      <el-form :model="form" ref="form" :rules="rules">
          <el-form-item label="车牌号" prop="code">
            <el-input v-model="form.code" placeholder="请输入车牌号" v-trim/>
          </el-form-item>
          <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-group>
          </el-form-item>
          <el-form-item label="选择车主:" prop="memberId">
            <el-select v-model="form.memberId" clearable filterable placeholder="请选择">
              <el-option
                  v-for="item in memberList"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
        </el-form>
    </GlobalWindow>
  <GlobalWindow :title="title" width="500px" @close="close" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="车牌号" prop="code">
        <el-input v-model="form.code" placeholder="请输入车牌号" v-trim />
      </el-form-item>
      <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-group>
      </el-form-item>
      <el-form-item label="选择分类:" prop="type">
        <el-cascader v-model="form.cateId" @change="changeSel" :options="cateList" :props="{
          label: 'name',
          value: 'id',
          children: 'childCategoryList',
        }"></el-cascader>
      </el-form-item>
      <el-form-item label="选择组织:" prop="groupId">
        <el-select v-model="form.groupId" @change="changeSel" clearable filterable placeholder="请选择">
          <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="选择车主:" prop="memberId">
        <el-select v-model="form.memberId" clearable filterable placeholder="请选择">
          <el-option v-for="item in memberList" :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 { allList } from '@/api/business/member'
import { fetchList } from '@/api/business/category.js'
import { create, updateById } from '@/api/business/cars'
import { companyGetList } from '@/api/business/company'
import { Message } from 'element-ui'
export default {
  name: 'OperaInternalCompanyWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
  data() {
    return {
      // è¡¨å•数据
      memberList: [],
@@ -47,49 +54,112 @@
        id: null,
        code: null,
        memberId: null,
        type: 0
        type: 0,
        groupId: null,
        cateId: [],
      },
      cateList: [],
      companyList: [],
      // éªŒè¯è§„则
      rules: {
        code: [
          { required: true, message: '请输入车牌号' }
        ],
        code: [{ required: true, message: '请输入车牌号' }],
        groupId: [{ required: true, message: '请选择组织' }],
        type: [
          { required: true, message: '请选择车辆类型' }
        ]
      }
    }
  },
  created () {
  created() {
    this.config({
      api: '/business/cars',
      'field.id': 'id'
    })
  },
  methods: {
    open (title, target) {
    open(title, target) {
      this.title = title
      this.visible = true
      this.loadMember()
      this.getCate()
      this.getCompany()
      // æ–°å»ºç»„织
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.type=0
          this.form.type = 0
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
      // this.$nextTick(() => {
      //   for (const key in this.form) {
      //     this.form[key] = target[key]
      //   }
      // })
    },
    changeSel() {
      const { form } = this
      if (form.groupId) {
        this.loadMember()
      }
    },
    confirm() {
      console.log('form', this.form.cateId)
      const { form } = this
      if(form.cateId && form.cateId.length == 2){
      }else{
        return Message.error('请选择二级分类')
      }
      this.$refs['form'].validate((valid) => {
        if (valid) {
          let fn = form.id ? updateById : create
          fn({
            ...form,
            cateId: form.cateId[1]
          }).then(res => {
            Message.success('保存成功')
            this.visible = false
            this.$emit('success')
          })
        }
      })
    },
    loadMember () {
    close() {
      this.visible = false
      this.$emit('close')
    },
    handleChange(val) {
    },
    getCate() {
      fetchList({
        model: {},
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.cateList = res.records || []
      })
    },
    getCompany() {
      companyGetList({
        model: {},
        capacity: 1000,
        page: 1,
      }).then(res => {
        this.companyList = res.records || []
      })
    },
    loadMember() {
      const { form } = this
      allList({
        type: 2
        type: 2,
        companyId: form.groupId,
      })
        .then(res => {
          this.memberList = res
admin/src/components/business/OperaCategoryWindow.vue
ÎļþÒÑɾ³ý
admin/src/components/business/OperaTrainTimeImportWindow.vue
@@ -12,7 +12,7 @@
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
    </p>
    <el-form class="demo-form-inline" >
      <el-form-item label="人员培训期名单" required>
      <el-form-item label="人员名单" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary" :loading="importing"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate">点击下载模版.EXCEL</el-button>
admin/src/components/system/user/RoleConfigWindow.vue
@@ -2,13 +2,14 @@
  <GlobalWindow
    :visible.sync="visible"
    :confirm-working="isWorking"
    width="582px"
    width="620px"
    title="配置用户角色"
    @confirm="confirm"
  >
    <p class="tip" v-if="user != null">为用户 <em>{{user.realname}}</em> é…ç½®è§’色</p>
    <p class="tip-warn"><i class="el-icon-warning"></i>提醒:角色配置后需重新登录后生效</p>
    <el-transfer
    <div class="df_center">
      <el-transfer
      v-model="selectedIds"
      :titles="['未授权角色', '已授权角色']"
      :props="{
@@ -17,6 +18,7 @@
      }"
      :data="roles">
    </el-transfer>
    </div>
  </GlobalWindow>
</template>
admin/src/views/business/category.vue
ÎļþÒÑɾ³ý
admin/src/views/business/platformEvent.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
<template>
    <TableLayout :permissions="['business:interfacelog:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
          <el-form-item label="" prop="platformName">
            <el-input v-model="searchForm.platformName" placeholder="请输入月台名称" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="" prop="channelName">
            <el-input v-model="searchForm.channelName" placeholder="请输入监控点名称" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="" prop="plateNo">
            <el-input v-model="searchForm.plateNo" placeholder="请输入车牌号" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="" prop="eventType">
            <el-select v-model="searchForm.motionStatus" placeholder="请选择进出类型">
              <el-option label="离开" value="leave"></el-option>
              <el-option label="进入" value="enter"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="起止时间" prop="startDate">
                <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>
            </el-form-item>
            <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
                <el-radio-button label="0">当天</el-radio-button>
                <el-radio-button label="1">近7天</el-radio-button>
                <el-radio-button label="2">近30天</el-radio-button>
            </el-radio-group>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
            >
                <el-table-column prop="platformName" label="月台名称" min-width="180px"></el-table-column>
                <el-table-column prop="channelName" label="监控点名称" min-width="180px"></el-table-column>
                <el-table-column prop="plateNo" label="车牌号" min-width="180px"></el-table-column>
                <el-table-column   label="车辆进出类型" min-width="180px">
                  <template slot-scope="{row}">
                    <span v-if="row.motionStatus == 'enter'">进入span>
                    <span v-if="row.motionStatus == 'leave'">离开</span>
                    <span v-if="row.motionStatus != 'leave' && row.motionStatus != 'enter'">{{ row.motionStatus }}</span>
                  </template>
                </el-table-column>
                <el-table-column   label="前后标识" min-width="180px">
                  <template slot-scope="{row}">
                    <span v-if="row.stockStatus == 'rear'">车尾</span>
                    <span v-if="row.stockStatus == 'front'">车头</span>
                    <span v-if="row.stockStatus != 'rear' && row.stockStatus != 'front'">{{ row.stockStatus }}</span>
                  </template>
                </el-table-column>
                <el-table-column prop="stockStatus" label="车门状态" min-width="180px"></el-table-column>
                <el-table-column label="车门状态" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.vehicleDoorStatus == 'open'">开门</span>
                        <span v-if="row.vehicleDoorStatus == 'close'">关门</span>
                        <span v-if="row.vehicleDoorStatus != 'open' && row.vehicleDoorStatus != 'close'">{{ row.vehicleDoorStatus }}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="deviceId" label="设备编码" min-width="150px"></el-table-column>
                <el-table-column prop="ipAddress" label="IP地址" min-width="100px"></el-table-column>
                <el-table-column prop="portNo" label="端口" min-width="100px"></el-table-column>
                <el-table-column fixed="right" label="抓拍图" min-width="100px">
                  <template slot-scope="{row}">
                    <el-image v-if="row.backgroundImageDown" style="width: 60px; height: 60px" :src="row.backgroundImageDown"
                              :preview-src-list="[row.backgroundImageDown]">
                    </el-image>
                  </template>
                </el-table-column>
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
        </template>
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import { timeForMat } from '@/utils/util'
export default {
  name: 'platformEvent',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  data () {
    return {
      // æœç´¢
      searchForm: {
        plateNo: '',
        motionStatus: '',
        channelName: '',
        platformName: '',
        endDate: '',
        startDate: '',
        radio: '0'
      },
      time: []
    }
  },
  created () {
    this.config({
      module: '月台车辆状态事件交互记录',
      api: '/business/platformEvent',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.changeRadio('0')
  },
  methods: {
    changeRadio (e) {
      if (e === '0') {
        this.searchForm.startDate = timeForMat(0)[0]
        this.searchForm.endDate = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.startDate = timeForMat(6)[0]
        this.searchForm.endDate = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.startDate = timeForMat(29)[0]
        this.searchForm.endDate = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
      this.search()
    },
    seleTime (e) {
      this.searchForm.startDate = e[0]
      this.searchForm.endDate = e[1]
      this.searchForm.radio = null
      this.search()
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.searchForm.startDate = ''
      this.searchForm.endDate = ''
      this.time = []
      this.search()
    }
  }
}
</script>
admin/src/views/business/relativeMember.vue
@@ -61,7 +61,7 @@
        <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('人员导入', searchForm.companyType)"
            icon="el-icon-plus" v-permissions="['business:member:create']">人员导入</el-button></li>
        <li><el-button type="primary"
            @click="$refs.OperaTrainTimeImportWindow.open('培训期导入', department, searchForm.companyType)"
            @click="$refs.OperaTrainTimeImportWindow.open('培训有效期导入', department, searchForm.companyType)"
            icon="el-icon-plus" v-permissions="['business:traintime:create']">培训期导入</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:member:delete']">批量删除</el-button></li>
admin/src/views/business/visitorManagement.vue
@@ -8,8 +8,8 @@
            <el-form-item label="手机号" prop="phone">
                <el-input v-model="searchForm.phone" 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="idcardNo">
                <el-input v-model="searchForm.idcardNo" placeholder="请输入身份证号" @keypress.enter.native="search"></el-input>
@@ -54,7 +54,7 @@
                    </template>
                </el-table-column>
                <el-table-column prop="idcardDecode" label="身份证号" width="150px"></el-table-column>
                <el-table-column prop="visitCompanyName" label="组织" min-width="100px"></el-table-column>
                <el-table-column prop="visitCompanyName" label="公司" min-width="100px"></el-table-column>
                <el-table-column prop="visitTimes" label="拜访次数" min-width="100px"></el-table-column>
                <el-table-column prop="lastVisitDate" label="最后拜访时间" min-width="100px"></el-table-column>
            </el-table>
admin/src/views/platform/LogisticsRecord/leaveAuth.vue
@@ -50,8 +50,9 @@
      <el-table-column prop="remark" label="备注" min-width="150" show-overflow-tooltip />
      <el-table-column label="操作" align="center" fixed="right" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button type="text" v-permissions="['business:platformbooks:detail']"
          <el-button v-if="scope.row.status == 6" type="text" v-permissions="['business:platformbooks:detail']"
            @click="handleAuth(scope.row)">离园授权</el-button>
            <span v-else>-</span>
        </template>
      </el-table-column>
    </el-table>
@@ -178,8 +179,8 @@
      this.$prompt('备注', '离园授权', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
      }).then(({ remark }) => {
        platformPowerLevel({ jobId: row.id, remark }).then(res => {
      }).then(({ value }) => {
        platformPowerLevel({ jobId: row.id, remark: value }).then(res => {
          Message.success('离园授权成功')
          this.getList()
        })
admin/src/views/platform/index.vue
@@ -314,6 +314,12 @@
      this.$nextTick(() => {
        this.$refs.PlatformQueuingRef.isShowModal = true
        this.$refs.PlatformQueuingRef.callType = callType
        this.$refs.PlatformQueuingRef.carCodeFront = ''
        this.$refs.PlatformQueuingRef.pagination = {
          total: 0,
          pageSize: 10,
          page: 1
        }
        this.$refs.PlatformQueuingRef.activePlat = { ...item }
        this.$refs.PlatformQueuingRef.getList()
        this.$refs.PlatformQueuingRef.title = item.name
admin/src/views/platform/queueUp.vue
@@ -21,7 +21,7 @@
        <span></span>
      </div>
    </div>
    <el-table class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all>
    <el-table v-if="activeGroup.type == 2" class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all>
      <el-table-column type="index" label="序号" width="80" />
      <el-table-column label="车牌号" width="130">
        <template slot-scope="{ row }">
@@ -33,13 +33,9 @@
          </div>
        </template>
      </el-table-column>
      <el-table-column v-if="activeGroup.type == 2" prop="contractNum" label="合同单号" min-width="120" />
      <template v-else>
        <el-table-column prop="carrierName" label="运输公司" min-width="120" />
        <el-table-column prop="billCode" label="运单号" min-width="120" />
      </template>
      <el-table-column prop="contractNum" label="合同单号" min-width="120" />
      <el-table-column prop="totalNum" label="总运输量(万支)" min-width="110" />
      <el-table-column prop="driverName" label="驾驶员" min-width="130">
      <el-table-column label="驾驶员" min-width="130">
        <template slot-scope="{ row }">
          <span class="mr10">{{ row.driverName }}</span>
          <span>{{ row.drivierPhone }}</span>
@@ -48,12 +44,38 @@
      <el-table-column prop="signDate" label="签到时间" min-width="150" />
      <el-table-column label="操作" align="center" width="100" fixed="right">
        <template slot-scope="{ row }">
          <el-button v-if="activeGroup.type != 2" type="text" @click="handleDetail(row)"
            v-permissions="['business:company:update']">运单详情</el-button>
          <el-button v-if="activeGroup.type == 2" type="text" @click="subDetail(row)">预约详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <el-table v-else class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all>
      <el-table-column type="index" label="序号" width="80" />
      <el-table-column label="车牌号" width="130">
        <template slot-scope="{ row }">
          <div class="plate_id">
            <span>{{ row.carCodeFront.slice(0, 1) }}</span>
            <span>{{ row.carCodeFront.slice(1, 2) }}</span>
            <span>·</span>
            <span>{{ row.carCodeFront.slice(2) }}</span>
          </div>
        </template>
      </el-table-column>
      <el-table-column prop="carrierName" label="运输公司" min-width="120" />
      <el-table-column prop="totalNum" label="总运输量(万支)" min-width="110" />
      <el-table-column label="驾驶员" min-width="130">
        <template slot-scope="{ row }">
          <span class="mr10">{{ row.driverName }}</span>
          <span>{{ row.drivierPhone }}</span>
        </template>
      </el-table-column>
      <el-table-column prop="signDate" label="签到时间" min-width="150" />
      <el-table-column label="操作" align="center" width="100" fixed="right">
        <template slot-scope="{ row }">
          <el-button type="text" @click="handleDetail(row)"
            v-permissions="['business:company:update']">运单详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination" />
    <!--  -->
admin/src/views/statistics/platformRecord.vue
@@ -6,9 +6,10 @@
      <el-table-column prop="platformGroupName" label="月台组" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeFront" label="车前牌照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeBack" label="车后牌照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="startDate" label="作业开始" min-width="100" show-overflow-tooltip />
      <el-table-column prop="doneDate" label="作业结束" min-width="100" show-overflow-tooltip />
      <el-table-column prop="workTime" label="作业时长" min-width="100" show-overflow-tooltip /><el-table-column prop="name"
      <el-table-column prop="param1" label="作业开始" min-width="100" show-overflow-tooltip />
      <el-table-column prop="param2" label="作业结束" min-width="100" show-overflow-tooltip />
      <el-table-column prop="workTime" label="作业时长" min-width="100" show-overflow-tooltip />
      <el-table-column prop="name"
        label="运输单号/合同号" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <span>{{ scope.row.billCode || scope.row.contractNum }}</span>
@@ -26,8 +27,8 @@
import QueryForm from '@/components/common/QueryForm'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration);
import { platformJobPage, getPlatformGroupList } from '@/api'
dayjs.extend(duration)
import { platformLogPage, getPlatformGroupList } from '@/api'
export default {
  components: {
    Pagination,
@@ -86,7 +87,7 @@
      })
    },
    getGroupList() {
      getPlatformGroupList({queryData: 0,queryType: 0}).then(res => {
      getPlatformGroupList({ queryData: 0, queryType: 0 }).then(res => {
        this.queryFormConfig.formItems[1].options = res.map(i => {
          return {
            value: i.id,
@@ -99,13 +100,14 @@
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      platformJobPage({
      platformLogPage({
        model: {
          ...filters,
          queryStatus: '5,6,9,10',
          queryStatus: '6,7,8',
          beginWorkDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          beginWorkDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
        },
        sorts: [{ direction: 'DESC', property: 'param1' }],
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
@@ -114,7 +116,7 @@
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
          item.workTime = dayjs.duration(item.workTime, 'seconds').format('H时m分s秒');
          item.workTime = dayjs.duration(item.param3, 'seconds').format('H时m分s秒')
        })
        this.pagination.total = res.total || 0
      }, () => {
admin/src/views/vehicle/cars.vue
@@ -1,113 +1,116 @@
<template>
    <TableLayout :permissions="['business:member:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="" prop="code" title="车牌号">
                <el-input v-model="searchForm.code" clearable placeholder="车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
          <el-form-item label="" prop="memberName" title="车主姓名/手机号">
            <el-input v-model="searchForm.memberName" clearable placeholder="车主姓名/手机号" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="" prop="companyName" title="车主部门名称">
            <el-input v-model="searchForm.companyName" clearable placeholder="车主部门名称" @keypress.enter.native="search"></el-input>
          </el-form-item>
          <el-form-item label="" prop="authStatus" title="是否授权">
            <el-select v-model="searchForm.authStatus" @change="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" title="车辆类型">
            <el-select v-model="searchForm.type" @change="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>
                      <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>
                    </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" align="center" 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="下发有效期" align="center" 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 style="color: green">起:{{row.startTime}}</span><br/>
                      <span style="color: red">止:{{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="140px"></el-table-column>
              <el-table-column
                  v-if="containPermissions(['business:member:update', 'business:member:delete','business:empower:create'])"
                  label="操作"
                  min-width="200"
                  align="center"
                  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>
  <TableLayout :permissions="['business:member:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="" prop="code" title="车牌号">
        <el-input v-model="searchForm.code" clearable placeholder="车牌号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="" prop="memberName" title="车主信息">
        <el-input v-model="searchForm.memberName" clearable placeholder="车主信息"
          @keypress.enter.native="search"></el-input>
      </el-form-item>
      <!-- <el-form-item label="" prop="cateName" title="车辆分类名称">
        <el-input v-model="searchForm.cateName" clearable placeholder="车辆分类名称"
          @keypress.enter.native="search"></el-input>
      </el-form-item> -->
      <el-form-item label="" prop="companyName" title="车主组织名称">
        <el-input v-model="searchForm.companyName" clearable placeholder="车主组织名称"
          @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="" prop="authStatus" title="是否授权">
        <el-select v-model="searchForm.authStatus" @change="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" title="车辆类型">
        <el-select v-model="searchForm.type" @change="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>
      <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="handleEdit" 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="120px">
          <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>
          </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="cateName" label="车辆分类" min-width="160px"></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" align="center" 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="下发有效期" align="center" 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 style="color: green">起:{{ row.startTime }}</span><br />
                <span style="color: red">止:{{ 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="140px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:member:update', 'business:member:delete', 'business:empower:create'])"
          label="操作" min-width="200" align="center" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="handleEdit(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 v-if="isShowEdit" ref="operaCarsWindow" @close="isShowEdit = false" @success="handlePageChange" />
  </TableLayout>
</template>
<script>
@@ -119,20 +122,21 @@
export default {
  name: 'Cars',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaCarsWindow,OperaCarAuthWindow },
  data () {
  components: { TableLayout, Pagination, OperaCarsWindow, OperaCarAuthWindow },
  data() {
    return {
      // æœç´¢
      searchForm: {
        code: '',
        memberName: '',
        companyName: '',
        type:null,
        authStatus:null
      }
        type: null,
        authStatus: null
      },
      isShowEdit: false
    }
  },
  created () {
  created() {
    this.config({
      module: '车辆信息表',
      api: '/business/cars',
@@ -142,8 +146,22 @@
    this.search()
  },
  methods: {
    handleEdit(row) {
      this.isShowEdit = true
      let str = row && row.id ? '编辑车辆' : '新建车辆'
      this.$nextTick(() => {
        this.$refs.operaCarsWindow.open(str, row)
        if (row && row.id) {
          let form = { ...row, cateId: []}
          if(row.catePId){ form.cateId.push(row.catePId) }
          if(row.cateId){ form.cateId.push(row.cateId) }
          this.$refs.operaCarsWindow.form = form
          this.$refs.operaCarsWindow.loadMember()
        }
      })
    },
    // åŒæ­¥ä¿¡æ¯
    startEmpowerBatch () {
    startEmpowerBatch() {
      if (this.tableData.selectedRows.length === 0) {
        this.$tip.warning('请至少选择一条数据')
        return
admin/src/views/vehicle/category.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
<template>
    <TableLayout>
        <!-- æœç´¢è¡¨å• -->
        <!-- <el-form ref="searchForm" slot="search-form" label-width="100px" inline>
            <el-form-item label="状态" prop="status">
                <el-select v-model="filters.status" placeholder="请选择">
                    <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 @click="reset">重置</el-button>
            </section>
        </el-form> -->
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
                <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
                        v-permissions="['business:category:create']">新建</el-button></li>
            </ul>
            <el-table row-key="id" :tree-props="{children: 'childCategoryList'}" v-loading="isWorking.search" :data="dataList" stripe @selection-change="handleSelectionChange">
                <el-table-column prop="name" label="分类名称" min-width="100px"></el-table-column>
                <el-table-column prop="remark" label="备注" min-width="100px"></el-table-column>
                <!-- <el-table-column prop="status" label="状态" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.status === 0">启用</span>
                        <span v-if="row.status === 1">禁用</span>
                    </template>
                </el-table-column> -->
                <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
                <el-table-column v-if="containPermissions(['business:category:update', 'business:category:delete'])"
                    label="操作" min-width="120" fixed="right">
                    <template slot-scope="{row}">
                        <el-button type="text" @click="handleEdit(row)" icon="el-icon-edit"
                            v-permissions="['business:category:update']">编辑</el-button>
                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
                            v-permissions="['business:category:delete']">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
            <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="tableData.pagination">
            </pagination>
        </template>
        <!-- æ–°å»º/修改 -->
        <OperaCategoryWindow v-if="isShowEdit" @close="isShowEdit = false" ref="operaCategoryWindow" @success="getList" />
    </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCategoryWindow from './components/OperaCategoryWindow'
import { fetchList, deleteById } from '@/api/business/category.js'
export default {
    name: 'Category',
    extends: BaseTable,
    components: { TableLayout, Pagination, OperaCategoryWindow },
    data() {
        return {
            // æœç´¢
            filters: {
                parentId: ''
            },
            isShowEdit: false,
            loading: false,
            pagination: {
                pageSize: 10,
                page: 1,
                total: 0,
            },
            dataList: []
        }
    },
    created() {
        this.getList()
    },
    methods: {
        handleEdit(row) {
            this.isShowEdit = true
            let str = row && row.id ? '编辑车辆分类' : '新建车辆分类'
            this.$nextTick(() => {
                this.$refs.operaCategoryWindow.open(str)
                this.$refs.operaCategoryWindow.getList()
                if(row && row.id){
                    this.$refs.operaCategoryWindow.getDetail(row.id)
                }
            })
        },
        deleteById(row) {
            this.$confirm(`您确认要删除该分类吗`, '温馨提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                deleteById(row.id).then(res => {
                    this.getList()
                })
            })
        },
        getList() {
            const { pagination, filters } = this
            this.loading = true
            fetchList({
                model: { ...filters },
                capacity: pagination.pageSize,
                page: pagination.page,
            }).then(res => {
                this.loading = false
                this.dataList = res.records || []
                this.pagination.total = res.total || 0
            }, () => {
                this.loading = false
            })
        },
    }
}
</script>
admin/src/views/vehicle/components/OperaCategoryWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
<template>
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" width="600px" @close="close" @confirm="confirm">
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="一级分类" prop="parentId">
        <el-select v-model="form.parentId" placeholder="不填为则一级分类">
          <el-option v-for="op in dataList" :key="op.id" :label="op.name" :value="op.id"></el-option>
        </el-select>
      </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="状态" prop="status">
        <el-select v-model="form.status" 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="remark">
        <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" v-trim />
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { create, fetchCateList, getInfoById } from '@/api/business/category.js'
export default {
  name: 'OperaCategoryWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data() {
    return {
      // è¡¨å•数据
      form: {
        parentId: null,
        name: '',
        remark: '',
        status: '',
        type: 1
      },
      // éªŒè¯è§„则
      rules: {
        name: [
          { required: true, message: '请输入二级分类名称', trigger: 'blur' }
        ],
        status: [
          { required: true, message: '请选择是否启用', trigger: 'change' }
        ]
      },
      dataList: []
    }
  },
  created() {
    this.config({
      api: '/business/category',
      'field.id': 'id'
    })
  },
  methods: {
    getList() {
      fetchCateList({}).then(res => {
        this.dataList = res || []
      })
    },
    close() {
      this.visible = false
      this.$emit('close')
    },
    getDetail(id) {
      getInfoById(id).then(res => {
        this.form = res
      })
    },
  }
}
</script>
admin/src/views/vehicle/parkBook.vue
@@ -5,8 +5,8 @@
            <el-form-item title="车牌号" prop="carCode">
                <el-input v-model="searchForm.carCode" placeholder="车牌号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item title="车主姓名/手机号" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="员工姓名/手机号" @keypress.enter.native="search"></el-input>
            <el-form-item title="车主信息" prop="memberName">
                <el-input v-model="searchForm.memberName" placeholder="车主信息" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item title="车主组织" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="车主组织名称" @keypress.enter.native="search"></el-input>
h5/pages.json
@@ -447,6 +447,13 @@
            {
                "navigationBarTitleText" : "入园须知"
            }
        },
        {
            "path" : "pages/waybill/waybillDetail",
            "style" :
            {
                "navigationBarTitleText" : "运单查询"
            }
        }
    ],
    "subPackages": [
h5/pages/waybill/waybillDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,207 @@
<template>
    <view class="main_app">
        <image src="@/static/driver/wuliuche_bg@2x.png" class="main_bg"></image>
        <view class="form_wrap">
            <view class="item">
                <view class="label">合同编号</view>
                <view class="line">
                    <view class="input_wrap"><input v-model="param.aa" placeholder="请输入合同编号" placeholder-class="place" type="text" /></view>
                </view>
            </view>
            <view class="item">
                <view class="label">需方编号</view>
                <view class="line">
                    <view class="input_wrap"><input v-model="param.aa" placeholder="请输入合同中需方编号" placeholder-class="place" type="text" /></view>
                </view>
            </view>
            <view class="item">
                <view class="label">验证码</view>
                <view class="line">
                    <view class="input_wrap"><input v-model="param.aa" placeholder="请输入验证码" placeholder-class="place" type="text" /></view>
                    <image src="" class="auth_code" mode=""></image>
                </view>
            </view>
            <view class="query">查询</view>
        </view>
        <view class="title">查询结果</view>
        <view class="drive_info">
            <view class="title">合同编号</view>
            <view class="line">
                <view class="label">运输车辆</view>
                <view class="val">11</view>
            </view>
            <view class="line">
                <view class="label">司机信息</view>
                <view class="val">11</view>
            </view>
            <view class="line">
                <view class="label">车辆位置</view>
                <view class="val">11</view>
            </view>
        </view>
        <view class="drive_info">
            <view class="title">物流信息</view>
            <view class="item">
                <view class="h2">
                    <view class="icon_wrap"><image src="@/static/driver/ic_mostarted.png" class="icon"></image></view>
                    <view class="text">到达卸货地</view>
                </view>
                <view class="time">202422222222</view>
                <view class="separate"></view>
            </view>
            <view class="item">
                <view class="h2 h1">
                    <view class="icon_wrap"><image src="@/static/driver/ic_dangqian.png" class="icon"></image></view>
                    <view class="text">到达卸货地</view>
                </view>
                <view class="time">202422222222</view>
                <view class="separate separate_ac"></view>
            </view>
            <view class="item">
                <view class="h2">
                    <view class="icon_wrap"><image src="@/static/driver/ic_mostarted.png" class="icon"></image></view>
                    <view class="text">到达卸货地</view>
                </view>
                <view class="time">202422222222</view>
                <view class="separate"></view>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                param: {}
            };
        }
    }
</script>
<style lang="scss" scoped>
    .form_wrap {
        width: 690rpx;
        height: 646rpx;
        background: #FFFFFF;
        box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(39,155,170,0.16);
        border-radius: 16rpx;
        padding: 10rpx 30rpx;
        margin-bottom: 40rpx;
        .item{
            height: 154rpx;
            padding: 30rpx 0 8rpx;
            border-bottom: 1rpx solid #E5E5E5;
            .label{}
            .line{
                display: flex;
                .input_wrap{
                    padding: 18rpx 0;
                    flex: 1;
                    .place{
                        color: #999999;
                        font-size: 28rpx;
                    }
                }
                .auth_code{
                    width: 160rpx;
                    height: 64rpx;
                    border: 2px solid;
                }
            }
        }
        .query{
            width: 630rpx;
            height: 88rpx;
            background: $uni-color-primary;
            border-radius: 44rpx;
            margin-top: 40rpx;
            color: #fff;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 30rpx;
        }
    }
    .main_app{
        padding-top: 218rpx;
        .title{
            font-weight: 500;
            font-size: 32rpx;
            margin-bottom: 30rpx;
        }
        .drive_info{
            background: #F7F7F7;
            border-radius: 16rpx;
            padding: 30rpx;
            margin-bottom: 20rpx;
            .line{
                display: flex;
                margin-bottom: 24rpx;
                .label{
                    color: #666666;
                    margin-right: 40rpx;
                }
                .val{
                }
            }
            .item{
                position: relative;
                color: #999999;
                margin-bottom: 30rpx;
                .h2{
                    display: flex;
                    align-items: center;
                    height: 48rpx;
                    .icon_wrap{
                        width: 48rpx;
                        margin-right: 30rpx;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        .icon{
                            width: 24rpx;
                            height: 24rpx;
                            position: relative;
                            z-index: 2;
                        }
                    }
                }
                .h1{
                    .icon_wrap{
                        .icon{
                            width: 48rpx;
                            height: 48rpx;
                        }
                    }
                }
                .time{
                    padding-left: 78rpx;
                    font-size: 24rpx;
                    margin-top: 6rpx;
                }
                .separate{
                    height: calc( 100% );
                    width: 2rpx;
                    border: 2rpx dashed red;
                    position: absolute;
                    left: 22rpx;
                    top: 24rpx;
                    z-index: 1;
                }
                .separate_ac{
                    top: 48rpx;
                }
            }
        }
    }
    .main_bg {
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        z-index: -1;
        color: #222222;
    }
</style>
h5/static/driver/ic_dangqian.png
h5/static/driver/ic_mostarted.png
h5/static/driver/wuliuche_bg@2x.png
h5_meeting/pages/index/config.vue
@@ -11,7 +11,7 @@
            <view class="item">
                <view class="title">接口地址</view>
                <view class="line">
                    <input type="text" placeholder="http://10.50.250.178:8088/gateway_interface/" v-model="param.baseUrl" />
                    <input type="text" v-model="param.baseUrl" />
                    <image src="../../static/icon/right.svg" class="icon"></image>
                </view>
            </view>
@@ -31,11 +31,15 @@
    export default {
        data() {
            return {
                param: {}
                param: {
                    baseUrl: 'http://192.168.5.13/gateway_interface/'
                }
            };
        },
        onLoad(){
            const param = uni.getStorageSync('param') || {}
            const param = uni.getStorageSync('param') || {
                baseUrl: 'http://192.168.5.13/gateway_interface/'
            }
            this.param = { ...param }
        },
        methods: {
h5_meeting/pages/index/index.vue
@@ -8,13 +8,18 @@
                <view class="date">{{date}}</view>
            </view>
        </view>
        <view class="home_status">
            <text v-if="!info.meetingListResponseList || info.meetingListResponseList.length == 0">空闲中</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 4">即将开始</text>
            <text class="orange" v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 2">会议中</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 1">未开始</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 3">已结束</text>
            <text v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 5">已撤销</text>
        <view class="home_status">
            <text v-if="!info.meetingListResponseList || info.meetingListResponseList.length == 0">空闲中</text>
            <text
                v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 4">即将开始</text>
            <text class="orange"
                v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 2">会议中</text>
            <text
                v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 1">未开始</text>
            <text
                v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 3">已结束</text>
            <text
                v-if="info.meetingListResponseList && info.meetingListResponseList.length > 0 && info.meetingListResponseList[0].meetingStatus == 5">已撤销</text>
        </view>
        <view v-if="meetingInfo.meetingName" class="meeting_name">{{meetingInfo.meetingName}}</view>
        <view v-if="meetingInfo.meetingTime && meetingInfo.bookingUser" class="meeting_con">
@@ -27,13 +32,15 @@
                    <image src="@/static/ic_people@2x.png"></image>
                    <text>预约人:{{meetingInfo.bookingUser }}</text>
                </view>
            </view>
            <view v-if="meetingInfo.meetingTime" class="qrcode_wrap">
                <canvas id="qrcode" canvas-id="qrcode" class="qrcode"></canvas>
            </view>
            <view v-if="showQrbg" class="qrcode_wrap">
                <canvas id="qrcode" canvas-id="qrcode" class="qrcode"></canvas>
            </view>
        </view>
        <view class="meeting_wrap">
            <view class="title">今日会议({{ info.meetingListResponseList && info.meetingListResponseList.length > 0 ? info.meetingListResponseList.length : 0 }})</view>
            <view class="title">
                ä»Šæ—¥ä¼šè®®ï¼ˆ{{ info.meetingListResponseList && info.meetingListResponseList.length > 0 ? info.meetingListResponseList.length : 0 }})
            </view>
            <view class="list">
                <view class="item" v-for="item in info.meetingListResponseList">
                    <view class="name">{{item.meetingName}}</view>
@@ -51,42 +58,46 @@
        </view>
        <!--  -->
        <swiper v-if="info.fileType == 0 && (info.meetingListResponseList == null || info.meetingListResponseList.length == 0)" class="swiper" circular autoplay indicator-dots>
        <swiper
            v-if="info.fileType == 0 && (info.meetingListResponseList == null || info.meetingListResponseList.length == 0)"
            class="swiper" circular autoplay indicator-dots>
            <swiper-item v-for="item in info.multifileList">
                <image class="swiper_item" :src="item.fileurlFull" mode="aspectFill"></image>
            </swiper-item>
        </swiper>
        <!--  -->
        <template v-if="info.fileType == 1 && info.multifileList && info.multifileList.length > 0 && (info.meetingListResponseList == null || info.meetingListResponseList.length == 0)">
            <video  :src="info.multifileList[0].fileurlFull" class="app_video" :autoplay="true" loop :controls="false"></video>
        </swiper>
        <!--  -->
        <template
            v-if="info.fileType == 1 && info.multifileList && info.multifileList.length > 0 && (info.meetingListResponseList == null || info.meetingListResponseList.length == 0)">
            <video :src="info.multifileList[0].fileurlFull" class="app_video" :autoplay="true" loop :controls="false"></video>
        </template>
    </view>
</template>
<script>
    import dayjs from 'dayjs'
    // import vueQr from 'vue-qr/src/packages/vue-qr.vue'
    import dayjs from 'dayjs'
    // import vueQr from 'vue-qr/src/packages/vue-qr.vue'
    import UQRCode from 'uqrcodejs'
    import {
        meetScreenData
    } from '@/api/index.js'
    export default {
    export default {
        // components: {vueQr},
        data() {
            return {
                time: '',
                date: '',
                showQrbg: false,
                timer: null,
                touchNum: 0,
                param: {},
                info: {},
                statusMap: {
                    1: '未开始',
                    2: '进行中',
                    3: '已结束',
                    4: '即将开始',
                    5: '已撤销',
                },
                param: {},
                info: {},
                statusMap: {
                    1: '未开始',
                    2: '进行中',
                    3: '已结束',
                    4: '即将开始',
                    5: '已撤销',
                },
                meetingInfo: {}
            }
        },
@@ -99,40 +110,47 @@
                })
            }
            this.getData()
        },
        onReady() {
        },
        onReady() {},
        methods: {
            getData() {
                this.showQrbg = false
                meetScreenData({
                    roomId: this.param.code
                }).then(res => {
                    this.info = res.data
                    if(this.info.meetingListResponseList && this.info.meetingListResponseList.length > 0){
                        this.meetingInfo = this.info.meetingListResponseList[0]
                        this.$nextTick(() => {
                            this.qrcodeCreate()
                            this.$forceUpdate()
                        })
                    }
                }).then(res => {
                    this.info = res.data
                    if (this.info.meetingListResponseList && this.info.meetingListResponseList.length > 0) {
                        this.meetingInfo = this.info.meetingListResponseList[0]
                        this.$nextTick(() => {
                            this.qrcodeCreate()
                            this.$forceUpdate()
                        })
                    } else {
                        this.showQrbg = false
                        this.meetingInfo = {}
                    }
                })
            },
            qrcodeCreate(){
                 // èŽ·å–uQRCode实例
                  var qr = new UQRCode();
                  // è®¾ç½®äºŒç»´ç å†…容
                  // qr.data = "https://uqrcode.cn/doc";
                  qr.data = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxac2a80c2144c4ee0&redirect_uri=http://192.168.0.109:8080/redirect.html&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
                  // è®¾ç½®äºŒç»´ç å¤§å°ï¼Œå¿…须与canvas设置的宽高一致
                  qr.size = 83;
                  // è°ƒç”¨åˆ¶ä½œäºŒç»´ç æ–¹æ³•
                  qr.make();
                  // èŽ·å–canvas上下文
                  var canvasContext = uni.createCanvasContext('qrcode', this); // å¦‚果是组件,this必须传入
                  // è®¾ç½®uQRCode实例的canvas上下文
                  qr.canvasContext = canvasContext;
                  // è°ƒç”¨ç»˜åˆ¶æ–¹æ³•将二维码图案绘制到canvas上
                  qr.drawCanvas();
            },
            qrcodeCreate() {
                this.showQrbg = true
                this.$nextTick(() => {
                    // èŽ·å–uQRCode实例
                    var qr = new UQRCode();
                    // è®¾ç½®äºŒç»´ç å†…容
                    // qr.data = "https://uqrcode.cn/doc";
                    qr.data =
                        "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxac2a80c2144c4ee0&redirect_uri=http://192.168.0.109:8080/redirect.html&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
                    // è®¾ç½®äºŒç»´ç å¤§å°ï¼Œå¿…须与canvas设置的宽高一致
                    qr.size = 83;
                    // è°ƒç”¨åˆ¶ä½œäºŒç»´ç æ–¹æ³•
                    qr.make();
                    // èŽ·å–canvas上下文
                    var canvasContext = uni.createCanvasContext('qrcode', this); // å¦‚果是组件,this必须传入
                    // è®¾ç½®uQRCode实例的canvas上下文
                    qr.canvasContext = canvasContext;
                    // è°ƒç”¨ç»˜åˆ¶æ–¹æ³•将二维码图案绘制到canvas上
                    qr.drawCanvas();
                })
            },
            touchend() {
                this.touchNum++
@@ -155,44 +173,53 @@
                this.timer = setInterval(() => {
                    this.time = dayjs().format('HH:mm')
                    this.date = dayjs().format('YYYY-MM-DD') + ' ' + weeks[new Date().getDay()]
                }, 1000)
                setInterval(() => {
                    this.getData()
                },this.param.time ? this.param.time * 1000 : 60 * 1000)
                }, 1000)
                setInterval(() => {
                    this.getData()
                }, this.param.time ? this.param.time * 1000 : 60 * 1000)
            }
        }
    }
</script>
<style lang="scss" scoped>
    page,body{
        overflow: hidden;
    }
    .swiper{
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
        width: 100%;
        height: 100vh;
        .swiper_item{
            background-color: #0095AC;
            width: 100%;
            height: 100vh;
        }
    }
    .app_video{
        width: 100%;
        height: 100vh;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
<style lang="scss" scoped>
    page,
    body {
        overflow: hidden;
    }
    .swiper {
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
        width: 100%;
        height: 100vh;
        .swiper_item {
            background-color: #0095AC;
            width: 100%;
            height: 100vh;
        }
    }
    .app_video {
        width: 100%;
        height: 100vh;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 999;
    }
    .main_app {
        width: 100%;
        height: 100vh;
        position: relative;
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        font-size: 28rpx;
        display: flex;
        flex-direction: column;
@@ -230,14 +257,16 @@
                    flex-shrink: 0;
                    flex-direction: column;
                    width: 403rpx;
                    height: 315rpx;
                    background: linear-gradient( 90deg, #0080FF 0%, #00B0FF 100%);
                    height: 315rpx;
                    background: linear-gradient(90deg, #0080FF 0%, #00B0FF 100%);
                    border-radius: 7rpx;
                    margin-right: 28rpx;
                    position: relative;
                    &:nth-of-type(1){
                        background: linear-gradient(90deg, #0095AC 0%, #00B5D1 100%);
                    &:nth-of-type(1) {
                        background: linear-gradient(90deg, #0095AC 0%, #00B5D1 100%);
                    }
                    .item_bg {
                        position: absolute;
                        width: 178rpx;
@@ -250,13 +279,14 @@
                    .name {
                        flex: 1;
                        font-weight: bold;
                        font-size: 39rpx;
                        width: 100%;
                        word-break: break-all;
                        text-overflow: ellipsis;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 3; /* è¶…出几行省略 */
                        font-size: 39rpx;
                        width: 100%;
                        word-break: break-all;
                        text-overflow: ellipsis;
                        display: -webkit-box;
                        -webkit-box-orient: vertical;
                        -webkit-line-clamp: 3;
                        /* è¶…出几行省略 */
                    }
                    .line {
@@ -292,19 +322,21 @@
                    }
                }
            }
            .qrcode_wrap{
                width: 92px;
                height: 92px;
                display: flex;
                align-items: center;
                justify-content: center;
                background-color: #fff;
                .qrcode {
                    width: 84px;
                    height: 84px;
                }
            .qrcode_wrap {
                width: 92px;
                height: 92px;
                display: flex;
                align-items: center;
                justify-content: center;
                background-color: #fff;
                .qrcode {
                    width: 84px;
                    height: 84px;
                }
            }
        }
        .meeting_name {
h5_meeting/unpackage/release/apk/__UNI__EF8BAA7__20241008151948.apk
Binary files differ
screen/src/views/PlatformCall.vue
@@ -106,7 +106,7 @@
  var qr = new UQRCode()
  // è®¾ç½®äºŒç»´ç å†…容
  qr.data = qrcode.value
  qr.size = 254
  qr.size = 220
  // è°ƒç”¨åˆ¶ä½œäºŒç»´ç æ–¹æ³•
  qr.make()
  var canvas = document.getElementById("qrcode")
@@ -174,7 +174,7 @@
          </div>
          <div class="item">{{ item.platformName || '-' }}</div>
          <div class="item">
            <div class="time_place">预计完成时间</div>
            <div v-if="item.optTimeTemp" class="time_place">预计完成时间</div>
            <div>{{ item.optTimeTemp || '-' }}</div>
          </div>
        </div>
@@ -203,7 +203,7 @@
        </div>
        <div class="qrcode_wrap">
          <div class="qrcode">
            <canvas id="qrcode" width="254" height="254"></canvas>
            <canvas id="qrcode" width="220" height="220"></canvas>
          </div>
          <div class="title">请扫码签到</div>
        </div>
@@ -218,16 +218,23 @@
</template>
<style lang="scss" scoped>
div{
  box-sizing: border-box;
}
.main_app {
  color: #fff;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background-color: #092030;
  position: relative;
  z-index: -2;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  .main_header {
    width: 100%;
    height: 112px;
@@ -281,16 +288,15 @@
    display: flex;
    padding: 30px 20px;
    position: relative;
    .list {
      flex: 5;
      margin-right: 20px;
      display: flex;
      flex-direction: column;
      .line {
        display: flex;
        align-items: center;
        height: 100px;
        flex: 1;
        &:nth-of-type(2n) {
          background: rgba(255, 255, 255, 0);
        }
@@ -307,13 +313,15 @@
          font-weight: 500;
          font-size: 36px;
          flex: 10;
          height: 100%;
          .time_place{
            font-weight: 500;
            font-size: 24px;
          }
          .status {
            width: 174px;
            height: 76px;
            /* padding: 0 28px; */
            width: 170px;
            height: 72%;
            border-radius: 8px;
            display: flex;
            justify-content: center;
@@ -351,14 +359,13 @@
      flex: 2;
      display: flex;
      flex-direction: column;
      border: 1px solid red;
      .tip_wrap {
        margin-bottom: 20px;
        width: 100%;
        position: relative;
        flex-shrink: 0;
        /* flex-shrink: 0; */
        flex: 1;
        .current_plat {
          display: flex;
          flex-direction: column;
@@ -369,18 +376,18 @@
          .id_card {
            font-weight: bold;
            font-size: 86px;
            font-size: 68px;
          }
          .no {
            margin: 10px 0;
            font-weight: 500;
            font-size: 58px;
            font-size: 52px;
          }
          .place {
            font-weight: 500;
            font-size: 42px;
            font-size: 36px;
          }
          .plat {
@@ -426,23 +433,22 @@
      .qrcode_wrap {
        width: 100%;
        flex: 1;
        flex-shrink: 0;
        /* flex-shrink: 0; */
        background-color: #51b2ce;
        padding: 36px 0;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        .qrcode {
          padding: 12px;
          padding: 6px;
          background-color: #fff;
        }
        .title {
          margin-top: 20px;
          font-weight: bold;
          font-size: 38px;
          font-size: 34px;
          color: #111111;
        }
      }
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -71,6 +71,7 @@
    // è®¿å®¢æ¥è®¿é…ç½®
    public static final String VISIT_CONFIG = "VISIT_CONFIG";
    public static final String MEMBER_IMG = "MEMBER_IMG";
    public static final String PLATFORM_EVENT_IMG = "PLATFORM_EVENT_IMG";
    public static final String VISIT_NOTICE = "VISIT_NOTICE";
    //健康证配置
    public static final String LW_HEALTH_CARD = "LW_HEALTH_CARD";
server/system_service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -1,5 +1,7 @@
package com.doumee.core.utils;
import org.springframework.http.HttpMethod;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
@@ -87,6 +89,40 @@
        }
        return null;
    }
    public static InputStream connectionInputsteam(String url,String method,String data,String contentType ){
        HttpURLConnection connection = null;
        try {
            URL _url = new URL(url);
            connection = (HttpURLConnection) _url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            if(contentType != null){
                connection.setRequestProperty("Content-Type", contentType);
            }
            connection.connect();
            if(data != null){
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("utf-8"));
                outputStream.close();
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
               return  connection.getInputStream();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
    public static String connectionHttp(String url,String method,String data,String contentType ){
        HttpURLConnection connection = null;
        try {
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformDeviceCloudController.java
@@ -1,21 +1,21 @@
package com.doumee.cloud.admin;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.PlatformDevice;
import com.doumee.service.business.PlatformDeviceService;
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.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@@ -34,14 +34,14 @@
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @RequiresPermissions("business:platformdevice:create")
    @CloudRequiredPermission("business:platformdevice:create")
    public ApiResponse create(@RequestBody PlatformDevice platformDevice) {
        return ApiResponse.success(platformDeviceService.create(platformDevice));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @RequiresPermissions("business:platformdevice:delete")
    @CloudRequiredPermission("business:platformdevice:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        platformDeviceService.deleteById(id);
        return ApiResponse.success(null);
@@ -49,7 +49,7 @@
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @RequiresPermissions("business:platformdevice:delete")
    @CloudRequiredPermission("business:platformdevice:delete")
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
@@ -62,30 +62,30 @@
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @RequiresPermissions("business:platformdevice:update")
    public ApiResponse updateById(@RequestBody PlatformDevice platformDevice) {
    @CloudRequiredPermission("business:platformdevice:update")
    public ApiResponse updateById(@RequestBody PlatformDevice platformDevice,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        platformDeviceService.updateById(platformDevice);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @RequiresPermissions("business:platformdevice:query")
    public ApiResponse<PageData<PlatformDevice>> findPage (@RequestBody PageWrap<PlatformDevice> pageWrap) {
    @CloudRequiredPermission("business:platformdevice:query")
    public ApiResponse<PageData<PlatformDevice>> findPage (@RequestBody PageWrap<PlatformDevice> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(platformDeviceService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @RequiresPermissions("business:platformdevice:exportExcel")
    public void exportExcel (@RequestBody PageWrap<PlatformDevice> pageWrap, HttpServletResponse response) {
    @CloudRequiredPermission("business:platformdevice:exportExcel")
    public void exportExcel (@RequestBody PageWrap<PlatformDevice> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(PlatformDevice.class).export(platformDeviceService.findPage(pageWrap).getRecords(), "月台_关联监控点LED和广播信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:platformdevice:query")
    public ApiResponse findById(@PathVariable Integer id) {
    @CloudRequiredPermission("business:platformdevice:query")
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(platformDeviceService.findById(id));
    }
}
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PlatformEventCloudController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
package com.doumee.cloud.admin;
import com.doumee.api.BaseController;
import com.doumee.config.annotation.CloudRequiredPermission;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.dao.business.model.PlatformEvent;
import com.doumee.service.business.PlatformEventService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/08/28 17:24
 */
@Api(tags = "月台_车辆进出事件推送记录表")
@RestController
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business//platformEvent")
public class PlatformEventCloudController extends BaseController {
    @Autowired
    private PlatformEventService platformEventService;
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    @CloudRequiredPermission("business:platformevent:create")
    public ApiResponse create(@RequestBody PlatformEvent platformEvent,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(platformEventService.create(platformEvent));
    }
    @ApiOperation("根据ID删除")
    @GetMapping("/delete/{id}")
    @CloudRequiredPermission("business:platformevent:delete")
    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        platformEventService.deleteById(id);
        return ApiResponse.success(null);
    }
    @ApiOperation("批量删除")
    @GetMapping("/delete/batch")
    @CloudRequiredPermission("business:platformevent:delete")
    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) {
            idList.add(Integer.valueOf(id));
        }
        platformEventService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID修改")
    @PostMapping("/updateById")
    @CloudRequiredPermission("business:platformevent:update")
    public ApiResponse updateById(@RequestBody PlatformEvent platformEvent,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        platformEventService.updateById(platformEvent);
        return ApiResponse.success(null);
    }
    @ApiOperation("分页查询")
    @PostMapping("/page")
    @CloudRequiredPermission("business:platformevent:query")
    public ApiResponse<PageData<PlatformEvent>> findPage (@RequestBody PageWrap<PlatformEvent> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(platformEventService.findPage(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
    @CloudRequiredPermission("business:platformevent:exportExcel")
    public void exportExcel (@RequestBody PageWrap<PlatformEvent> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        ExcelExporter.build(PlatformEvent.class).export(platformEventService.findPage(pageWrap).getRecords(), "月台车辆进出事件推送记录表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @CloudRequiredPermission("business:platformevent:query")
    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(platformEventService.findById(id));
    }
}
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/event/parks/EventPlatformCarsStatusInfoRequest.java
@@ -15,7 +15,7 @@
    private String motionStatus;//'leave',运动状态  enter#进入,leave#离开
    private String plateNo;//'A12345',车牌号
    private String vehicleDoorStatus;//'open',车门状态  open-开门,close-关门
    private String stockStatus;//'rear',车头车尾状态  Â front#车头,rear#车尾
    private String stockStatus;//'rear',车头车尾状态 front#车头,rear#车尾
    @JSONField(name="BackgroundImage")
    @JsonProperty(value = "BackgroundImage")
    private EventImageInfoRequest backgroundImage;//月台背景大图
server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/PlatformCameraInfoResponse.java
@@ -6,6 +6,6 @@
public class PlatformCameraInfoResponse {
 private String  cameraIdompan;//    String    false    ç›‘控点ID
 private String  cameraId;//    String    false    ç›‘控点ID
 private String  cameraName    ;//String    false    ç›‘控点名称
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PlatformEventMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.PlatformEvent;
import com.github.yulichang.base.MPJBaseMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2024/08/28 17:24
 */
public interface PlatformEventMapper extends BaseMapper<PlatformEvent> {
public interface PlatformEventMapper extends MPJBaseMapper<PlatformEvent> {
}
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/PlatformEvent.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 io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -46,6 +47,9 @@
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "月台编码,关联platform表", example = "1")
    @ExcelColumn(name="月台编码,关联platform表")
    private Integer platformId;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
@@ -158,8 +162,8 @@
    @ExcelColumn(name="车门状态  open-开门,close-关门")
    private String vehicleDoorStatus;
    @ApiModelProperty(value = "车头车尾状态  Â front#车头,rear#车尾", example = "1")
    @ExcelColumn(name="车头车尾状态  Â front#车头,rear#车尾")
    @ApiModelProperty(value = "车头车尾状态front#车头,rear#车尾", example = "1")
    @ExcelColumn(name="车头车尾状态front#车头,rear#车尾")
    private String stockStatus;
    @ApiModelProperty(value = "车牌评分[0-100]", example = "1")
@@ -173,5 +177,21 @@
    @ApiModelProperty(value = "车牌图", example = "1")
    @ExcelColumn(name="车牌图")
    private String platePictureContent;
    @ApiModelProperty(value = "月台背景大图本地下载", example = "1")
    @ExcelColumn(name="月台背景大图本地下载")
    private String backgroundImageDown;
    @ApiModelProperty(value = "车牌图本地下载", example = "1")
    @ExcelColumn(name="车牌图本地下载")
    private String platePictureDown;
    @ApiModelProperty(value = "月台名稱", example = "1")
    @TableField(exist = false)
    private String  platformName;
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
    private String startDate;
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    private String endDate;
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java
@@ -74,11 +74,11 @@
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织类型不正确,请按要求填写~");
        }
        //查询名称不能重复
      /*  if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
        if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                .eq(Company::getName,company.getName())
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }*/
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user ==null){
            user = company.getLoginUserInfo();
@@ -275,12 +275,12 @@
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织类型不正确,请按要求填写~");
        }
        //查询名称不能重复
 /*       if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
        if(companyMapper.selectCount(new QueryWrapper<Company>().lambda()
                .eq(Company::getName,company.getName())
                .ne(Company::getId,company.getId())
                .eq(Company::getIsdeleted,Constants.ZERO)) >0){
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "对不起,组织名称不能重复~");
        }*/
        }
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(user == null){
            user = company.getLoginUserInfo();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -154,6 +154,7 @@
            }
        }catch (Exception e){
            //如果发生异常,删除已经创建的人员信息
            e.printStackTrace();
            deleteHkUserBiz(new String[]{insert.getHkId()});
            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,员工信息新建失败,请稍后重试!");
        }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PlatformEventServiceImpl.java
@@ -1,20 +1,27 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.PlatformEventMapper;
import com.doumee.dao.business.model.Empower;
import com.doumee.dao.business.model.Platform;
import com.doumee.dao.business.model.PlatformEvent;
import com.doumee.service.business.PlatformEventService;
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实现
@@ -24,6 +31,8 @@
@Service
public class PlatformEventServiceImpl implements PlatformEventService {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private PlatformEventMapper platformEventMapper;
@@ -87,129 +96,139 @@
    @Override
    public PageData<PlatformEvent> findPage(PageWrap<PlatformEvent> pageWrap) {
        IPage<PlatformEvent> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<PlatformEvent> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<PlatformEvent> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.selectAll(PlatformEvent.class)
                .selectAs(Platform::getName,PlatformEvent::getPlatformName)
                .leftJoin(Platform.class, Platform::getId,PlatformEvent::getPlatformId);
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getId, pageWrap.getModel().getId());
            queryWrapper.eq(PlatformEvent::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getCreator, pageWrap.getModel().getCreator());
            queryWrapper.eq(PlatformEvent::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(PlatformEvent::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(PlatformEvent::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
            queryWrapper.ge(PlatformEvent::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.le(PlatformEvent::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getEditor, pageWrap.getModel().getEditor());
            queryWrapper.eq(PlatformEvent::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(PlatformEvent::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(PlatformEvent::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
            queryWrapper.ge(PlatformEvent::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.le(PlatformEvent::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getIsdeleted, pageWrap.getModel().getIsdeleted());
            queryWrapper.eq(PlatformEvent::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getRemark, pageWrap.getModel().getRemark());
            queryWrapper.eq(PlatformEvent::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getEventId() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getEventId, pageWrap.getModel().getEventId());
            queryWrapper.eq(PlatformEvent::getEventId, pageWrap.getModel().getEventId());
        }
        if (pageWrap.getModel().getEventType() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getEventType, pageWrap.getModel().getEventType());
            queryWrapper.eq(PlatformEvent::getEventType, pageWrap.getModel().getEventType());
        }
        if (pageWrap.getModel().getSrcType() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getSrcType, pageWrap.getModel().getSrcType());
            queryWrapper.eq(PlatformEvent::getSrcType, pageWrap.getModel().getSrcType());
        }
        if (pageWrap.getModel().getHappenTime() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getHappenTime, pageWrap.getModel().getHappenTime());
            queryWrapper.eq(PlatformEvent::getHappenTime, pageWrap.getModel().getHappenTime());
        }
        if (pageWrap.getModel().getSrcIndex() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getSrcIndex, pageWrap.getModel().getSrcIndex());
            queryWrapper.eq(PlatformEvent::getSrcIndex, pageWrap.getModel().getSrcIndex());
        }
        if (pageWrap.getModel().getSrcName() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getSrcName, pageWrap.getModel().getSrcName());
            queryWrapper.eq(PlatformEvent::getSrcName, pageWrap.getModel().getSrcName());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getStatus, pageWrap.getModel().getStatus());
            queryWrapper.eq(PlatformEvent::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getTimeout() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getTimeout, pageWrap.getModel().getTimeout());
            queryWrapper.eq(PlatformEvent::getTimeout, pageWrap.getModel().getTimeout());
        }
        if (pageWrap.getModel().getDataType() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getDataType, pageWrap.getModel().getDataType());
            queryWrapper.eq(PlatformEvent::getDataType, pageWrap.getModel().getDataType());
        }
        if (pageWrap.getModel().getSendTime() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getSendTime, pageWrap.getModel().getSendTime());
            queryWrapper.eq(PlatformEvent::getSendTime, pageWrap.getModel().getSendTime());
        }
        if (pageWrap.getModel().getDateTime() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getDateTime, pageWrap.getModel().getDateTime());
            queryWrapper.eq(PlatformEvent::getDateTime, pageWrap.getModel().getDateTime());
        }
        if (pageWrap.getModel().getIpAddress() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getIpAddress, pageWrap.getModel().getIpAddress());
            queryWrapper.eq(PlatformEvent::getIpAddress, pageWrap.getModel().getIpAddress());
        }
        if (pageWrap.getModel().getIpv6Address() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getIpv6Address, pageWrap.getModel().getIpv6Address());
            queryWrapper.eq(PlatformEvent::getIpv6Address, pageWrap.getModel().getIpv6Address());
        }
        if (pageWrap.getModel().getPortNo() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getPortNo, pageWrap.getModel().getPortNo());
            queryWrapper.eq(PlatformEvent::getPortNo, pageWrap.getModel().getPortNo());
        }
        if (pageWrap.getModel().getProtocol() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getProtocol, pageWrap.getModel().getProtocol());
            queryWrapper.eq(PlatformEvent::getProtocol, pageWrap.getModel().getProtocol());
        }
        if (pageWrap.getModel().getMacAddress() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getMacAddress, pageWrap.getModel().getMacAddress());
            queryWrapper.eq(PlatformEvent::getMacAddress, pageWrap.getModel().getMacAddress());
        }
        if (pageWrap.getModel().getChannelId() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getChannelId, pageWrap.getModel().getChannelId());
            queryWrapper.eq(PlatformEvent::getChannelId, pageWrap.getModel().getChannelId());
        }
        if (pageWrap.getModel().getActivePostCount() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getActivePostCount, pageWrap.getModel().getActivePostCount());
            queryWrapper.eq(PlatformEvent::getActivePostCount, pageWrap.getModel().getActivePostCount());
        }
        if (pageWrap.getModel().getEventState() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getEventState, pageWrap.getModel().getEventState());
            queryWrapper.eq(PlatformEvent::getEventState, pageWrap.getModel().getEventState());
        }
        if (pageWrap.getModel().getEventDescription() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getEventDescription, pageWrap.getModel().getEventDescription());
            queryWrapper.eq(PlatformEvent::getEventDescription, pageWrap.getModel().getEventDescription());
        }
        if (pageWrap.getModel().getChannelName() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getChannelName, pageWrap.getModel().getChannelName());
            queryWrapper.like(PlatformEvent::getChannelName, pageWrap.getModel().getChannelName());
        }
        if (pageWrap.getModel().getDeviceId() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getDeviceId, pageWrap.getModel().getDeviceId());
            queryWrapper.eq(PlatformEvent::getDeviceId, pageWrap.getModel().getDeviceId());
        }
        if (pageWrap.getModel().getHpno() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getHpno, pageWrap.getModel().getHpno());
            queryWrapper.eq(PlatformEvent::getHpno, pageWrap.getModel().getHpno());
        }
        if (pageWrap.getModel().getMotionStatus() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getMotionStatus, pageWrap.getModel().getMotionStatus());
            queryWrapper.eq(PlatformEvent::getMotionStatus, pageWrap.getModel().getMotionStatus());
        }
        if (pageWrap.getModel().getPlateNo() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getPlateNo, pageWrap.getModel().getPlateNo());
            queryWrapper.like(PlatformEvent::getPlateNo, pageWrap.getModel().getPlateNo());
        }
        if (pageWrap.getModel().getVehicleDoorStatus() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getVehicleDoorStatus, pageWrap.getModel().getVehicleDoorStatus());
            queryWrapper.eq(PlatformEvent::getVehicleDoorStatus, pageWrap.getModel().getVehicleDoorStatus());
        }
        if (pageWrap.getModel().getStockStatus() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getStockStatus, pageWrap.getModel().getStockStatus());
            queryWrapper.eq(PlatformEvent::getStockStatus, pageWrap.getModel().getStockStatus());
        }
        if (pageWrap.getModel().getPlateScore() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getPlateScore, pageWrap.getModel().getPlateScore());
            queryWrapper.eq(PlatformEvent::getPlateScore, pageWrap.getModel().getPlateScore());
        }
        if (pageWrap.getModel().getBackgroundImageContent() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getBackgroundImageContent, pageWrap.getModel().getBackgroundImageContent());
            queryWrapper.eq(PlatformEvent::getBackgroundImageContent, pageWrap.getModel().getBackgroundImageContent());
        }
        if (pageWrap.getModel().getPlatePictureContent() != null) {
            queryWrapper.lambda().eq(PlatformEvent::getPlatePictureContent, pageWrap.getModel().getPlatePictureContent());
            queryWrapper.eq(PlatformEvent::getPlatePictureContent, pageWrap.getModel().getPlatePictureContent());
        }
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getPlatformName()), Platform::getName,pageWrap.getModel().getPlatformName());
        queryWrapper.ge(Objects.nonNull(pageWrap.getModel().getStartDate()), PlatformEvent::getCreateDate,pageWrap.getModel().getStartDate());
        queryWrapper.le(Objects.nonNull(pageWrap.getModel().getEndDate()),PlatformEvent::getCreateDate,pageWrap.getModel().getEndDate());
        queryWrapper.orderByDesc(PlatformEvent::getCreateDate);
        PageData<PlatformEvent> result = PageData.from(platformEventMapper.selectJoinPage(page, PlatformEvent.class,queryWrapper));
        if(result!=null && result.getRecords()!=null){
            String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
            for(PlatformEvent model : result.getRecords()){
                if(StringUtils.isNotBlank(model.getBackgroundImageContent())){
                    model.setBackgroundImageDown(prefixUrl + model.getBackgroundImageContent());
                }
            }
        }
        return PageData.from(platformEventMapper.selectPage(page, queryWrapper));
        return  result;
    }
    @Override
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncImgServiceImpl.java
@@ -8,6 +8,7 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import lombok.extern.slf4j.Slf4j;
@@ -34,6 +35,8 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private PlatformEventMapper platformEventMapper;
    @Autowired
    private DeviceEventMapper deviceEventMapper;
    @Autowired
    private VisitEventMapper visitEventMapper;
@@ -54,6 +57,8 @@
            startDealDeviceImg();
            //查询所有人员人脸照片
            startDealMemberImg();
            //查询所有月台事件中抓拍图照片
            startDealPlatformEventImg();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
@@ -87,6 +92,33 @@
                    }
                }
                memberMapper.updateById(event);
            }
        }
    }
    private void startDealPlatformEventImg() {
        List<PlatformEvent> list = platformEventMapper.selectList(new QueryWrapper<PlatformEvent>().lambda()
                .eq(PlatformEvent::getIsdeleted,Constants.ZERO)
                .isNotNull(PlatformEvent::getBackgroundImageContent)
                .notLikeRight(PlatformEvent::getBackgroundImageContent, HKConstants.IMG_INDEX_ERROR)
                .isNull(PlatformEvent::getBackgroundImageDown));
        Date date= new Date();
        if(list !=null && list.size()>0){
            for(PlatformEvent model:list){
                String rs1 = null;
                PlatformEvent event = new PlatformEvent();
                event.setId(model.getId());
                event.setEditDate(date);
                if(StringUtils.isNotBlank(model.getBackgroundImageContent())){
                    String img1 = model.getBackgroundImageContent();
                    rs1 = downHkImgToFtp(img1,"",Constants.PLATFORM_EVENT_IMG);
                    if(StringUtils.isNotBlank(rs1)){
                        event.setBackgroundImageDown(rs1);
                    }else{
                        event.setBackgroundImageContent(HKConstants.IMG_INDEX_ERROR+model.getBackgroundImageContent());
                    }
                }
                platformEventMapper.updateById(event);
            }
        }
@@ -251,11 +283,13 @@
            param.setPicUri(img1.replace(HKConstants.IMG_INDEX_ERROR,"").replace(HKConstants.IMG_INDEX,""));
            param.setServerIndexCode(serverIndex);
            is = HKService.getFaceInputStream(param);
        }else if(StringUtils.equals(folder_code,Constants.PLATFORM_EVENT_IMG)){
            //月台事件图片
            is = HttpsUtil.connectionInputsteam(img1,"GET",null,null);
        }
        if(is ==null){
            return  null;
        }
        try {
            if(ftp == null){
                 ftp = new FtpUtil(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_HOST).getCode(),
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncLoginAuthServiceImpl.java
@@ -27,7 +27,6 @@
    @Autowired
    private DeviceMapper deviceMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
@@ -76,7 +75,6 @@
                }catch (Exception e){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,登录组件失败,请稍后重试!");
                }
            }else{
                throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,登录组件失败,请稍后重试!");
            }
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPlatformsServiceImpl.java
@@ -188,7 +188,7 @@
                d.setCreateDate(model.getCreateDate());
                d.setPlatformId(model.getId());
                d.setIsdeleted(Constants.ZERO);
                d.setDeviceId(param.getCameraIdompan());
                d.setDeviceId(param.getCameraId());
                d.setName(param.getCameraName());
                d.setType(Constants.ONE);
                list.add(d);
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -867,17 +867,23 @@
                }
                //各车道车辆状态
                EventPlatformCarsStatusInfoRequest status = data.getHPVehicleStatus();
                eventList.add(initPlatformEventModel(request,data,status));//封装事件(已月台通道为维度)
                PlatformEvent event = initPlatformEventModel(request,data,status);
                if(StringUtils.isBlank(status.getPlateNo())){
                    eventList.add(event);//封装事件(已月台通道为维度)
                    continue;//如果车辆信息为空,不处理直接跳过
                }
                PlatformDevice model = platformDeviceMapper.selectOne(new QueryWrapper<PlatformDevice>().lambda()
                        .eq(PlatformDevice::getDeviceId,request.getSrcIndex())
                        .eq(PlatformDevice::getIsdeleted,Constants.ZERO)
                        .last("limit 1"));
                if(model ==null){
                    eventList.add(event);//封装事件(已月台通道为维度)
                    continue;//监控点未同步,跳过处理
                }
                if(StringUtils.isBlank(status.getPlateNo())){
                    continue;//如果车辆信息为空,不处理直接跳过
                }
                event.setPlatformId(model.getPlatformId());//月台编码
                eventList.add(event);//封装事件(已月台通道为维度)
                //截掉第一个颜色汉字,去掉“挂”字
                status.setPlateNo(status.getPlateNo().substring(1,status.getPlateNo().length()).replace("挂",""));
                PlatformJob job = platformJobMapper.selectJoinOne(PlatformJob.class, new MPJLambdaWrapper<PlatformJob>()
                        .selectAll(PlatformJob.class)
                        .selectAs(Platform::getName,PlatformJob::getPlatformName)
@@ -886,12 +892,15 @@
                        .eq(!StringUtils.equals(status.getStockStatus(),"front"),PlatformJob::getCarCodeBack,status.getPlateNo() )//后车牌号
                        .eq(PlatformJob::getIsdeleted,Constants.ZERO )
                        .last("limit 1 "));
                if(job == null){
                    continue;//如果作业为空,跳过处理
                }
                PlatformJob update = new PlatformJob();
                update.setId(job.getId());
                update.setEditDate(new Date());
                if(StringUtils.equals(status.getMotionStatus(),"leave")){
                    //如果是车辆离开,不做相关自动完成作业业务处理
                 /*   if(job ==null && !Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
                   /* if(job ==null && !Constants.equalsInteger(job.getStatus(),Constants.PlatformJobStatus.WORKING.getKey())){
                        continue;//如果没查到对应的作业或者作业并非作业中,不做业务处理
                    }
                    if(Constants.equalsInteger(job.getType(), Constants.THREE) || Constants.equalsInteger(job.getType(), Constants.TWO)){