''
liukangdong
2024-07-04 5a85dcab83e969d6b21c599b512a15117e9b8651
''
已修改53个文件
1441 ■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/approve.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/carUseBook.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/visits.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/meeting/bookings.js 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/meeting/rooms.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/element-variables.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/style/style.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsReportWindow.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsWindow.vue 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/QueryForm/queryForm.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/UploadAvatarImage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/upload.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/operation/OperCarUseBookParamWindow.vue 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalConfiguration.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/reportRecord.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visits.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/bookings.vue 205 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/components/OperaBookingsDetailWindow.vue 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/components/OperaBookingsWindow.vue 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/devices.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/rooms.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprConfig.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprRecord.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visSubDetail.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/meeting.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/staff.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/Li-Calendar/Li-Calendar.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/applicationRecord/applicationRecord.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login/login.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingCalendar.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingDetail.vue 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingManager.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSel.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSub.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSubOrder.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/snapshot.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/index.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/vDangetAppr.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/apply.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACarDetail.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shinei.vue 162 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shiwai.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staffLogin/login.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/service.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -1,4 +1,4 @@
# 开发环境配置
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://192.168.0.173/admin_interface'
VUE_APP_API_URL  = 'http://192.168.0.135:10010'
admin/src/api/business/approve.js
@@ -41,3 +41,9 @@
export function dealHiddenDanger (data) {
  return request.post('/visitsAdmin/cloudService/business/hiddenDanger/dealHiddenDanger', data)
}
// 任务中心标记已读
export function taskSignRead (params) {
  return request.get('/visitsAdmin/cloudService/business/staging/signRead', {
    params
  })
}
admin/src/api/business/carUseBook.js
@@ -40,6 +40,10 @@
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/carUseBook/delete/${id}`)
}
// 撤销
export function revokeById (id) {
  return request.get(`/visitsAdmin/cloudService/business/carUseBook/revoke?id=${id}`)
}
// 根据ID查询
export function detail (id) {
  return request.get(`/visitsAdmin/cloudService/business/carUseBook/${id}`)
admin/src/api/business/visits.js
@@ -55,7 +55,7 @@
}
// 提交访客信息
export const createFk = (data) => {
  return request.post('/visitsAdmin/cloudService/web/visitor/createFk', data)
  return request.post('/visitsAdmin/cloudService/business/visits/createFk', data)
}
// 访客报备
export const createVisit = (data) => {
admin/src/api/meeting/bookings.js
@@ -25,8 +25,17 @@
}
// 取消
export function cancelById (data) {
  debugger
  return request.post('/meetingAdmin/cloudService/business/bookings/cancelById', data)
  return request.post('/meetingAdmin/cloudService/business/meeting/reservationCancel', data)
}
// 结束
export function overBookById (data) {
  return request.post('/meetingAdmin/cloudService/business/meeting/reservationOver', data)
}
// 预定详情
export function BookDetailById (params) {
  return request.get('/meetingAdmin/cloudService/web/meeting/meetingDetail', {
    params
  })
}
// 删除
admin/src/api/meeting/rooms.js
@@ -33,7 +33,7 @@
// 删除
export function deleteById (id) {
  return request.get(`/meetingAdmin/cloudService/rooms/delete/${id}`)
  return request.get(`/meetingAdmin/cloudService/business/rooms/delete/${id}`)
}
// 批量删除
admin/src/assets/style/element-variables.scss
@@ -9,4 +9,7 @@
.el-drawer__header {
  color: #333333 !important;
}
.el-image-viewer__wrapper{
  z-index: 3000 !important;
}
admin/src/assets/style/style.scss
@@ -142,6 +142,10 @@
  padding: 30px;
  margin: 0 16px;
}
.query_btns{
  border-bottom: 1px solid #eee;
  padding-bottom: 10px;
}
/** 基础通用 **/
 // 大小 外边距
 .flex1{
admin/src/components/business/OperaCarUseBookWindow.vue
@@ -15,7 +15,7 @@
          <span class="right"  v-if="model.status === 1">审批中</span>
          <span class="right" style="background:#53b76f " v-if="model.status === 2">审批通过</span>
          <span class="right" style="background:#dc362e " v-if="model.status === 3">审批不通过</span>
          <span class="right" style="background:#dc362e " v-if="model.status === 4">已取消</span>
          <span class="right" style="background:#B2B2B2; " v-if="model.status === 4">已撤销</span>
        </div>
        <div class="info">
          <div class="title">公务车申请信息</div>
@@ -124,7 +124,7 @@
    >
      <el-form :model="dealForm" ref="dealForm" >
        <!-- <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam === 1"> -->
        <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 0">
        <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 1">
          <el-select v-model="dealForm.driverId" style="width: 300px"  filterable clearable placeholder="请选择派遣司机">
            <el-option
                v-for="item in memberList"
admin/src/components/business/OperaCarsWindow.vue
@@ -19,7 +19,7 @@
            </el-radio-group>
          </el-form-item>
          <el-form-item label="选择车主:" prop="memberId">
            <el-select v-model="form.memberId" filterable placeholder="请选择">
            <el-select v-model="form.memberId" clearable filterable placeholder="请选择">
              <el-option
                  v-for="item in memberList"
                  :key="item.id"
admin/src/components/business/OperaHiddenDangerWindow.vue
@@ -144,9 +144,9 @@
    </div>
    <!--  -->
    <template   v-slot:footer>
      <el-button @click="isShowProblem = true"  type="primary"  v-if="model.status==0&& model.checkUserId == userInfo.memberId"  class="status-red">处理</el-button>
      <el-button @click="openHandModal"  type="primary"  v-if="model.status==0&& model.checkUserId == userInfo.memberId"  class="status-red">处理</el-button>
      <el-button type="primary" plain v-if="model.status==0 && model.checkUserId == userInfo.memberId" @click="handleTransfer">转交</el-button>
      <el-button @click="isBackProblem=true"  v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger"  >退回</el-button>
      <el-button @click="openBackModal"  v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger"  >退回</el-button>
      <el-button @click="visible=false">返回</el-button>
    </template>
@@ -236,7 +236,7 @@
              v-model="backForm.checkDate"
          />
        </el-form-item>
        <el-form-item label="整改前" prop="dealBeforeFileList">
        <el-form-item label="图片/视频" prop="dealBeforeFileList">
          <div class="df_ac">
            <upload  width="80px" height="80px" :list="backForm.dealBeforeFileList" :tips="'图片/视频'"    accept=".png,.jpg,.jpeg,.mp4" folder="hiddendanger" @loading="uploading = true" @dele="dele($event,2)" @success="uploadFileList($event, 2)" />
          </div>
@@ -264,6 +264,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import upload from '@/components/common/upload'
import dayjs from 'dayjs'
import { memberList } from '@/api/business/hiddenDangerParam'
import { mapState } from 'vuex'
export default {
@@ -309,7 +310,7 @@
        /*,
        dealBeforeFileList: [
          { required: true, message: '请上传整改前情况' }
        ]*/
        ] */
      },
      memberList: [],
      transForm: {
@@ -338,6 +339,24 @@
    })
  },
  methods: {
    openHandModal () {
      const { model } = this
      this.isShowProblem = true
      this.$set(this.dealForm, 'checkDate', dayjs().format('YYYY-MM-DD HH:mm:ss'))
      if (model.submitFileList && model.submitFileList.length > 0) {
        this.$set(this.dealForm, 'dealBeforeFileList', model.submitFileList.map(item => {
          return {
            fileurl: item.fileurl,
            name: item.name,
            url: item.fileurlFull
          }
        }))
      }
    },
    openBackModal () {
      this.isBackProblem = true
      this.$set(this.backForm, 'checkDate', dayjs().format('YYYY-MM-DD HH:mm:ss'))
    },
    dele (index, type) {
      if (type == 0) {
        if (this.dealForm.dealBeforeFileList != null && this.dealForm.dealBeforeFileList.length > index) {
admin/src/components/business/operaVisitsReportWindow.vue
@@ -5,6 +5,7 @@
    :visible.sync="isShowModal"
    :confirm-working="isWorking"
    @confirm="confirm"
    @close="close"
  >
    <el-form :model="param" ref="paramRef" :rules="rules">
      <div class="title_tip">访客预约</div>
@@ -43,6 +44,7 @@
      <el-form-item label="手机号" prop="phone">
        <el-input
          v-model="param.phone"
          maxlength="11"
          placeholder="请输入联系人的手机号"
        ></el-input>
      </el-form-item>
@@ -58,6 +60,7 @@
      <el-form-item label="随车人数" prop="memberNum">
        <el-input
          v-model="param.memberNum"
          oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)"
          placeholder="请输入随车人员总数"
        ></el-input>
      </el-form-item>
@@ -193,6 +196,10 @@
      this.$set(this.param, 'faceImg', file.imgurl)
      this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    close () {
      this.isShowModal = false
      this.$emit('close')
    },
    // 同步信息
    confirm () {
      this.$refs.paramRef.validate((valid) => {
admin/src/components/business/operaVisitsWindow.vue
@@ -5,6 +5,7 @@
    :visible.sync="isShowModal"
    :confirm-working="isWorking"
    @confirm="confirm"
    @close="close"
  >
    <el-form :model="param" ref="paramRef" :rules="rules">
      <div class="title_tip">访客信息</div>
@@ -17,6 +18,7 @@
      <el-form-item label="访客手机号" prop="phone">
        <el-input
          v-model="param.phone"
          maxlength="11"
          placeholder="请输入访客的手机号"
        ></el-input>
      </el-form-item>
@@ -40,7 +42,7 @@
          placeholder="请输入来访的单位全称"
        ></el-input>
      </el-form-item>
      <el-form-item label="人脸照片">
      <el-form-item label="人脸照片" prop="faceImgUrl">
        <div class="upload_wrap">
          <UploadFaceImg
            :file="{ imgurlfull: param.faceImgUrl, imgurl: param.faceImg }"
@@ -134,7 +136,7 @@
    GlobalWindow,
    UploadFaceImg
  },
  data() {
  data () {
    return {
      isShowModal: false,
      param: {
@@ -149,7 +151,7 @@
        folder: 'member'
      },
      startPickerOptions: {
        disabledDate(time) {
        disabledDate (time) {
          return time.getTime() < Date.now() - 8.64e7 // 禁用超过当前时间的日期
        },
        selectableRange: '00:00:00 - 23:59:59' // 这个加上之后,时分秒上面才有禁止选择变灰,如果不加,也可以禁止选择,但是不会变灰
@@ -180,13 +182,14 @@
      }
    }
  },
  created() {
  created () {
    this.$set(this.param, 'receptMemberId', this.$store.state.userInfo.memberId)
    this.$set(this.param, 'starttime', dayjs().format('YYYY-MM-DD HH:mm:ss'))
    this.initData()
  },
  watch: {
    'param.starttime': {
      handler(newValue, oldValue) {
      handler (newValue, oldValue) {
        if (newValue) {
          const date = new Date()
          // const min = date.getMinutes()
@@ -210,7 +213,7 @@
      immediate: true
    },
    'param.endtime': {
      handler(newValue, oldValue) {
      handler (newValue, oldValue) {
        if (newValue) {
          const nowDate = dayjs(this.param.starttime).format('HH:mm:ss')
          let st = ''
@@ -228,7 +231,11 @@
    }
  },
  methods: {
    initData() {
    close () {
      this.isShowModal = false
      this.$emit('close')
    },
    initData () {
      getVisitedVisitReason({}).then(res => {
        this.VisitReason = res || []
      })
@@ -237,15 +244,15 @@
        console.log('memberList', this.memberList)
      })
    },
    uploadAvatarSuccess(file) {
    uploadAvatarSuccess (file) {
      this.$set(this.param, 'faceImg', file.imgurl)
      this.$set(this.param, 'faceImgUrl', file.imgurlfull)
    },
    changeStarttime(e) {
      this.$set(this.param, 'endtime', this.param.starttime)
    changeStarttime (e) {
      // this.$set(this.param, 'endtime', this.param.starttime)
    },
    // 同步信息
    confirm() {
    confirm () {
      this.$refs.paramRef.validate((valid) => {
        if (!valid) {
          return
@@ -262,7 +269,6 @@
            this.$emit('close')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
@@ -281,6 +287,16 @@
.upload_wrap{
  display: flex;
  align-items: center;
  justify-content: center;
  .avatar-uploader{
    display: flex;
    align-items: center;
    justify-content: center;
  }
  ::v-deep .avatar{
    max-width: 90px;
    max-height: 90px;
  }
  .content{
    display: flex;
    flex-direction: column;
admin/src/components/common/QueryForm/queryForm.vue
@@ -54,6 +54,7 @@
          :label="item.label || '选择日期'">
          <el-date-picker v-model="searchForm[item.filed]" format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange"
            :default-time="['00:00:00', '23:59:59']"
            :picker-options="item.pickerOptions || pickerOptions" range-separator="至"
            :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true"
            :start-placeholder="item.start || '开始时间'" :end-placeholder="item.end || '结束时间'" class="w400"
@@ -99,13 +100,13 @@
      default: () => { }
    }
  },
  data() {
  data () {
    return {
      showZk: false,
      pickerOptions: {
        shortcuts: [{
          text: '近7天',
          onClick(picker) {
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(end.getTime() - 3600 * 1000 * 24 * 6)
@@ -114,7 +115,7 @@
        },
        {
          text: '近30天',
          onClick(picker) {
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(end.getTime() - 3600 * 1000 * 24 * 29)
@@ -123,7 +124,7 @@
        },
        {
          text: '近60天',
          onClick(picker) {
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(end.getTime() - 3600 * 1000 * 24 * 59)
@@ -132,14 +133,14 @@
        },
        {
          text: '近90天',
          onClick(picker) {
          onClick (picker) {
            const end = new Date()
            const start = new Date()
            start.setTime(end.getTime() - 3600 * 1000 * 24 * 89)
            picker.$emit('pick', [start, end])
          }
        }],
        disabledDate(time) {
        disabledDate (time) {
          var curDate = new Date(new Date().toLocaleDateString()).getTime()
          var preDate = new Date(curDate + 24 * 60 * 60 * 1000 - 1)
          return time.getTime() > preDate
@@ -150,31 +151,31 @@
  emits: ['input', 'handleQuery', 'clear'],
  computed: {
    searchForm: {
      get() {
      get () {
        return this.value
      },
      set(value) {
      set (value) {
        this.$emit('input', value)
      }
    }
  },
  methods: {
    handleQuery() {
    handleQuery () {
      this.$emit('handleQuery')
    },
    handlekeyup(pd) {
    handlekeyup (pd) {
      if (pd) {
        this.$emit('handleQuery')
      }
    },
    changeForm(filed) {
    changeForm (filed) {
      this.$emit('changeForm', filed)
    },
    zkBtn() {
    zkBtn () {
      this.showZk = !this.showZk
      this.$emit('zkBtn', this.zk)
    },
    clear() {
    clear () {
      this.$emit('clear')
    }
  }
admin/src/components/common/UploadAvatarImage.vue
@@ -2,7 +2,7 @@
  <div>
    <el-upload
      class="avatar-uploader"
      accept=".png,.jpg"
      accept=".png,.jpg,.jpeg"
      :style="customStyle"
      :action="uploadImgUrl"
      :data="uploadData"
@@ -30,7 +30,7 @@
    tipsLabel: '',
    customStyle: {
      type: String,
      default: 'width: 90px; height: 90px;'
      default: 'width: 90px; max-height: 90px;'
    },
    uploadData: Object
  },
@@ -92,8 +92,8 @@
  text-align: center;
}
.avatar {
  width: 100% !important;
  height: auto !important;
  width: 90px;
  max-height: 90px;
  display: block;
}
.tips-style {
admin/src/components/common/upload.vue
@@ -72,7 +72,6 @@
            console.log(res.data.data)
          })
          .catch(e => {
            this.$message.error(e)
          })
          .finally(() => {
            this.$refs.file.value = null
admin/src/components/operation/OperCarUseBookParamWindow.vue
@@ -17,7 +17,7 @@
          >
        </el-form-item>
        <el-form-item label="选择车辆" prop="carId">
          <el-select v-model="form.carId" placeholder="选择车辆">
          <el-select v-model="form.carId" @change="clearTime" placeholder="选择车辆">
            <el-option
              v-for="item in carsList"
              :key="item.id"
@@ -133,6 +133,7 @@
                :class="{
                  disable: item.isUse == 1,
                  active: item.checked == '1',
                  hasSub: item.carUseBookId,
                }"
                @click="datetimeClick(item, i)"
                v-for="(item, i) in timeList"
@@ -161,6 +162,7 @@
      :visible.sync="isShowShiwai"
      append-to-body
      width="600px"
      :before-close="clearTime"
    >
      <el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
        <el-form-item label="用车开始时间" prop="startTime">
@@ -189,7 +191,10 @@
      <div class="have_info" v-if="info && info.length > 0">
        <div class="tit">您申请的用车时段已有车辆预约</div>
        <div class="content" v-for="(item, i) in info" :key="i">
          <div class="card">{{ item.carCode }}</div>
          <div class="df_sb">
            <span class="card" v-if="item.carCode">{{ item.carCode }}</span>
            <span>{{ i + 1 }}/{{ info.length }}</span>
          </div>
          <div class="line">
            <span>用车时段</span>
            <span>
@@ -212,16 +217,48 @@
          </div>
          <div class="line">
            <span>申请人</span>
            <span>{{ item.memberName }} {{ item.memberMobile }}</span>
            <span>{{ item.memberName }} <span class="primaryColor">{{ item.memberMobile }}</span></span>
          </div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <div>已选择:{{ selDatetime }}</div>
        <div class="btn" @click="subTime">确认时间</div>
        <div class="btn" :class="{disable: info && info.length > 0}" @click="subTime">确认时间</div>
      </span>
    </el-dialog>
    <!-- 详情 -->
     <el-dialog
      title="选择用车时间"
      :visible.sync="isShowDetail"
      append-to-body
      width="600px"
    >
      <div class="detail_modal">
        <div class="title">车辆预约情况</div>
        <div class="h1" v-if="activeInfo.carCode">{{ activeInfo.carCode }}</div>
        <div class="line">
          <div class="label">预计用车时段</div>
          <div class="value" v-if="activeInfo.startTime">{{ activeInfo.startTime.slice(5, 16) }} - {{ activeInfo.endTime.slice(5, 16) }}</div>
        </div>
        <div class="line">
          <div class="label">目的地</div>
          <div class="value">{{ activeInfo.addr }}</div>
        </div>
        <div class="line">
          <div class="label">乘车人数</div>
          <div class="value" v-if="activeInfo.memberIds">{{ activeInfo.memberIds.split(',').length }}人</div>
        </div>
        <div class="line">
          <div class="label">用车事由</div>
          <div class="value">{{ activeInfo.content || '' }}</div>
        </div>
        <div class="line">
          <div class="label">申请人</div>
          <div class="value">{{ activeInfo.memberName }} <span class="primaryColor ml12">{{ activeInfo.memberPhone }}</span></div>
        </div>
      </div>
     </el-dialog>
  </GlobalWindow>
</template>
@@ -230,14 +267,15 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import { allList } from '@/api/business/member'
import { allList as getCarList } from '@/api/business/cars'
import { carCanReservationDate, carUseBookCraete, carUseBookList } from '@/api/business/carUseBook'
import { carCanReservationDate, carUseBookCraete, carUseBookList, detail } from '@/api/business/carUseBook'
import { findTypeMemberInfo } from '@/api/business/memberCard'
import dayjs from 'dayjs'
export default {
  name: 'OperCarUseBookParamWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data() {
  data () {
    return {
      // 表单数据
      isShowTime: false,
@@ -260,6 +298,9 @@
        endTime: '',
        memberIds: []
      },
      activeInfo: {},
      isShowDetail: false,
      carBookInfo: {},
      pickerOptions: {
        disabledDate: (time) => {
          if (this.form.startTime) {
@@ -306,7 +347,7 @@
  },
  watch: {
    'form.planUseDate': {
      handler(newValue, oldValue) {
      handler (newValue, oldValue) {
        if (newValue) {
          this.$set(this.pickerOptions, 'selectableRange', this.form.startTime.slice(11, 19) + ' - ' + this.form.endTime.slice(11, 19))
          // this.startPickerOptions = this.startPickerOptions
@@ -316,7 +357,7 @@
      immediate: true
    },
    'form.startTime': {
      handler(newValue, oldValue) {
      handler (newValue, oldValue) {
        if (newValue) {
          this.$set(this.pickerOptions, 'selectableRange', this.form.startTime.slice(11, 19) + ' - ' + '23:59:59')
          // this.startPickerOptions = this.startPickerOptions
@@ -326,11 +367,11 @@
      immediate: true
    }
  },
  created() {
  created () {
    this.initData()
  },
  methods: {
    open() {
    open () {
      this.title = '新建公务车用车申请'
      this.form = {
        type: 0,
@@ -341,7 +382,7 @@
      })
      this.visible = true
    },
    confirm() {
    confirm () {
      const form = JSON.parse(JSON.stringify(this.form))
      this.$refs.formRef.validate((valid) => {
        const memberList = []
@@ -365,18 +406,32 @@
        }
      })
    },
    openTime() {
    openTime () {
      const { form } = this
      if (!form.carId) {
        return this.$tip.error('请先选择车辆')
      }
      if (this.form.type === 0) {
        this.$set(this.form, 'dateDay', '')
        this.timeList = []
        this.isShowTime = true
      } else {
        this.clearTime()
        this.isShowShiwai = true
      }
    },
    subTime() {
    clearTime () {
      this.isShowShiwai = false
      this.$set(this.form, 'startTime', '')
      this.$set(this.form, 'endTime', '')
      this.$nextTick(() => {
        if (this.$refs.modalRef) {
          this.$refs.modalRef.clearValidate()
        }
      })
    },
    subTime () {
      if (this.info && this.info.length > 0) return
      if (this.form.type === 0) {
        const selTimeList = this.timeList.filter(i => i.checked == '1')
        if (selTimeList.length === 0) {
@@ -389,11 +444,24 @@
        this.$forceUpdate()
      } else {
        this.$refs.modalRef.validate((valid) => {
          const { form } = this
          if (new Date(form.startTime).getTime() > new Date(form.endTime).getTime()) {
            return this.$tip.error('结束时间应大于开始时间')
          }
          this.isShowShiwai = false
        })
      }
    },
    datetimeClick(item, index) {
    datetimeClick (item, index) {
      if (item.carUseBookId) {
        detail(
          item.carUseBookId
        ).then(res => {
          this.activeInfo = res
          this.isShowDetail = true
        })
        return
      }
      if (item.isUse == '1') return
      const { timeList } = this
      const selTimeList = timeList.filter(i => i.checked == '1')
@@ -434,10 +502,10 @@
        this.selDatetime = this.form.dateDay.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours
      }
    },
    seletedDate(e) {
    seletedDate (e) {
      this.gettimes()
    },
    seletedShiwaiDate() {
    seletedShiwaiDate () {
      const { form } = this
      if (form.startTime && form.endTime) {
        this.selDatetime = form.startTime + '-' + form.endTime
@@ -450,7 +518,7 @@
        })
      }
    },
    gettimes() {
    gettimes () {
      const { form } = this
      carCanReservationDate({
        dateDay: form.dateDay,
@@ -459,11 +527,11 @@
        this.timeList = res || []
        this.timeList.forEach((i, j) => {
          i.checked = '0',
            i.index = j
          i.index = j
        })
      })
    },
    initData() {
    initData () {
      getCarList({
        type: 1
      }).then(res => {
@@ -539,6 +607,10 @@
    background-color: #cccccc;
    color: #999999;
  }
  .hasSub {
      color: #fff;
      background: #cccccc;
    }
}
.color_op {
  display: flex;
@@ -564,6 +636,10 @@
    color: #fff;
    width: 120px;
    text-align: center;
    cursor: pointer;
  }
  .disable{
    background: #cccccc;
  }
}
.have_info {
@@ -600,4 +676,29 @@
    }
  }
}
.detail_modal {
  padding: 20px 15px;
  .title {
    text-align: center;
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 20px;
  }
  .h1 {
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 16px;
  }
  .line {
    display: flex;
    margin-bottom: 10px;
    .label {
      width: 120px;
      color: #888888;
    }
    .value {
      color: #333333;
    }
  }
}
</style>
admin/src/views/business/approvalConfiguration.vue
@@ -120,7 +120,7 @@
              <div class="config_data_item_reviewed_r">
                <span>被访人的</span>
                <el-select
                  v-model="apprList[activeIndex].level"
                  v-model="apprList[activeIndex].objLevel"
                  placeholder="请选择"
                  style="margin: 0 20px 0 10px"
                >
admin/src/views/business/reportRecord.vue
@@ -6,7 +6,7 @@
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <div style="margin: 16px 0 0" v-permissions="['business:visits:create', 'business:visits:exportExcel']">
    <div class="query_btns" style="margin: 16px 0 0" v-permissions="['business:visits:create', 'business:visits:exportExcel']">
      <el-button type="primary" @click="handleEdit()" icon="el-icon-plus" v-permissions="['business:visits:create']">新建</el-button>
      <el-button type="primary" :loading="exLoading" @click="exportExcel" v-permissions="['business:visits:exportExcel']">导出</el-button>
    </div>
@@ -17,6 +17,7 @@
      row-key="id"
      default-expand-all
    >
      <el-table-column type="selection" width="55" align="center"></el-table-column>
      <el-table-column
        prop="carNos"
        label="入园车辆"
@@ -42,7 +43,7 @@
        label="被访人"
        min-width="100px"
      ></el-table-column>
      <el-table-column label="拜访时间" min-width="170px">
      <el-table-column label="拜访时间" min-width="160px">
        <template slot-scope="{ row }">
          <span>起:{{ row.starttime }}</span
          ><br />
@@ -52,13 +53,13 @@
      <el-table-column
        prop="reason"
        label="拜访事由"
        min-width="100px"
        min-width="100"
      ></el-table-column>
      <el-table-column
        prop="status"
        fixed="right"
        label="状态"
        min-width="100px"
        min-width="100"
      >
        <template slot-scope="{ row }">
          <span style="color: rgba(245, 154, 35, 0.996)" v-if="row.status === 0"
@@ -79,7 +80,7 @@
          <span v-if="row.status === 9" style="color: gray">已失效</span>
        </template>
      </el-table-column>
      <el-table-column label="操作" width="230" fixed="right">
      <el-table-column label="操作" width="100" fixed="right">
        <template slot-scope="{ row }">
          <el-button
            type="text"
admin/src/views/business/visits.vue
@@ -8,8 +8,8 @@
            <el-form-item label="身份证号" prop="idcardNo">
                <el-input v-model="searchForm.idcardNo" placeholder="请输入身份证号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="组织名称" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入组织名称" @keypress.enter.native="search"></el-input>
            <el-form-item label="访客单位" prop="companyName">
                <el-input v-model="searchForm.companyName" placeholder="请输入访客单位" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="审批状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择">
@@ -46,7 +46,7 @@
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="name" label="访客姓名" min-width="100px"></el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="组织名称" min-width="100px"></el-table-column>
                <el-table-column prop="companyName" label="访客单位" min-width="100px"></el-table-column>
                <el-table-column prop="receptMemberName" label="被访人" min-width="100px"></el-table-column>
                <el-table-column prop="reason" label="拜访事由" min-width="100px"></el-table-column>
                <el-table-column label="预约时间" min-width="170px">
@@ -64,14 +64,15 @@
                        <span v-else>-</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访人员" min-width="100px">
                <el-table-column label="施工人员" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.memberNum || '-'}}</span>
                        <span v-if="row.type == 0">否</span>
                        <span v-if="row.type == 1">是</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访车辆" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.carNum}}</span>
                        <span>{{row.carNos}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="status" fixed="right" label="状态" min-width="100px">
@@ -97,7 +98,8 @@
                    <template slot-scope="{row}">
                      <el-button type="text" @click="departure(row.id)" v-permissions="['business:visits:level']" icon="el-icon-delete" style="color: red" v-if="row.status == 7">离厂</el-button>
                      <el-button type="text" @click="cancel(row.id)" v-permissions="['business:visits:cancel']" icon="el-icon-delete"   style="color: red" v-if="row.status == 5">取消预约</el-button>
                        <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('详情', row.id)" icon="el-icon-view">详情</el-button>
                        <!-- <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('详情', row.id)" icon="el-icon-view">详情</el-button> -->
                        <el-button type="text" @click="handleDetail(row)" icon="el-icon-view">详情</el-button>
<!--                        <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">查询审批结果</el-button>-->
                    </template>
                </el-table-column>
@@ -109,7 +111,8 @@
            >
            </pagination>
            <!--      详情      -->
            <OperaVisitsDesWindow ref="OperaVisitsDesWindow" />
            <!-- <OperaVisitsDesWindow ref="OperaVisitsDesWindow" /> -->
            <TaskDetail v-if="isShowDetail" ref="DetailRef" />
            <!-- 新建 -->
            <OperaVisitsWindow @close="isShowEdit = false" @success="search"  v-if="isShowEdit" ref="operaVisitsWindowRef" />
        </template>
@@ -122,20 +125,23 @@
import Pagination from '@/components/common/Pagination'
import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
import OperaVisitsWindow from '@/components/business/operaVisitsWindow'
import TaskDetail from '@/views/task/visSubDetail.vue'
export default {
  name: 'Visits',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaVisitsDesWindow, OperaVisitsWindow },
  components: { TableLayout, Pagination, TaskDetail, OperaVisitsWindow },
  data () {
    return {
      isShowEdit: false,
      isShowDetail: false,
      // 搜索
      searchForm: {
        name: '',
        companyName: '',
        idcardNo: '',
        status: ''
        status: '',
        type: 0
      }
    }
  },
@@ -149,6 +155,16 @@
    this.search()
  },
  methods: {
    handleDetail (row) {
      this.isShowDetail = true
      console.log('row', row);
      this.$nextTick(() => {
        this.$refs.DetailRef.id = row.id
        this.$refs.DetailRef.type = 0
        this.$refs.DetailRef.getDetail()
        this.$refs.DetailRef.isShowModal = true
      })
    },
    handleEdit () {
      this.isShowEdit = true
      this.$nextTick(() => {
admin/src/views/login.vue
@@ -66,7 +66,7 @@
        })
        .catch(e => {
          this.refreshCaptcha()
          this.$tip.apiFailed(e)
          // this.$tip.apiFailed(e)
        })
        .finally(() => {
          this.loading = false
admin/src/views/meeting/bookings.vue
@@ -1,7 +1,13 @@
<template>
  <TableLayout :permissions="['business:bookings:query']">
    <!-- 搜索表单 -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
    <el-form
      ref="searchForm"
      slot="search-form"
      :model="searchForm"
      label-width="100px"
      inline
    >
      <el-form-item label="会议室" prop="roomId">
        <el-select
          v-model="searchForm.roomId"
@@ -9,7 +15,12 @@
          clearable
          placeholder="请选择会议室"
        >
          <el-option v-for="item in rooms" :key="item.id" :value="item.id" :label="item.name" />
          <el-option
            v-for="item in rooms"
            :key="item.id"
            :value="item.id"
            :label="item.name"
          />
        </el-select>
      </el-form-item>
      <el-form-item label="预约部门" prop="department">
@@ -31,10 +42,18 @@
        </el-select> -->
      </el-form-item>
      <el-form-item label="会议主题" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入会议主题" @keypress.enter.native="search"></el-input>
        <el-input
          v-model="searchForm.name"
          placeholder="请输入会议主题"
          @keypress.enter.native="search"
        ></el-input>
      </el-form-item>
      <el-form-item label="预约人" prop="realName">
        <el-input v-model="searchForm.realName" placeholder="请输入预约人" @keypress.enter.native="search"></el-input>
        <el-input
          v-model="searchForm.realName"
          placeholder="请输入预约人"
          @keypress.enter.native="search"
        ></el-input>
      </el-form-item>
      <el-form-item label="会议状态" prop="status">
        <el-select
@@ -43,7 +62,12 @@
          clearable
          placeholder="请选择状态"
        >
          <el-option v-for="item in status" :key="item.id" :value="item.id" :label="item.name" />
          <el-option
            v-for="item in status"
            :key="item.id"
            :value="item.id"
            :label="item.name"
          />
        </el-select>
      </el-form-item>
      <el-form-item label="起止时间" prop="startTime">
@@ -78,10 +102,30 @@
    </el-form>
    <!-- 表格和分页 -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:bookings:create', 'business:bookings:exportExcel']">
        <li><el-button type="primary" @click="$refs.operaBookingsWindow.open('新建会议')" v-permissions="['business:bookings:create']">新建</el-button></li>
      <ul
        class="toolbar"
        v-permissions="[
          'business:bookings:create',
          'business:bookings:exportExcel',
        ]"
      >
        <li>
          <el-button
            type="primary"
            @click="$refs.operaBookingsWindow.open('新建会议')"
            v-permissions="['business:bookings:create']"
            >新建</el-button
          >
        </li>
        <!-- <li><el-button @click="deleteByIdInBatch" v-permissions="['business:bookings:delete']">删除</el-button></li> -->
        <li><el-button :loading="isWorking.export" v-permissions="['business:bookings:exportExcel']" @click="exportExcel">导出</el-button></li>
        <li>
          <el-button
            :loading="isWorking.export"
            v-permissions="['business:bookings:exportExcel']"
            @click="exportExcel"
            >导出</el-button
          >
        </li>
      </ul>
      <el-table
        v-loading="isWorking.search"
@@ -91,42 +135,80 @@
        @selection-change="handleSelectionChange"
      >
        <!-- <el-table-column type="selection" align="center" width="55"></el-table-column> -->
        <el-table-column prop="name" label="会议主题" align="center" min-width="120px" show-overflow-tooltip>
          <template slot-scope="{row}">
        <el-table-column
          prop="name"
          label="会议主题"
          align="center"
          min-width="120px"
          show-overflow-tooltip
        >
          <template slot-scope="{ row }">
            <span class="long-title-style">{{ row.name }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="roomName" label="会议室" align="center" min-width="120px" show-overflow-tooltip>
          <template slot-scope="{row}">
        <el-table-column
          prop="roomName"
          label="会议室"
          align="center"
          min-width="120px"
          show-overflow-tooltip
        >
          <template slot-scope="{ row }">
            <span class="long-title-style">{{ row.roomName }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="meetingTime" label="会议时间" align="center" min-width="120px"></el-table-column>
        <el-table-column prop="managerInfo" label="预约人" align="center" min-width="100px"></el-table-column>
        <el-table-column label="状态"  align="center" min-width="60px">
          <template slot-scope="{row}">
            <span v-if="row.status==0" style="color:rgb(127, 178, 53)">正常</span>
            <span v-else style="color:rgb(234, 54, 38)">取消</span>
        <el-table-column
          prop="meetingTime"
          label="会议时间"
          align="center"
          min-width="120px"
        ></el-table-column>
        <el-table-column
          prop="managerInfo"
          label="预约人"
          align="center"
          min-width="100px"
        ></el-table-column>
        <el-table-column label="状态" align="center" min-width="60px">
          <template slot-scope="{ row }">
            <span v-if="row.status == 0" style="color: rgb(127, 178, 53)"
              >正常</span
            >
            <span v-else style="color: rgb(234, 54, 38)">取消</span>
            <!-- {{ row.status==0 ? '正常' : '取消' }} -->
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="创建时间" align="center" min-width="100px"></el-table-column>
        <el-table-column
          prop="createDate"
          label="创建时间"
          align="center"
          min-width="100px"
        ></el-table-column>
        <!-- <el-table-column prop="content" label="会议内容" min-width="100px"></el-table-column> -->
        <el-table-column
          v-if="containPermissions(['business:bookings:update', 'business:bookings:delete'])"
          v-if="
            containPermissions([
              'business:bookings:update',
              'business:bookings:delete',
            ])
          "
          label="操作"
          min-width="120"
          min-width="100"
          align="center"
          fixed="right"
        >
          <template slot-scope="{row}">
            <template v-if="row.status==0">
              <el-button type="text" @click="$refs.operaBookingsDetailWindow.open('会议详情', row)">查看</el-button>
              <el-button v-if="row.flag == 0" type="text" @click="$refs.operaBookingsWindow.open('编辑会议预约', row)" v-permissions="['business:bookings:update']">修改</el-button>
              <el-button type="text" @click="copy(row)">复制</el-button>
              <el-button v-if="row.flag == 0"  type="text" @click="cancelMeeting(row.id)" v-permissions="['business:bookings:update']">取消</el-button>
          <template slot-scope="{ row }">
            <template>
              <el-button
                type="text"
                @click="$refs.operaBookingsDetailWindow.open('会议详情', row)"
                >查看详情</el-button
              >
              <!-- <el-button v-if="row.flag == 0" type="text" @click="$refs.operaBookingsWindow.open('编辑会议预约', row)" v-permissions="['business:bookings:update']">修改</el-button> -->
              <!-- <el-button type="text" @click="copy(row)">复制</el-button> -->
              <!-- <el-button v-if="row.flag == 0"  type="text" @click="cancelMeeting(row.id)" v-permissions="['business:bookings:update']">取消</el-button> -->
            </template>
            <el-button v-else type="text" @click="deleteById(row)" v-permissions="['business:bookings:delete']">删除</el-button>
            <!-- <el-button v-else type="text" @click="deleteById(row)" v-permissions="['business:bookings:delete']">删除</el-button> -->
          </template>
        </el-table-column>
      </el-table>
@@ -138,8 +220,15 @@
      </pagination>
    </template>
    <!-- 新建/修改 -->
    <OperaBookingsWindow ref="operaBookingsWindow" @success="handlePageChange"/>
    <OperaBookingsDetailWindow ref="operaBookingsDetailWindow"/>
    <OperaBookingsWindow
      ref="operaBookingsWindow"
      @success="handlePageChange"
    />
    <OperaBookingsDetailWindow
      @success="search"
      ref="operaBookingsDetailWindow"
    />
  </TableLayout>
</template>
@@ -158,7 +247,7 @@
  name: 'Bookings',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaBookingsWindow, OperaBookingsDetailWindow },
  data () {
  data() {
    return {
      date: [],
      // 搜索
@@ -198,12 +287,12 @@
      link: 'https://dmtest.ahapp.net/meeting_h5/' // H5_LINK_ADDR
    }
  },
  provide () {
  provide() {
    return {
      rooms: () => this.rooms
    }
  },
  created () {
  created() {
    this.config({
      module: '会议室预定信息表',
      api: '/meeting/bookings',
@@ -226,7 +315,7 @@
    this.changeRadio('0')
  },
  methods: {
    changeRadio (e) {
    changeRadio(e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
@@ -242,7 +331,7 @@
      }
      this.search()
    },
    newTree (tree) {
    newTree(tree) {
      if (tree == null) {
        return []
      }
@@ -259,12 +348,12 @@
        return newItem
      })
    },
    selectDate (v) {
    selectDate(v) {
      this.searchForm.endTime = v[1] + ' 23:59:59'
      this.searchForm.startTime = v[0] + ' 00:00:00'
      this.searchForm.radio = null
    },
    reset () {
    reset() {
      this.$refs.searchForm.resetFields()
      this.date = []
      this.searchForm.radio = '0'
@@ -272,17 +361,16 @@
      this.searchForm.endTime = ''
      this.changeRadio('0')
    },
    copy (row) {
    copy(row) {
      const text = `${row.realName} 邀请您加入会议\n会议主题:${row.name}\n会议室:${row.roomName}\n会议时间:${row.meetingTime}\n点击链接直接加入会议:\n${this.link}?id=${row.id}`
      this.$copyText(text)
        .then(() => {
          this.$message.success('会议信息复制成功,去分享给同事吧~')
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    cancelMeeting (id) {
    cancelMeeting(id) {
      this.$dialog.messageWaring('取消会议', '是否取消当前会议?')
        .then(() => {
          cancelById({ id })
@@ -291,29 +379,26 @@
              this.handlePageChange()
            })
            .catch(e => {
              this.$message.error(e)
            })
        })
    },
    showDetail (id) {
    showDetail(id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsDetailWindow.open('会议详情', res)
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    editBookings (id) {
    editBookings(id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsWindow.open('编辑会议预约', res)
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    handlePageChange (pageIndex) {
    handlePageChange(pageIndex) {
      this.__checkApi()
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
@@ -341,3 +426,31 @@
  }
}
</script>
<style lang="scss" scoped>
.detail_modal {
  padding: 20px 16px;
  .title {
    text-align: center;
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 20px;
  }
  .h1 {
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 15px;
  }
  .line {
    display: flex;
    margin-bottom: 10px;
    .label {
      width: 70px;
      color: #888888;
    }
    .value {
      color: #333333;
    }
  }
}
</style>
admin/src/views/meeting/components/OperaBookingsDetailWindow.vue
@@ -13,15 +13,19 @@
    <div class="content-style">
      <div class="item">
        <div class="item-title">参会人员</div>
        <div>{{ form.sysList.map(item => `${item.realName}`).join(',') }}</div>
        <div>
          {{ form.sysList.map((item) => `${item.realName}`).join(",") }}
        </div>
      </div>
      <div class="item">
        <div class="item-title">会议内容</div>
        <div class="item-value">{{ form.content || '无' }}</div>
        <div class="item-value">{{ form.content || "无" }}</div>
      </div>
      <div v-if="form.projectList.length" class="item">
        <div class="">服务项</div>
        <div class="item-value">{{ form.projectList.map(item => item.projectName).join(' | ') }}</div>
        <div class="item-value">
          {{ form.projectList.map((item) => item.projectName).join(" | ") }}
        </div>
      </div>
      <div class="item" v-if="form.fileList.length">
        <div class="item-title">附件</div>
@@ -43,8 +47,33 @@
      <div class="item-value">{{ form.managerInfo }}</div>
    </div>
    <div slot="footer">
      <el-button @click="visible=false">取消</el-button>
      <el-button type="primary" v-if="form.meetingStatus == 1" @click="openCancel('0')">撤销</el-button>
      <el-button v-if="form.meetingStatus == 2" type="primary" @click="openCancel('1')">结束</el-button>
      <el-button @click="visible = false">取消</el-button>
    </div>
    <!-- 取消/结束 -->
    <el-dialog
      :title="cancelParam.falg == '1' ? '结束会议' : '撤销会议'"
      :visible.sync="isShowCancel"
      append-to-body
      width="500px"
    >
      <el-form style="padding: 30px">
        <el-form-item label="撤回说明">
          <el-input
            type="textarea"
            :rows="4"
            placeholder="请输入说明。"
            v-model="cancelParam.businessRemark"
          >
          </el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowCancel = false">取消</el-button>
        <el-button type="primary" @click="onSubCancel()">确定</el-button>
      </span>
    </el-dialog>
  </GlobalAlertWindow>
</template>
@@ -52,6 +81,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import FileLink from '@/views/meeting/components/common/FileLink'
import { cancelById, overBookById } from '@/api/meeting/bookings'
export default {
  name: 'OperaBookingsDetailWindow',
  extends: BaseOpera,
@@ -69,6 +99,7 @@
        projectList: [],
        remark: '',
        roomId: '',
        meetingStatus: '',
        startTime: '',
        endTime: '',
        times: [],
@@ -81,6 +112,11 @@
      sysList: [],
      projectList: [],
      timelist: [],
      isShowCancel: false,
      cancelParam: {
        flag: '0'
      },
      // 验证规则
      rules: {
@@ -92,9 +128,22 @@
      api: '/meeting/bookings',
      'field.id': 'id'
    })
  },
  methods: {
    openCancel (flag) {
      this.isShowCancel = true
      this.cancelParam.flag = flag
    },
    onSubCancel () {
      const { id } = this.form
      const fn = this.cancelParam.flag === '0' ? cancelById : overBookById
      fn({ id, businessRemark: this.cancelParam.businessRemark }).then(res => {
        this.$tip.success('提交成功')
        this.visible = false
        this.isShowCancel = false
        this.$emit('success')
      })
    }
    /**
     * 打开窗口
     * @title 窗口标题
@@ -124,7 +173,7 @@
    //   })
    // },
  },
  }
}
</script>
@@ -160,5 +209,4 @@
.bottom-style {
  padding: 20px;
}
</style>
admin/src/views/meeting/components/OperaBookingsWindow.vue
@@ -31,7 +31,11 @@
            class="time-item"
            v-for="(item, index) in timelist"
            :key="item.id"
            :class="form.times.indexOf(index)!=-1?'time-item-sel': item.isUse ? 'time-item-disable' : ''"
            :class="{
              'time-item-sel': form.times.indexOf(index)!=-1,
              'time-item-disable': item.isUse,
              'disable': item.bookingTimeId
            }"
            @click="selectTimes(index, item)"
          >{{ `${item.startTime}-${item.endTime}` }}</div>
        </div>
@@ -40,7 +44,7 @@
        <el-input v-model="form.name" placeholder="请输入会议主题" :maxlength="30" v-trim/>
      </el-form-item>
      <el-form-item label="参会人员" prop="sysList">
      <el-form-item label="参会人员">
        <!-- <el-input style="width:40%" disabled v-model="sysList" placeholder="选择参会人员" v-trim/> -->
        <el-select
          v-model="form.sysList"
@@ -94,6 +98,32 @@
      </el-form-item>
      <input type="file" @change="upFiles" ref="upFile" style="display: none;" />
    </el-form>
    <el-dialog
      title="会议室预约情况"
      :visible.sync="isShowDetail"
      append-to-body
      width="600px"
    >
      <div class="detail_modal">
        <div class="h1">{{ activeInfo.meetingName }}</div>
        <div class="line">
          <div class="label">会议时间</div>
          <div class="value" v-if="activeInfo.meetingDate">
            {{ activeInfo.meetingDate.slice(5) }} {{ activeInfo.meetingTime }}
          </div>
        </div>
        <div class="line">
          <div class="label">会议室</div>
          <div class="value">{{ activeInfo.roomName }}</div>
        </div>
        <div class="line">
          <div class="label">预约人</div>
          <div class="value">{{ activeInfo.bookingUserName }}</div>
        </div>
        <el-button @click="isShowDetail = false">关闭</el-button>
      </div>
    </el-dialog>
  </GlobalAlertWindow>
</template>
@@ -101,9 +131,10 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
import FileLink from '@/views/meeting/components/common/FileLink'
import { upload as upload } from '@/api/system/common'
import { upload } from '@/api/system/common'
import { fetchList as userList } from '@/api/system/user'
import { findListByObjId } from '@/api/meeting/projects'
import { BookDetailById } from '@/api/meeting/bookings'
import { findList } from '@/api/meeting/roomTime'
import { numRule, arrayRule } from '@/utils/form'
export default {
@@ -126,8 +157,10 @@
        times: [],
        content: '',
        sysList: [],
        fileList: [],
        fileList: []
      },
      activeInfo: {},
      isShowDetail: false,
      isEdit: false,
      // room: [],
      sysList: [],
@@ -136,20 +169,20 @@
      // 验证规则
      rules: {
        roomId: [
         { required: true, validator: numRule, message: '请选择关联会议室', tigger: 'change' }
          { required: true, validator: numRule, message: '请选择关联会议室', tigger: 'change' }
        ],
        date: [
         { required: true, message: '请选择预定日期', tigger: 'change' }
          { required: true, message: '请选择预定日期', tigger: 'change' }
        ],
        times: [
         { required: true, validator: arrayRule, message: '请选择预约时间', tigger: 'change' }
          { required: true, validator: arrayRule, message: '请选择预约时间', tigger: 'change' }
        ],
        sysList: [
         { required: true, validator: arrayRule, message: '请选择参会人员', tigger: 'change' }
          { required: true, validator: arrayRule, message: '请选择参会人员', tigger: 'change' }
        ],
        name: [
         { required: true, message: '请选择输入会议主题', tigger: 'blur' }
        ],
          { required: true, message: '请选择输入会议主题', tigger: 'blur' }
        ]
        // content: [
        //  { required: true, message: '请输入会议内容', tigger: 'blur' }
        // ],
@@ -165,10 +198,10 @@
    userList({
      page: 1,
      capacity: 9999,
      model: { realname: this.filterText },
      model: { realname: this.filterText }
    })
      .then(res => {
        console.log('userList', res);
        console.log('userList', res)
        this.sysList = res.records
      })
  },
@@ -178,7 +211,7 @@
     * @title 窗口标题
     * @target 编辑的对象
     */
     open (title, target) {
    open (title, target) {
      this.title = title
      this.visible = true
      this.timelist = []
@@ -187,8 +220,6 @@
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          console.log(this.form.content);
          debugger
          this.form[this.configData['field.id']] = null
        })
        return
@@ -208,7 +239,7 @@
        this.selectRoom(this.form.roomId)
      })
    },
    selectRoom(objId) {
    selectRoom (objId) {
      this.getTimes()
      findListByObjId({
        objId: objId,
@@ -218,11 +249,11 @@
          this.projectList = res
        })
    },
    selectDate(v) {
    selectDate (v) {
      // console.log(v);
      this.getTimes()
    },
    getTimes(isInit=false) {
    getTimes (isInit = false) {
      this.form.times = []
      this.timelist = []
@@ -259,33 +290,45 @@
          })
      }
    },
    selectTimes(index, item) {
    getDetail (id) {
      BookDetailById({
        id
      }).then(res => {
        this.activeInfo = res
        this.isShowDetail = true
      })
    },
    selectTimes (index, item) {
      if (item.bookingTimeId) {
        this.getDetail(item.bookingTimeId)
        return
      }
      if (this.isEdit) {
        return
      }
      let tempIndex = this.form.times.indexOf(index)
      const tempIndex = this.form.times.indexOf(index)
      if (tempIndex != -1) {
        if (tempIndex==0) {
        if (tempIndex == 0) {
          // console.log(this.form.times);
          // debugger
          this.form.times.splice(0, 1)
        } else if (tempIndex==this.form.times.length-1) {
        } else if (tempIndex == this.form.times.length - 1) {
          this.form.times.splice(tempIndex, 1)
        }
      } else {
        if (item.isUse) {
          return
        }
        if (this.form.times.length && index+1 !== this.form.times[0] && index-1 !== this.form.times[this.form.times.length-1]) {
        if (this.form.times.length && index + 1 !== this.form.times[0] && index - 1 !== this.form.times[this.form.times.length - 1]) {
          this.$message.error('预约时间必须是相邻的!')
          return
        }
        this.form.times.push(index)
        this.form.times.sort((x,y)=> x - y)
        this.form.times.sort((x, y) => x - y)
      }
      // console.log(this.form.times);
    },
    upFiles(file) {
    upFiles (file) {
      const formdate = new FormData()
      this.isUploading = true
      formdate.append('file', file.target.files[0])
@@ -318,21 +361,21 @@
        this.isWorking = true
        let sysList = [...this.form.sysList]
        sysList = sysList.map(item => {
          return {userId: item}
          return { userId: item }
        })
        let projectList = [...this.form.projectList]
        projectList = projectList.map(item => {
          return {projectId: item}
          return { projectId: item }
        })
        let bookingTimeList = []
        const bookingTimeList = []
        this.form.times.forEach(item => {
          bookingTimeList.push({
            timeId: this.timelist[item].id,
            id: this.timelist[item].bookingTimeId
          })
        })
        let startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00'
        let endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length-1]].endTime + ':00'
        const startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00'
        const endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length - 1]].endTime + ':00'
        this.api.create({
          ...this.form,
          sysList,
@@ -364,21 +407,21 @@
        this.isWorking = true
        let sysList = [...this.form.sysList]
        sysList = sysList.map(item => {
          return {userId: item}
          return { userId: item }
        })
        let projectList = [...this.form.projectList]
        projectList = projectList.map(item => {
          return {projectId: item}
          return { projectId: item }
        })
        let bookingTimeList = []
        const bookingTimeList = []
        this.form.times.forEach(item => {
          bookingTimeList.push({
            timeId: this.timelist[item].id,
            id: this.timelist[item].bookingTimeId
          })
        })
        let startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00'
        let endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length-1]].endTime + ':00'
        const startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00'
        const endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length - 1]].endTime + ':00'
        this.api.updateById({
          ...this.form,
          sysList,
@@ -400,7 +443,7 @@
          })
      })
    }
  },
  }
}
</script>
@@ -433,10 +476,40 @@
    color: #fff;
  }
  .time-item-disable {
    color: #e4e4e4;
    border-color: #999;
    background-color: #999;
  }
  .disable{
    border-color: #999;
    background-color: #999;
    color: #111;
  }
}
.detail_modal {
  padding: 20px 16px;
  .title {
    text-align: center;
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 20px;
  }
  .h1 {
    font-weight: 600;
    font-size: 16px;
    margin-bottom: 15px;
  }
  .line {
    display: flex;
    margin-bottom: 10px;
    .label {
      width: 70px;
      color: #888888;
    }
    .value {
      color: #333333;
    }
  }
}
</style>
admin/src/views/meeting/devices.vue
@@ -144,7 +144,6 @@
          this.$message.success('修改成功')
        })
        .catch(e => {
          this.$message.error(e)
        })
        .finally(() => {
          this.handlePageChange()
admin/src/views/meeting/rooms.vue
@@ -152,7 +152,7 @@
      }
    }
  },
  provide() {
  provide () {
    return {
      userList: () => this.userList
    }
@@ -167,7 +167,7 @@
    userList({
      page: 1,
      capacity: 9999,
      model: { realname: this.filterText },
      model: { realname: this.filterText }
    })
      .then(res => {
        this.userList = res.records
@@ -175,16 +175,16 @@
    this.search()
  },
  methods: {
     // 页码变更处理
    // 页码变更处理
    handlePageChange (pageIndex) {
      this.__checkApi()
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
      let sysList = [...this.searchForm.sysList]
      sysList = sysList.map(item => {
        return {userId: item}
        return { userId: item }
      })
      console.log(sysList);
      console.log(sysList)
      this.api.fetchList({
        page: this.tableData.pagination.pageIndex,
        capacity: this.tableData.pagination.pageSize,
@@ -209,23 +209,21 @@
    //   console.log('21212');
    //   this.$refs.selectMember.open('选择管理员')
    // },
    changeStatus(item) {
    changeStatus (item) {
      updateStatusById({
        id: item.id,
        status: item.status
      })
        .then(() => {
          this.$message.success('修改成功')
        })
        .catch(e => {
          this.$message.error(e)
        })
        .finally(() => {
          this.handlePageChange()
        })
    }
  },
  }
}
</script>
admin/src/views/operation/serviceCar/apprConfig.vue
@@ -164,8 +164,8 @@
            <div>允许修改"驾驶员"</div>
            <el-switch
              class="ml10"
              active-value="0"
              inactive-value="1"
              :active-value="1"
              :inactive-value="0"
              v-model="apprList[activeIndex].driverParam"
            ></el-switch>
          </div>
admin/src/views/operation/serviceCar/apprRecord.vue
@@ -17,7 +17,7 @@
          <el-option label="审核中" value="1"></el-option>
          <el-option label="审批通过" value="2"></el-option>
          <el-option label="审批不通过" value="3"></el-option>
          <el-option label="已取消" value="4"></el-option>
          <el-option label="已撤销" value="4"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="目的地类型" prop="type">
@@ -83,10 +83,10 @@
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <span class="status-blue"  v-if="row.status === 0">申请中</span>
            <span class="status-blue"  v-if="row.status === 1">待审批</span>
            <span class="status-blue"  v-if="row.status === 1">审核中</span>
            <span class="status-green" v-if="row.status === 2">审批通过</span>
            <span class="status-red"   v-if="row.status === 3">审批不通过</span>
            <span class="status-red"   v-if="row.status === 4">已取消</span>
            <span class="status-red"   v-if="row.status === 4">已撤销</span>
          </template>
        </el-table-column>
@@ -94,12 +94,13 @@
        <el-table-column prop="editDate" label="操作时间" min-width="150px"></el-table-column>
        <el-table-column
            label="操作"
            min-width="100"
            min-width="140"
            align="center"
            fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaDetailsWindow.open('公务车申请详情',row)" >查看详情</el-button>
            <el-button v-if="(row.status === 1 || row.status === 2) && new Date().getTime() < new Date(row.startTime).getTime()" type="text" icon="el-icon-delete" @click="rowRevokeClick(row)" >撤销</el-button>
          </template>
        </el-table-column>
      </el-table>
@@ -123,7 +124,7 @@
import OperaCarUseBookParamWindow from '@/components/operation/OperCarUseBookParamWindow.vue'
import { timeForMat } from '@/utils/util'
import { allList } from '@/api/business/hiddenDangerParam'
import { carUseBookRecordEx } from '@/api/business/carUseBook'
import { carUseBookRecordEx, revokeById } from '@/api/business/carUseBook'
export default {
  name: 'Empower',
  extends: BaseTable,
@@ -157,6 +158,9 @@
    this.loadParams()
  },
  methods: {
    rowRevokeClick (row) {
      revokeById(row.id)
    },
    handleEx () {
      this.$dialog.exportConfirm('确认导出吗?')
        .then(() => {
admin/src/views/task/index.vue
@@ -121,7 +121,8 @@
import dayjs from 'dayjs'
import {
  taskCenterHeadPC,
  taskCenterPage
  taskCenterPage,
  taskSignRead
} from '@/api'
export default {
  components: {
@@ -201,6 +202,14 @@
      this.getList()
    },
    handleDetail (row) {
      if (this.filters.queryType == 3) {
        taskSignRead({
          noticesId: row.id,
          signType: 0
        }).then(res => {
          this.getHeadData()
        })
      }
      if (row.objType === 2) {
        this.$refs.OperaDetailsWindow.open('公务车申请详情', row)
        return
@@ -260,7 +269,7 @@
      })
    },
    getHeadData () {
      const {filters} = this
      const { filters } = this
      if (filters.selTime && filters.selTime.length > 0) {
        filters.startDate = filters.selTime[0]
        filters.endDate = filters.selTime[1]
admin/src/views/task/visSubDetail.vue
@@ -5,7 +5,7 @@
        <div class="header">
          <div class="left">
            <div class="h1">{{ cateList[type] }}</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
            <div class="time">提交时间:{{ info.createTime }}</div>
          </div>
          <div class="right">{{ statusMap[info.status] }}</div>
        </div>
@@ -68,7 +68,13 @@
              label="证件类型"
              prop="idcardTypeName"
              min-width="80"
            />
            >
              <template slot-scope="{ row }">
                <span v-if="row.idcardType == 0">身份证</span>
                <span v-if="row.idcardType == 1">港澳证件</span>
                <span v-if="row.idcardType == 2">护照</span>
              </template>
            </el-table-column>
            <el-table-column
              label="证件号码"
              prop="idCardDecode"
@@ -81,7 +87,7 @@
            />
            <el-table-column label="人脸照片" prop="" min-width="80">
              <template slot-scope="{ row }">
                <el-image :src="row.prefix" :preview-src-list="[row.prefix]">
                <el-image :src="row.prefix + row.faceImg" :preview-src-list="[row.prefix + row.faceImg]">
                </el-image>
              </template>
            </el-table-column>
h5/App.vue
@@ -6,6 +6,7 @@
    if (!that.$store.state.openid) {
      let url = window.location.href
      let code = ''
      let source = ''
      if (url.indexOf('code=') !== -1) {
        const query = url.split('?')
        console.log('app-app', url)
@@ -13,9 +14,13 @@
          if (q.indexOf('code=') !== -1) {
            code = q.substring(q.indexOf('code=') + 5, q.length)
          }
          if (q.indexOf('source=') !== -1) {
            source = q.substring(q.indexOf('source=') + 7,q.indexOf('source=') + 8 )
          }
        }
        wxAuthorize({
          code: code
          code: code,
          source
        }).then(res => {
          console.log('app_ress', res)
          if (res.code === 200) {
h5/api/meeting.js
@@ -83,7 +83,15 @@
export const cancelById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/business/meeting/reservationCancel',
    method: 'get',
    method: 'post',
    data
  })
}
// 会议室 结束
export const closeMeetignById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/business/meeting/reservationOver',
    method: 'post',
    data
  })
}
h5/api/staff.js
@@ -205,4 +205,12 @@
    method: 'post',
    data
  })
}
}
//  任务中心 标记已读
export const signReadTask = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/staging/signRead',
    method: 'get',
    data
  })
}
h5/components/Li-Calendar/Li-Calendar.vue
@@ -858,8 +858,8 @@
  /* color: #000; */
}
.calendar-today {
  /* border-radius: 6upx;
    background-color: $uni-color-primary; */
   border-radius: 6rpx;
    background-color: #e9f4f6;
  color: $uni-color-primary;
  /* -moz-box-shadow: 0px 2upx 10upx #ABABAB;
    -webkit-box-shadow: 0px 2upx 10upx #ABABAB;
h5/pages.json
@@ -28,8 +28,7 @@
            "path": "pages/staffLogin/login",
            "style": {
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
                "enablePullDownRefresh": false
            }
        },
        {
h5/pages/applicationRecord/applicationRecord.vue
@@ -36,7 +36,7 @@
        :key="index"
      >
        <view class="box_list_item_head">
          <text>{{ item.name }}的劳务入园申请</text>
          <text>{{ item.name }}提交的访客申请</text>
          <text class="loading">{{ statusMap[item.status] }}</text>
        </view>
        <view class="box_list_item_nr">
h5/pages/login/login.vue
@@ -11,7 +11,7 @@
      </view>
      <u-icon name="arrow-right" size="24" color="#979797" />
    </view>
    <view class="item" @click="jump('/pages/staffLogin/login')">
    <view class="item" @click="staffLogin">
      <image class="avatar" src="@/static/ic_staff@2x.png" />
      <view class="content">
        <view class="name">我是员工</view>
@@ -34,10 +34,22 @@
export default {
  methods: {
    jump(url) {
      console.log(url);
      console.log(url)
      uni.navigateTo({
        url
      })
    },
    staffLogin() {
      const userInfo = uni.getStorageSync('userInfo') || {}
      if (userInfo && userInfo.memberId) {
        uni.navigateTo({
          url: '/pages/staff/index'
        })
      }else{
        uni.navigateTo({
          url: '/pages/staffLogin/login'
        })
      }
    }
  }
}
@@ -66,7 +78,7 @@
    line-height: 66rpx;
    margin-bottom: 16rpx;
  }
  .place{
  .place {
    margin-bottom: 98rpx;
  }
  .item {
h5/pages/staff/index.vue
@@ -63,7 +63,7 @@
        <image class="img" src="@/static/staff/ic_renwuzhongxin.png"></image>
        <view class="h1">任务中心</view>
        <view class="h2">TASK CENTER</view>
        <view class="task_num">{{ taskNum }}</view>
        <view class="task_num">{{ taskInfo.noticeWaitNum + taskInfo.noticeCopyNum }}</view>
      </view>
      <view class="img_wrap" @click="jump('/pages/staff/meetingCalendar')">
        <image class="img" src="@/static/staff/ic_wodehuiyi.png"></image>
@@ -94,11 +94,10 @@
  data() {
    return {
      userInfo: uni.getStorageSync('userInfo'),
      taskNum: 0
      taskInfo: 0
    }
  },
  onLoad() {
    console.log('userInfo', this.userInfo)
  },
  onShow() {
    if (this.userInfo && this.userInfo.memberId) {
@@ -120,9 +119,9 @@
    },
    getTaskInfo() {
      stagingHead({
        isDetail: '0'
        isDetail: '1'
      }).then(res => {
        this.taskNum = res.data.taskNum
        this.taskInfo = res.data
      })
    },
  }
h5/pages/staff/meetingCalendar.vue
@@ -463,6 +463,10 @@
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            flex: 1;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
          }
          .status {
            height: 38rpx;
@@ -472,6 +476,10 @@
            border: 1rpx solid #999999;
            font-size: 22rpx;
            color: #999999;
            margin-left: 20rpx;
            display: flex;
            justify-content: center;
            align-items: center;
          }
          .padding {
            color: $uni-color-primary;
h5/pages/staff/meetingDetail.vue
@@ -10,7 +10,7 @@
    <!--  -->
    <view class="empty"></view>
    <view class="module_list">
      <view class="item">
      <view class="item" v-if="detail.meetingContent">
        <view class="label">会议内容</view>
        <view class="value">
          <!-- <text>主要讨论智能会议室系统选型,请大家一定要按时来开会,时间宝贵。感谢大家!</text> -->
@@ -24,7 +24,7 @@
          />
        </view>
      </view>
      <view class="item">
      <view class="item" v-if="detail.userResponseList && detail.userResponseList.length > 0">
        <view class="label">参会人员</view>
        <view class="value">
          <view class="personnel">
@@ -33,13 +33,19 @@
              v-for="mem in detail.userResponseList"
              :key="mem.id"
            >
              <image :src="mem.avatar ? mem.avatar : require('@/static/meeting/common/default_user@2x.png')" class="avatar" mode=""></image>
              <image
                v-if="mem.avatar"
                :src="mem.avatar"
                class="avatar"
                mode=""
              ></image>
              <view v-else class="avatar">{{ mem.realname.slice(0, 1) }}</view>
              <view class="name">{{ mem.realname }}</view>
            </view>
          </view>
        </view>
      </view>
      <view class="item">
      <view class="item" v-if="detail.projectsResponseList && detail.projectsResponseList.length > 0">
        <view class="label">服务项</view>
        <view class="value">
          <template v-for="(ser, serI) in detail.projectsResponseList">
@@ -54,13 +60,13 @@
          </template>
        </view>
      </view>
      <view class="item">
      <view class="item" v-if="detail.remark || detail.meetingRemark">
        <view class="label">备注</view>
        <view class="value">{{ detail.remark || detail.meetingRemark }}</view>
      </view>
      <view class="item">
        <view class="label">预约人</view>
        <view class="value"
        <view class="value" v-if="detail.bookingUser"
          >{{ detail.bookingUser.companyName || "" }}
          {{ detail.bookingUser.realname }}
          {{ detail.bookingUser.mobile }}</view
@@ -69,22 +75,72 @@
    </view>
    <view class="empty empty2"></view>
    <view class="main_footer" v-if="detail.meetingStatus == '1'">
      <view class="btn" @click="handleCancel(detail.id)">撤回</view>
      <view class="btn" @click="openCancel">撤回</view>
      <view class="btn agree" @click="handleEdit">修改</view>
    </view>
    <view class="main_footer" v-if="detail.meetingStatus == '2'">
      <view class="btn agree" @click="handleSub('2')">结束</view>
      <view class="btn agree" @click="openClose">结束</view>
    </view>
    <!-- 撤回 -->
    <u-popup
      catchtouchmove
      :show="isShowCancel"
      closeable
      :round="12"
      mode="bottom"
      @close="isShowCancel = false"
    >
      <view class="cancel_modal">
        <view class="title">撤销预约</view>
        <view class="line">
          <view class="label">撤回说明</view>
          <textarea
            class="textarea"
            placeholder="请输入"
            maxlength="300"
            v-model="cancelParam.businessRemark"
          />
        </view>
        <view class="sub_btn" @click="handleCancel('0')">提交</view>
      </view>
    </u-popup>
    <!-- 结束 -->
    <u-popup
      catchtouchmove
      closeable
      :show="isShowClose"
      :round="12"
      mode="bottom"
      @close="isShowClose = false"
    >
      <view class="cancel_modal">
        <view class="title">结束预约</view>
        <view class="line">
          <view class="label">结束说明</view>
          <textarea
            class="textarea"
            placeholder="请输入"
            maxlength="300"
            v-model="cancelParam.businessRemark"
          />
        </view>
        <view class="sub_btn" @click="handleCancel('1')">提交</view>
      </view>
    </u-popup>
  </view>
</template>
<script>
import { meetingDetail, cancelById } from '@/api'
import { meetingDetail, cancelById, closeMeetignById } from '@/api'
export default {
  data() {
    return {
      param: {},
      detail: {},
      cancelParam: {},
      isShowCancel: false,
      isShowClose: false,
      id: ''
    }
  },
@@ -99,30 +155,30 @@
        this.detail = res.data
      })
    },
    handleCancel(id) {
      uni.showModal({
        title: '提示',
        // confirmText: '确认',
        content: '确认撤回该会议吗',
        success: function (res) {
          if (res.confirm) {
            cancelById({ id }).then(res => {
              if (res.code === 200) {
                setTimeout(() => {
                  uni.showToast({
                    title: '撤回成功',
                    icon: 'success'
                  })
                })
                setTimeout(() => {
                  uni.navigateBack()
                })
              }
    openCancel() {
      this.isShowCancel = true
      this.cancelParam = {}
    },
    openClose() {
      this.isShowClose = true
      this.cancelParam = {}
    },
    handleCancel(str) {
      const { id } = this.detail
      let fn = str == '0' ? cancelById : closeMeetignById
      fn({ id, ...this.cancelParam }).then(res => {
        if (res.code === 200) {
          setTimeout(() => {
            uni.showToast({
              title: '提交成功',
              icon: 'success'
            })
          }
          })
          setTimeout(() => {
            uni.navigateBack()
          })
        }
      })
    },
    handleEdit() {
      const { id } = this
@@ -189,10 +245,12 @@
          flex-direction: column;
          justify-content: center;
          align-items: center;
          justify-content: center;
          margin-right: 24rpx;
          .avatar {
            width: 72rpx;
            height: 72rpx;
            margin: 0;
            border-radius: 50%;
          }
          .name {
@@ -241,4 +299,31 @@
.empty2 {
  height: 280rpx !important;
}
.cancel_modal {
  height: 440rpx;
  padding: 30rpx;
  .title {
    padding: 0 30rpx 50rpx;
    text-align: center;
  }
  .line {
    .label {
      margin-bottom: 10rpx;
    }
    textarea {
      height: 120rpx;
    }
  }
  .sub_btn {
    background-color: $uni-color-primary;
    display: flex;
    justify-content: center;
    align-items: center;
    color: #fff;
    border-radius: 44rpx;
    width: 690rpx;
    height: 88rpx;
    margin: 20rpx auto;
  }
}
</style>
h5/pages/staff/meetingManager.vue
@@ -179,7 +179,6 @@
    getRoomList() {
      roomsListPost({}).then(res => {
        this.meetingList = [[{ id: '', name: '全部会议室' }, ...res.data]]
        console.log('meetingList', this.meetingList)
      })
    },
    seletedStatus(e) {
@@ -355,9 +354,14 @@
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            flex: 1;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
          }
          .status {
            height: 38rpx;
            margin-left: 20rpx;
            line-height: 38rpx;
            padding: 0 16rpx;
            border-radius: 4rpx;
h5/pages/staff/meetingSel.vue
@@ -347,6 +347,8 @@
          color: #f62710;
          padding: 0rpx 6rpx;
          margin-left: 8rpx;
          display: flex;
          align-items: center;
        }
      }
    }
h5/pages/staff/meetingSub.vue
@@ -57,7 +57,7 @@
            <view class="">{{ item.name }}</view>
          </view>
        </view>
        <view class="sub" @click="onSubmit">确认预约</view>
        <view class="sub" :class="{disable: !selDatetime}" @click="onSubmit">确认预约</view>
      </view>
    </view>
    <!--  -->
@@ -134,7 +134,8 @@
      this.getRoomTime()
    },
    onSubmit() {
      const { activeRoom } = this
      const { activeRoom, selDatetime } = this
      if(!selDatetime) return
      const selTimeList = this.timeList.filter(i => i.checked == '1')
      if (selTimeList.length == -1) {
        return uni.showToast({
@@ -332,12 +333,14 @@
      font-size: 30rpx;
      color: #ffffff;
    }
    .disable {
      background-color: #cccccc;
    }
  }
}
.time_list {
  display: flex;
  justify-content: space-between;
  padding: 30rpx;
  padding: 30rpx 30rpx 240rpx;
  flex-wrap: wrap;
  .item {
    width: 220rpx;
@@ -348,6 +351,10 @@
    border-radius: 4rpx;
    margin-bottom: 24rpx;
    font-size: 30rpx;
    margin-right: 15rpx;
    &:nth-of-type(3n){
      margin-right: 0;
    }
  }
  .active {
    background-color: $uni-color-primary;
h5/pages/staff/meetingSubOrder.vue
@@ -60,7 +60,7 @@
      <view class="item">
        <view class="name">
          参会人员
           <text class="star">*</text>
           <text class="star"></text>
        </view>
        <view class="line" @click="selPeople">
          <view class="label">
@@ -215,6 +215,7 @@
      })
    },
    handleBack() {
      if(this.param.id) return
      uni.navigateBack( )
    },
    onSubmit() {
@@ -223,10 +224,10 @@
        title: '请输入会议主题',
        icon: 'none'
      })
      if (!param.sysList || param.sysList.length == 0) return uni.showToast({
        title: '请选择参会人员',
        icon: 'none'
      })
      // if (!param.sysList || param.sysList.length == 0) return uni.showToast({
      //   title: '请选择参会人员',
      //   icon: 'none'
      // })
      reservationMeeting({
        ...param,
        startTime: `${param.yudingDate} ${param.startTime}:00`,
h5/pages/staff/snapshot.vue
@@ -224,7 +224,7 @@
        icon: 'none'
      })
      if (!param.applyCheckUserId) return uni.showToast({
        title: '请选择接受人',
        title: '请选择接收人',
        icon: 'none'
      })
      if (!param.categoryName) return uni.showToast({
@@ -258,7 +258,7 @@
        this.$set(this.param, 'checkUserId', item.memberIds)
        this.$set(this.param, 'applyCheckUserId', item.memberIds)
        this.$set(this.param, 'checkorName', item.memberNames)
      }else{
      } else {
        this.$set(this.param, 'checkUserId', '')
        this.$set(this.param, 'applyCheckUserId', '')
        this.$set(this.param, 'checkorName', '')
h5/pages/staff/task/index.vue
@@ -1,5 +1,5 @@
<template>
  <view class="box">
  <view class="box" :class="{ popupShow: showFilter }">
    <scroll-view scroll-x class="box_head">
      <view class="box_head_search">
        <view class="box_head_search_ipt">
@@ -21,7 +21,7 @@
          @click="statusClick(0)"
          :class="{ active: search.queryType === 0 }"
          class="box_head_item"
          >待处理 {{ headData.noticeWaitNum || '' }}</view
          >待处理 {{ headData.noticeWaitNum || "" }}</view
        >
        <view
          @click="statusClick(1)"
@@ -39,7 +39,7 @@
          @click="statusClick(3)"
          :class="{ active: search.queryType === 3 }"
          class="box_head_item"
          >抄送我的 {{ headData.noticeCopyNum || '' }}</view
          >抄送我的 {{ headData.noticeCopyNum || "" }}</view
        >
      </view>
    </scroll-view>
@@ -60,7 +60,7 @@
          />
          <text>仅看未读</text>
        </view>
        <view class="right">全部标记已读</view>
        <view class="right" @click="handleReady">全部标记已读</view>
      </view>
      <view
        class="box_list_item"
@@ -115,11 +115,7 @@
          <view class="box_list_item_nr_x"></view>
          <view class="box_list_item_nr_text">
            <text class="time">{{ item.createDate }}提交</text>
            <text
              v-if="item.param2 == '0'"
              class="btn"
              >去处理</text
            >
            <text v-if="item.param2 == '0'" class="btn">去处理</text>
          </view>
        </view>
      </view>
@@ -141,17 +137,17 @@
      @close="showFilter = false"
    >
      <view class="search">
        <view class="search_head">任务筛选</view>
        <view class="search_head">筛选</view>
        <view class="search_list">
          <view class="search_list_item">
            <view class="search_list_item_label">创建日期</view>
            <view class="search_list_item_label">创建时间</view>
            <view class="search_list_item_val">
              <view
                class="search_list_item_val_row"
                @click="tiemShow = true"
                :style="{ color: modelParam.startDate ? '#000' : '' }"
                >{{
                  modelParam.startDate ? modelParam.startDate : "开始日期"
                  modelParam.startDate ? modelParam.startDate : "开始时间"
                }}</view
              >
              <view class="search_list_item_val_z">-</view>
@@ -160,13 +156,13 @@
                @click="tiemShow1 = true"
                :style="{ color: modelParam.endDate ? '#000' : '' }"
                >{{
                  modelParam.endDate ? modelParam.endDate : "结束日期"
                  modelParam.endDate ? modelParam.endDate : "结束时间"
                }}</view
              >
            </view>
          </view>
          <view class="search_list_item">
            <view class="search_list_item_label">订单来源</view>
            <view class="search_list_item_label">任务类型</view>
            <view class="search_list_item_cates">
              <view
                :class="
@@ -184,23 +180,24 @@
          </view>
        </view>
        <view class="search_footer">
          <view class="search_footer_item" @click="showFilter = false"
            >取消</view
          >
          <view class="search_footer_item" @click="modalReset">重置</view>
          <view class="search_footer_item t" @click="modalSub">提交</view>
        </view>
      </view>
    </u-popup>
    <u-datetime-picker
      :show="tiemShow"
      v-model="modelParam.startDate"
      v-model="startDate"
      mode="date"
      @confirm="confirmLeft"
      @cancel="tiemShow = false"
    ></u-datetime-picker>
    <u-datetime-picker
      :show="tiemShow1"
      v-model="modelParam.endDate"
      :minDate="
        modelParam.startDate ? new Date(modelParam.startDate).getTime() : null
      "
      v-model="startDate"
      mode="date"
      @confirm="confirmRight"
      @cancel="tiemShow1 = false"
@@ -209,7 +206,7 @@
</template>
<script>
import { stagingHead, stagingTaskPage } from '@/api'
import { stagingHead, stagingTaskPage, signReadTask } from '@/api'
import dayjs from 'dayjs'
export default {
  data() {
@@ -218,10 +215,7 @@
      search: {
        queryType: 0
      },
      modelParam: {
        startDate: dayjs().format('YYYY-MM-DD'),
        endDate: dayjs().format('YYYY-MM-DD'),
      },
      modelParam: {},
      tiemShow: false,
      tiemShow1: false,
@@ -237,7 +231,8 @@
        { name: '用车申请', id: 2 },
        { name: '隐患随手拍', id: 3 },
        { name: '物流车申请', id: 4 },
      ]
      ],
      startDate: dayjs().format('YYYY-MM-DD'),
    }
  },
  // onLoad() {
@@ -267,6 +262,13 @@
      this.pagination.page = 0
      this.dataList = []
      this.$set(this.search, 'noRead', val)
      this.getList()
    },
    modalReset() {
      this.modelParam = {}
      this.pagination.page = 0
      this.dataList = []
      this.showFilter = false
      this.getList()
    },
    modalSub() {
@@ -306,8 +308,23 @@
        this.headData = res.data
      })
    },
    handleReady() {
      signReadTask({
        signType: 1
      }).then(res => {
        this.getHeadList()
      })
    },
    handleAppr(item) {
      const { objType, objId } = item
      if (this.search.queryType === 3) {
        signReadTask({
          noticesId: item.id,
          signType: 0
        }).then(res => {
          this.getHeadList()
        })
      }
      if (objType === 2) {
        uni.navigateTo({
          url: `/pages/staff/vehicle/sendACarDetail?id=${objId}&appr=1`
@@ -327,19 +344,21 @@
      }
    },
    clickItem(index) {
      this.$set(this.modelParam, 'type', this.cateList[index].id)
      if (this.cateList[index].id === this.modelParam.type) {
        this.$set(this.modelParam, 'type', null)
      } else {
        this.$set(this.modelParam, 'type', this.cateList[index].id)
      }
    },
    confirmLeft(e) {
      console.log(uni.$u.timeFormat(e.value, 'yyyy-mm-dd'))
      setTimeout(() => {
        this.modelParam.startDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
        this.$set(this.modelParam, 'startDate', uni.$u.timeFormat(e.value, 'yyyy-mm-dd'))
      })
      this.tiemShow = false
    },
    confirmRight(e) {
      // this.modelParam.endDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss')
      setTimeout(() => {
        this.modelParam.endDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd')
        this.$set(this.modelParam, 'endDate', uni.$u.timeFormat(e.value, 'yyyy-mm-dd'))
      })
      this.tiemShow1 = false
    }
@@ -588,8 +607,9 @@
            color: #ffffff !important;
          }
          .search_list_item_cates_row {
            padding: 0 26rpx;
            width: 216rpx;
            height: 64rpx;
            text-align: center;
            line-height: 64rpx;
            background: #f7f7f7;
            border-radius: 36rpx;
@@ -598,8 +618,8 @@
            font-weight: 400;
            color: #333333;
            margin-bottom: 20rpx;
            &:last-child {
              margin: 0;
            &:nth-of-type(3n) {
              margin-right: 0;
            }
          }
        }
h5/pages/staff/task/vDangetAppr.vue
@@ -33,13 +33,14 @@
          <image
            v-if="item.type == 0"
            :src="item.fileurlFull"
            @click="priviewImage(item.fileurlFull)"
            mode="widthFix"
            class="img"
          />
          <video
            v-if="item.type == 1"
            :src="item.fileurlFull"
            class="img"
            class="video"
            controls
          />
        </view>
@@ -177,7 +178,15 @@
      </view>
    </view>
    <view class="emyty"></view>
    <view v-if="info.approveDateVO!=null&& info.approveDateVO.canBeApproved!=null &&info.approveDateVO.canBeApproved ==1 && info.status == 0" class="main_footer" >
    <view
      v-if="
        info.approveDateVO != null &&
        info.approveDateVO.canBeApproved != null &&
        info.approveDateVO.canBeApproved == 1 &&
        info.status == 0
      "
      class="main_footer"
    >
      <view class="btn" @click="handleBack">退回</view>
      <view class="btn transfer" @click="handleTransfer">转交</view>
      <view class="btn handle" @click="handleOpen">处理</view>
@@ -516,6 +525,11 @@
    this.getDetail()
  },
  methods: {
    priviewImage(url) {
      uni.previewImage({
        urls: [url]
      })
    },
    handleOpen() {
      this.isShowHandle = true
      console.log('info', this.info)
@@ -593,10 +607,10 @@
    },
    getMemList() {
      findHiddenAreaMemberList({
        model: {
        model: {
          ...this.transferModel,
          id: this.info.areaId
         },
        },
        ...this.pagination,
      }).then(res => {
        this.memberList = res.data || []
@@ -1024,33 +1038,33 @@
    }
  }
  .adduser_list_item_ipt1_upload {
      width: 120rpx;
      height: 120rpx;
      margin-right: 24rpx;
      border: 2rpx solid #e5e5e5;
      background: #f7f7f7;
      color: #666666;
      font-size: 22rpx;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      position: relative;
      .close {
        position: absolute;
        right: -20rpx;
        top: -20rpx;
        z-index: 9999;
      }
      image {
        width: 100%;
        height: 100%;
      }
      video {
        width: 100%;
        max-height: 120rpx;
      }
    width: 120rpx;
    height: 120rpx;
    margin-right: 24rpx;
    border: 2rpx solid #e5e5e5;
    background: #f7f7f7;
    color: #666666;
    font-size: 22rpx;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    position: relative;
    .close {
      position: absolute;
      right: -20rpx;
      top: -20rpx;
      z-index: 9999;
    }
    image {
      width: 100%;
      height: 100%;
    }
    video {
      width: 100%;
      max-height: 120rpx;
    }
  }
  .module_list {
    .item {
@@ -1113,13 +1127,12 @@
    }
    .file_list {
      display: flex;
      flex-wrap: wrap;
      margin-bottom: 20rpx;
      overflow-x: auto;
      .img_wrap {
        margin-top: 24rpx;
        width: 120rpx;
        height: 120rpx;
        margin-right: 24rpx;
        min-width: 160rpx;
        height: 160rpx;
        border: 2rpx solid #e5e5e5;
        background: #f7f7f7;
        color: #666666;
@@ -1129,10 +1142,15 @@
        align-items: center;
        justify-content: center;
        position: relative;
        margin-right: 16rpx;
        flex-shrink: 0;
      }
      .img {
        width: 120rpx;
        max-height: 120rpx;
        width: 100%;
        max-height: 100%;
      }
      .video {
        height: 160rpx;
      }
    }
    .text_wrap {
h5/pages/staff/vehicle/apply.vue
@@ -142,6 +142,8 @@
    <u-datetime-picker
      :show="isShowDatetime"
      @confirm="confirmDate"
      :minDate="new Date(param.startTime).getTime()"
      :maxDate="new Date(param.endTime).getTime()"
      @cancel="isShowDatetime = false"
      mode="datetime"
    ></u-datetime-picker>
h5/pages/staff/vehicle/sendACarDetail.vue
@@ -118,7 +118,14 @@
      </view>
    </view>
    <view class="emyty"></view>
    <view class="main_footer">
    <view
      class="main_footer"
      v-if="
        info.approveDateVO != null &&
        info.approveDateVO.canBeApproved != null &&
        info.approveDateVO.canBeApproved == 1
      "
    >
      <template v-if="appr == '1'">
        <view class="btn" @click="handleSub(3)">拒绝</view>
        <view class="btn agree" @click="handleSub(2)">同意</view>
h5/pages/staff/vehicle/shinei.vue
@@ -16,7 +16,11 @@
    <view class="time_list">
      <view
        class="item"
        :class="{ disable: item.isUse == 1, active: item.checked == '1' }"
        :class="{
          disable: item.isUse == 1,
          active: item.checked == '1',
          hasSub: item.carUseBookId,
        }"
        @click="datetimeClick(item, i)"
        v-for="(item, i) in timeList"
        :key="i"
@@ -56,18 +60,63 @@
      @cancel="isShowDate = false"
      mode="date"
    ></u-datetime-picker>
    <!-- 详情 -->
    <u-popup
      :show="isShowDetail"
      :round="12"
      mode="bottom"
      @close="isShowDetail = false"
    >
      <view class="detail_modal">
        <view class="title">车辆预约情况</view>
        <view class="h1">{{ activeInfo.carCode }}</view>
        <view class="line">
          <view class="label">预计用车时段</view>
          <view class="value" v-if="activeInfo.startTime"
            >{{ activeInfo.startTime.slice(5, 16) }} -
            {{ activeInfo.endTime.slice(5, 16) }}</view
          >
        </view>
        <view class="line">
          <view class="label">目的地</view>
          <view class="value">{{ activeInfo.addr }}</view>
        </view>
        <view class="line">
          <view class="label">乘车人数</view>
          <view class="value" v-if="activeInfo.memberIds"
            >{{ activeInfo.memberIds.split(",").length }}人</view
          >
        </view>
        <view class="line">
          <view class="label">用车事由</view>
          <view class="value">{{ activeInfo.content || "" }}</view>
        </view>
        <view class="line">
          <view class="label">申请人</view>
          <view class="value"
            >{{ activeInfo.memberName }}
            <text class="primaryColor ml12">{{
              activeInfo.memberPhone
            }}</text></view
          >
        </view>
        <view class="btn" @click="isShowDetail = false">关闭</view>
      </view>
    </u-popup>
  </view>
</template>
<script>
import dayjs from 'dayjs'
import { getCarsList, carCanReservationDate } from '@/api'
import { getCarsList, carCanReservationDate, carUseBookDetail } from '@/api'
export default {
  data() {
    return {
      isShowCar: false,
      isShowDate: false,
      param: {},
      isShowDetail: false,
      activeInfo: {},
      minDate: '',
      carsList: [[{ name: 'aa', value: '11' }]],
@@ -87,7 +136,7 @@
  },
  methods: {
    onSubmit() {
            const { param } = this
      const { param } = this
      const selTimeList = this.timeList.filter(i => i.checked == '1')
      if (selTimeList.length == 0) {
        return uni.showToast({
@@ -95,21 +144,25 @@
          icon: 'none'
        })
      }
            const obj = {
                carCode: param.carCode,
                carId: param.carId ,
                startTime: selTimeList[0].startTime,
                endTime: selTimeList[selTimeList.length - 1].endTime,
                dateDay: param.queryDate,
      const obj = {
        carCode: param.carCode,
        carId: param.carId,
        startTime: selTimeList[0].startTime,
        endTime: selTimeList[selTimeList.length - 1].endTime,
        dateDay: param.queryDate,
        type: '0'
            }
            uni.navigateTo({
                url: `/pages/staff/vehicle/apply?carCode=${obj.carCode}&carId=${obj.carId}&startTime=${obj.startTime}&endTime=${obj.endTime}&dateDay=${obj.dateDay}&type=${obj.type}`
            })
      }
      uni.navigateTo({
        url: `/pages/staff/vehicle/apply?carCode=${obj.carCode}&carId=${obj.carId}&startTime=${obj.startTime}&endTime=${obj.endTime}&dateDay=${obj.dateDay}&type=${obj.type}`
      })
      // this.$jump('/pages/staff/vehicle/apply')
    },
    datetimeClick(item, index) {
      if(item.isUse == '1') return
      if (item.carUseBookId) {
        this.getDetail(item.carUseBookId)
        return
      }
      if (item.isUse == '1') return
      const { timeList } = this
      const selTimeList = timeList.filter(i => i.checked == '1')
      if (selTimeList.length === 0) {
@@ -156,16 +209,24 @@
        this.selDatetime = this.param.queryDate.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours
      }
    },
    getDetail(id) {
      carUseBookDetail(
        id
      ).then(res => {
        this.activeInfo = res.data
        this.isShowDetail = true
      })
    },
    confirmDate(e) {
      this.param.queryDate = dayjs(e.value).format('YYYY-MM-DD')
      this.isShowDate = false
      if(this.param.carId && this.param.queryDate){
                this.gettimes()
            }
      if (this.param.carId && this.param.queryDate) {
        this.gettimes()
      }
    },
    initData() {
      getCarsList({
         type: 1
        type: 1
      }).then(res => {
        this.carsList = [res.data]
      })
@@ -181,6 +242,13 @@
          this.timeList.forEach((i, j) => {
            i.checked = '0',
              i.index = j
            if (dayjs().format('YYYY-MM-DD') == param.queryDate) {
              let endTime = new Date(i.endTime).getTime()
              let nowTime = new Date().getTime()
              if (endTime < nowTime) {
                i.isUse = 1
              }
            }
          })
        }
      })
@@ -189,9 +257,9 @@
      const item = e.value[0]
      this.$set(this.param, 'carCode', item.code)
      this.$set(this.param, 'carId', item.id)
            if(this.param.carId && this.param.queryDate){
                this.gettimes()
            }
      if (this.param.carId && this.param.queryDate) {
        this.gettimes()
      }
      this.isShowCar = false
    }
  }
@@ -260,8 +328,7 @@
  }
  .time_list {
    display: flex;
    justify-content: space-between;
    padding: 30rpx 0;
    padding: 30rpx 0 240rpx;
    flex-wrap: wrap;
    .item {
      width: 220rpx;
@@ -272,15 +339,60 @@
      border-radius: 4rpx;
      margin-bottom: 24rpx;
      font-size: 30rpx;
      margin-right: 15rpx;
      &:nth-of-type(3n) {
        margin-right: 0;
      }
    }
    .active {
      background-color: $uni-color-primary;
      color: #fff;
    }
    .disable {
      background-color: #cccccc;
      color: #999999;
      background: #f7f7f7;
      color: #cccccc;
    }
    .hasSub {
      color: #fff;
      background: #cccccc;
    }
  }
}
.detail_modal {
  padding: 40rpx 30rpx;
  .title {
    text-align: center;
    font-weight: 600;
    font-size: 32rpx;
    margin-bottom: 40rpx;
  }
  .h1 {
    font-weight: 600;
    font-size: 32rpx;
    margin-bottom: 30rpx;
  }
  .line {
    display: flex;
    margin-bottom: 20rpx;
    .label {
      width: 180rpx;
      color: #888888;
    }
    .value {
      color: #333333;
    }
  }
  .btn {
    margin-top: 230rpx;
    width: 690rpx;
    height: 88rpx;
    line-height: 88rpx;
    text-align: center;
    background: $uni-color-primary;
    border-radius: 44rpx;
    font-weight: 600;
    font-size: 32rpx;
    color: #ffffff;
  }
}
</style>
h5/pages/staff/vehicle/shiwai.vue
@@ -125,7 +125,8 @@
    }
  },
  onLoad() {
    this.minDate = new Date(dayjs().format('YYYY-MM-DD HH:') + '00:00').getTime()
    this.minDate = new Date(dayjs().format('YYYY-MM-DD HH:mm') + ':00').getTime()
    console.log('minDate', this.minDate);
    this.initData()
  },
  methods: {
h5/pages/staffLogin/login.vue
@@ -84,7 +84,12 @@
  onLoad() {
    this.initCaptcha()
  },
  onBackPress(options) {
    uni.redirectTo({
      url: '/pages/login/login'
    })
    return true
  },
  methods: {
    ...mapMutations(["setToken", "setUserInfo"]),
    changeFalg() {
@@ -122,10 +127,10 @@
        title: '密码不能为空',
        icon: 'none'
      })
      // if (!form.code) return uni.showToast({
      //   title: '验证码不能为空',
      //   icon: 'none'
      // })
      if (!form.code) return uni.showToast({
        title: '验证码不能为空',
        icon: 'none'
      })
      loginPost({
        ...form,
        uuid: this.captcha.uuid,
@@ -151,7 +156,7 @@
  width: 100%;
  height: 100vh;
  display: flex;
  padding-top: 160rpx;
  padding-top: 130rpx;
  box-sizing: border-box;
  align-items: center;
  flex-direction: column;
@@ -218,7 +223,6 @@
    margin-top: 60rpx;
    .for_psd {
      color: $uni-color-primary;
      margin-top: 40rpx;
      width: 140rpx;
      text-align: center;
      margin: 40rpx auto;
@@ -242,7 +246,7 @@
    width: 100%;
    left: 0;
    text-align: center;
    bottom: 108rpx;
    bottom: 88rpx;
    display: flex;
    justify-content: center;
    align-items: center;
h5/utils/service.js
@@ -36,6 +36,7 @@
                        })
                    }
                    if (data.code === 5112) {
                        uni.clearStorageSync()
                        uni.navigateTo({
                            url: '/pages/login/login'
                        })