k94314517
2024-07-05 97e1b9d6c8d7da0891aa7a1e00116b4b14e1b942
Merge remote-tracking branch 'origin/master'
已添加6个文件
已修改68个文件
2646 ■■■■ 文件已修改
admin/src/api/business/approve.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/carUseBook.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/hiddenDangerParam.js 6 ●●●●● 补丁 | 查看 | 原始文档 | 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/OperaCarDriverWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarsWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerParamWindow.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsReportWindow.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/operaVisitsWindow.vue 42 ●●●● 补丁 | 查看 | 原始文档 | 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/HiddenDangerParam.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/operation/OperCarUseBookParamWindow.vue 142 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalConfiguration.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalReport.vue 37 ●●●● 补丁 | 查看 | 原始文档 | 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 195 ●●●● 补丁 | 查看 | 原始文档 | 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 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/danger/record.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprConfig.vue 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprRecord.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/dangetDetail.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visSubDetail.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/meeting.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/staff.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/components/Li-Calendar/Li-Calendar.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/main.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages.json 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/answer/answer.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/applicationRecord/applicationRecord.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/appointmentDetails/appointmentDetails.vue 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/index/index.vue 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/login/login.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/notice/notice.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/index.vue 73 ●●●● 补丁 | 查看 | 原始文档 | 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 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSub.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSubOrder.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/snapshot.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/index.vue 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/vDangetAppr.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/applePeo.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/apply.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/index.vue 32 ●●●● 补丁 | 查看 | 原始文档 | 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/pages/visitorApplication/visitorApplication.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_driver@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_enter_shinei@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_enter_shiwai@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_staff@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/ic_visitor@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/store/index.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/utils/service.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
@@ -6,6 +6,13 @@
    trim: true
  })
}
// å¯¼å‡º
export function carUseBookRecordEx (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/exportExcel', data, {
    trim: true,
    download: true
  })
}
// æŸ¥è¯¢
export function findLogList (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBookLog/findList', data, {
@@ -33,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/hiddenDangerParam.js
@@ -11,6 +11,12 @@
    trim: true
  })
}
export function exportExcel (data) {
  return request.post('/visitsAdmin/cloudService/business/hiddenDanger/exportExcel', data, {
    trim: true,
    download: true
  })
}
export function memberList (data) {
  return request.post('/visitsAdmin/cloudService/business/hiddenDangerParam/findHiddenAreaMemberList', data, {
    trim: true
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/OperaCarDriverWindow.vue
@@ -88,7 +88,8 @@
    },
    loadMember () {
      allList({
        type: 2
        type: 2,
        companyType: 1
      })
        .then(res => {
          this.memberList = res
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>
@@ -110,8 +110,8 @@
    </div>
    <!--  -->
    <template   v-slot:footer>
      <el-button @click="isShowProblem = true"  type="primary"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  class="status-red">同意</el-button>
      <el-button @click="isBackProblem=true"  type="danger"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  >拒绝</el-button>
      <el-button @click="agreeOpen"  type="primary"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  class="status-red">同意</el-button>
      <el-button @click="jectOpen"  type="danger"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  >拒绝</el-button>
      <el-button @click="visible=false">返回</el-button>
    </template>
    <el-dialog
@@ -123,8 +123,9 @@
        width="480px"
    >
      <el-form :model="dealForm" ref="dealForm" >
        <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.drvierParam ===1">
          <el-select v-model="transForm.driverId" style="width: 300px"  filterable clearable placeholder="请选择派遣司机">
        <!-- <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 == 1">
          <el-select v-model="dealForm.driverId" style="width: 300px"  filterable clearable placeholder="请选择派遣司机">
            <el-option
                v-for="item in memberList"
                :key="item.id"
@@ -138,7 +139,7 @@
              type="textarea"
              placeholder="请填写说明"
              :rows="4"
              v-model="backForm.checkInfo"
              v-model="dealForm.checkInfo"
          />
        </el-form-item>
      </el-form>
@@ -222,9 +223,9 @@
            this.dealing = true
            approveDo({
              objId: this.dataId,
              objType: this.model.type == 1?4:3,
              objType: this.model.type == 1 ? 4 : 3,
              status: 2,
              driverId: this.dealForm.driveId,
              driverId: this.dealForm.driverId,
              checkInfo: this.dealForm.checkInfo
            })
              .then(res => {
@@ -238,27 +239,42 @@
          })
      })
    },
    agreeOpen () {
      this.isShowProblem = true
      this.dealForm = {
        driveId: null,
        checkInfo: null
      }
      this.loadMemberList()
    },
    jectOpen () {
      this.isBackProblem = true
      this.dealForm = {
        driveId: null,
        checkInfo: null
      }
    },
    backDo () {
      this.$refs.backForm.validate((valid) => {
        if (!valid) {
          return
        }
        approveDo({
              objId: this.dataId,
              objType: this.model.type == 1?4:3,
              status: 3,
              checkInfo: this.dealForm.checkInfo
          }).then(res => {
              this.$tip.apiSuccess('退回成功')
              this.getDetail()
              this.isBackProblem = false
            })
            .catch(e => {
            })
            .finally(() => {
              this.dealing = false
            })
          objId: this.dataId,
          objType: this.model.type == 1 ? 4 : 3,
          status: 3,
          checkInfo: this.dealForm.checkInfo
        }).then(res => {
          this.$tip.apiSuccess('退回成功')
          this.getDetail()
          this.isBackProblem = false
        })
          .catch(e => {
          })
          .finally(() => {
            this.dealing = false
          })
      })
    },
    open (title, target) {
      this.title = title
@@ -283,10 +299,6 @@
          this.model = res
          this.dealForm.driveId = res.driveId
        })
    },
    handleTransfer () {
      this.isShowTransfer = true
      this.loadMemberList()
    },
    loadMemberList () {
      driveList({}).then(res => {
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/OperaHiddenDangerParamWindow.vue
@@ -61,17 +61,17 @@
    })
  },
  methods: {
    open (title, target,type) {
    open (title, target, type) {
      this.title = title
      this.visible = true
      this.form.type=type
      this.form.type = type
      this.loadMember()
      // æ–°å»ºç»„织
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
          this.form.type=type
          this.form.type = type
        })
        return
      }
@@ -79,20 +79,21 @@
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
          this.form.type=type
          if (this.type ==0 && target.memberIds != null && target.memberIds != '') {
            let t = target.memberIds.split(',')
            this.form.memberIdList =[]
            t.forEach(item =>{
          this.form.type = type
          if (this.form.type == 0 && target.memberIds != null && target.memberIds != '') {
            const t = target.memberIds.split(',')
            this.form.memberIdList = []
            t.forEach(item => {
              this.form.memberIdList.push(parseInt(item))
            });
            })
          }
        }
      })
    },
    loadMember () {
      allList({
        type: 2
        type: 2,
        companyType: 1
      })
        .then(res => {
          this.memberList = res
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,19 +244,21 @@
        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
        }
        const { param } = this
        if (param.starttime.slice(0, 10) !== param.endtime.slice(0, 10)) return this.$tip.error('入园时间和离园时间不可跨天')
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        createFk({
@@ -262,7 +271,6 @@
            this.$emit('close')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
@@ -281,6 +289,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/HiddenDangerParam.vue
@@ -158,6 +158,8 @@
      const memberNames = item.memberNames.split(',')
      if (memberIds && memberIds.length === 1) {
        this.$set(this.param, 'checkUserId', memberIds[0])
      } else {
        this.$set(this.param, 'checkUserId', '')
      }
      memberIds.forEach((mem, i) => {
        arr.push({
@@ -255,10 +257,15 @@
  display: flex;
  flex-wrap: wrap;
  .item {
    width: 140px;
    max-height: 140px;
    width: 92px;
    max-height: 92px;
    margin-left: 10px;
    position: relative;
    border: 1px dashed #d9d9d9;
    border-radius: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    .close{
      font-size: 20px;
      position: absolute;
@@ -269,8 +276,8 @@
      cursor: pointer;
    }
    .img {
      width: 140px;
      max-height: 90px;
      width: 92px;
      max-height: 92px;
    }
  }
}
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,18 +527,19 @@
        this.timeList = res || []
        this.timeList.forEach((i, j) => {
          i.checked = '0',
            i.index = j
          i.index = j
        })
      })
    },
    initData() {
    initData () {
      getCarList({
        type: 1
      }).then(res => {
        this.carsList = res
      })
      findTypeMemberInfo({
        type: '2'
        type: '2',
        companyType: 1
      }).then(res => {
        this.memberList = res || []
      })
@@ -539,6 +608,10 @@
    background-color: #cccccc;
    color: #999999;
  }
  .hasSub {
      color: #fff;
      background: #cccccc;
    }
}
.color_op {
  display: flex;
@@ -564,6 +637,10 @@
    color: #fff;
    width: 120px;
    text-align: center;
    cursor: pointer;
  }
  .disable{
    background: #cccccc;
  }
}
.have_info {
@@ -600,4 +677,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"
                >
@@ -163,6 +163,7 @@
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
@@ -243,6 +244,7 @@
  data () {
    return {
      activeType: '0',
      subLoading: false,
      apprList: [
        { remark: '审批人', active: false, type: '0', objIds: [] },
        { remark: '抄送人', active: false, type: '1', objIds: [] }
@@ -323,13 +325,15 @@
          item.objIds = ''
        }
      })
      this.subLoading = true
      approveTemplSave({
        type: activeType,
        paramList: temp
      }).then(res => {
        // if (res.code === 200) {
        this.$message.success('保存成功')
        // }
        this.subLoading = false
        this.$tip.success('保存成功')
      }, () => {
        this.subLoading = false
      })
    },
    handleDel () {
admin/src/views/business/approvalReport.vue
@@ -26,15 +26,26 @@
              >
                <div class="head">{{ item.remark }}</div>
                <div class="content">
                  <div v-if="item.objIds && item.objIds.length === 1 ">
                    <span>{{ item.objIds[0].name }} {{ item.objIds[0].companyName }}</span>
                    <span v-if="item.approveType == 0 && item.type == '0'"> æˆ–ç­¾</span>
                    <span v-if="item.approveType == 1 && item.type == '0'"> ä¼šç­¾</span>
                  <div v-if="item.objIds && item.objIds.length === 1">
                    <span
                      >{{ item.objIds[0].name }}
                      {{ item.objIds[0].companyName }}</span
                    >
                    <span v-if="item.approveType == 0 && item.type == '0'">
                      æˆ–ç­¾</span
                    >
                    <span v-if="item.approveType == 1 && item.type == '0'">
                      ä¼šç­¾</span
                    >
                  </div>
                  <div v-else-if="item.objIds && item.objIds.length > 1">
                    <span>{{ item.objIds[0].name }} ç­‰</span>
                    <span v-if="item.approveType == 0 && item.type == '0'"> æˆ–ç­¾</span>
                    <span v-if="item.approveType == 1 && item.type == '0'"> ä¼šç­¾</span>
                    <span v-if="item.approveType == 0 && item.type == '0'">
                      æˆ–ç­¾</span
                    >
                    <span v-if="item.approveType == 1 && item.type == '0'">
                      ä¼šç­¾</span
                    >
                  </div>
                  <div v-else>请选择</div>
                  <i class="el-icon-arrow-right"></i>
@@ -96,7 +107,7 @@
              </div>
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="mem,memIndex in apprList[activeIndex].objIds"
                  v-for="(mem, memIndex) in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
@@ -116,7 +127,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"
                >
@@ -159,6 +170,7 @@
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
@@ -239,6 +251,7 @@
  data () {
    return {
      activeType: '2',
      subLoading: false,
      apprList: [
        { remark: '审批人', active: false, type: '0', objIds: [] },
        { remark: '抄送人', active: false, type: '1', objIds: [] }
@@ -310,13 +323,15 @@
          item.objIds = ''
        }
      })
      this.subLoading = true
      approveTemplSave({
        type: activeType,
        paramList: temp
      }).then(res => {
        if (res.code === 200) {
          this.$message.success('保存成功')
        }
        this.subLoading = false
        this.$tip.success('保存成功')
      }, () => {
        this.subLoading = false
      })
    },
    handleDel () {
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,19 +42,32 @@
        </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
          v-model="searchForm.status"
          v-model="searchForm.meetingStatus"
          filterable
          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">
@@ -52,6 +76,7 @@
          type="datetimerange"
          range-separator="至"
          value-format="yyyy-MM-dd HH:mm:ss"
          :default-time="['00:00:00', '23:59:59']"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          @change="selectDate"
@@ -77,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"
@@ -90,42 +135,81 @@
        @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.meetingStatus == 1">未开始</span>
            <span v-if="row.meetingStatus == 2">进行中</span>
            <span v-if="row.meetingStatus == 3">已结束</span>
            <span v-if="row.meetingStatus == 4">即将开始</span>
            <span v-if="row.meetingStatus == 5">已撤销</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="150px"
        ></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.meetingStatus == '1'" 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.meetingStatus == '1'"  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>
@@ -137,8 +221,15 @@
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaBookingsWindow ref="operaBookingsWindow" @success="handlePageChange"/>
    <OperaBookingsDetailWindow ref="operaBookingsDetailWindow"/>
    <OperaBookingsWindow
      ref="operaBookingsWindow"
      @success="handlePageChange"
    />
    <OperaBookingsDetailWindow
      @success="search"
      ref="operaBookingsDetailWindow"
    />
  </TableLayout>
</template>
@@ -166,7 +257,7 @@
        // departmentId: [],
        department: [],
        realName: '',
        status: '',
        meetingStatus: '',
        createDate: '',
        editor: '',
        editDate: '',
@@ -190,9 +281,11 @@
        { name: '开发部门', id: '0' }
      ],
      status: [
        { name: '全部', id: '' },
        { name: '正常', id: '0' },
        { name: '取消', id: '1' }
        { name: '未开始', id: 1 },
        { name: '即将开始', id: 4 },
        { name: '进行中', id: 2 },
        { name: '已撤销', id: 5 },
        { name: '已结束', id: 3 }
      ],
      link: 'https://dmtest.ahapp.net/meeting_h5/' // H5_LINK_ADDR
    }
@@ -278,7 +371,6 @@
          this.$message.success('会议信息复制成功,去分享给同事吧~')
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    cancelMeeting (id) {
@@ -290,7 +382,6 @@
              this.handlePageChange()
            })
            .catch(e => {
              this.$message.error(e)
            })
        })
    },
@@ -300,7 +391,6 @@
          this.$refs.operaBookingsDetailWindow.open('会议详情', res)
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    editBookings (id) {
@@ -309,7 +399,6 @@
          this.$refs.operaBookingsWindow.open('编辑会议预约', res)
        })
        .catch(e => {
          this.$message.error(e)
        })
    },
    handlePageChange (pageIndex) {
@@ -340,3 +429,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, memberType: 2 }
    })
      .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,8 @@
    userList({
      page: 1,
      capacity: 9999,
      model: { realname: this.filterText },
      memberType: 2,
      model: { realname: this.filterText }
    })
      .then(res => {
        this.userList = res.records
@@ -175,16 +176,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 +210,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/danger/record.vue
@@ -3,7 +3,7 @@
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="提报人" prop="memberName">
        <el-input v-model="searchForm.memberName" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
        <el-input v-model="searchForm.memberName" placeholder="请输入姓名" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="提报人组织" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入" clearable @keypress.enter.native="search"></el-input>
@@ -43,6 +43,7 @@
            type="datetimerange"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            :default-time="['00:00:00', '23:59:59']"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期">
@@ -155,9 +156,7 @@
        .then(() => {
          this.exLoading = true
          exportExcel({
            page: this.pagination.page,
            capacity: 1000000,
            model: this.filters
            model: this.searchForm
          })
            .then(response => {
              this.download(response)
admin/src/views/operation/serviceCar/apprConfig.vue
@@ -2,8 +2,8 @@
  <TableLayout>
    <template v-slot:table-wrap>
      <el-tabs v-model="activeType" @tab-click="handleClick">
        <el-tab-pane label="室内用车" name="3"></el-tab-pane>
        <el-tab-pane label="室外用车" name="4"></el-tab-pane>
        <el-tab-pane label="市内用车" name="3"></el-tab-pane>
        <el-tab-pane label="市外用车" name="4"></el-tab-pane>
      </el-tabs>
      <div class="config">
        <div class="config_list">
@@ -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"
                >
@@ -164,14 +164,15 @@
            <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>
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
@@ -252,6 +253,7 @@
  data () {
    return {
      activeType: '3',
      subLoading: false,
      apprList: [
        { remark: '审批人', active: false, type: '0', objIds: [] },
        { remark: '抄送人', active: false, type: '1', objIds: [] }
@@ -332,13 +334,15 @@
          item.objIds = ''
        }
      })
      this.subLoading = true
      approveTemplSave({
        type: activeType,
        paramList: temp
      }).then(res => {
        // if (res.code === 200) {
        this.subLoading = false
        this.$tip.success('保存成功')
        // }
      }, () => {
        this.subLoading = false
      })
    },
    handleDel () {
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">
@@ -34,6 +34,7 @@
            type="datetimerange"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            :default-time="['00:00:00', '23:59:59']"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期">
@@ -53,7 +54,7 @@
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:carusebook:create','business:carusebook:exportExcel']">
        <li><el-button type="primary" @click="handleEdit" icon="el-icon-plus" v-permissions="['business:carusebook:create']">新建</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:carusebook:exportExcel']">导出</el-button></li>
        <li><el-button type="primary" @click="handleEx" v-permissions="['business:carusebook:exportExcel']">导出</el-button></li>
      </ul>
      <el-table
          v-loading="isWorking.search"
@@ -82,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>
@@ -93,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>
@@ -122,6 +124,7 @@
import OperaCarUseBookParamWindow from '@/components/operation/OperCarUseBookParamWindow.vue'
import { timeForMat } from '@/utils/util'
import { allList } from '@/api/business/hiddenDangerParam'
import { carUseBookRecordEx, revokeById } from '@/api/business/carUseBook'
export default {
  name: 'Empower',
  extends: BaseTable,
@@ -155,6 +158,27 @@
    this.loadParams()
  },
  methods: {
    rowRevokeClick (row) {
      revokeById(row.id)
    },
    handleEx () {
      this.$dialog.exportConfirm('确认导出吗?')
        .then(() => {
          this.exLoading = true
          carUseBookRecordEx({
            model: this.searchForm
          })
            .then(response => {
              this.download(response)
            })
            .catch(e => {
              this.$tip.apiFailed(e)
            })
            .finally(() => {
              this.exLoading = false
            })
        })
    },
    changeRadio (e) {
      this.searchForm.radio = e
      if (e === '0') {
admin/src/views/task/dangetDetail.vue
@@ -34,7 +34,7 @@
              <div class="label">现场情况</div>
              <div class="value">
                <div class="file_list">
                  <template v-for="item in info.submitFileList">
                  <div class="file" v-for="item in info.submitFileList">
                    <img
                      v-if="item.type == 0"
                      :key="item.id"
@@ -49,7 +49,7 @@
                      class="img"
                      controls
                    />
                  </template>
                  </div>
                </div>
              </div>
            </div>
@@ -458,7 +458,7 @@
      }
    }
  },
  created() {
  created () {
    this.getMemberList()
  },
  methods: {
@@ -666,10 +666,14 @@
          }
          .file_list {
            display: flex;
            .img {
              width: 200px;
            .file {
              width: 92px;
              margin-right: 12px;
              margin-bottom: 12px;
              .img{
                max-height: 92px;
                max-width: 92px;
              }
            }
          }
          .value {
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,8 +202,16 @@
      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)
        this.$refs.OperaDetailsWindow.open('公务车申请详情', { ...row, id: row.objId })
        return
      }
      if (row.objType === 1) {
@@ -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>
@@ -238,7 +244,7 @@
    <!--  åŒæ„/拒绝 -->
    <el-dialog
      append-to-body
      :title="apprTitle"
      :title="param.status == 2 ? '同意' : '拒绝'"
      :visible.sync="isShowAppr"
      width="480px"
    >
@@ -400,6 +406,9 @@
    handleAppr (val) {
      this.$set(this.param, 'status', val)
      this.isShowAppr = true
      this.$nextTick(() => {
        this.$refs.ruleForm.clearValidate()
      })
    },
    confirm () {
      console.log('--')
h5/App.vue
@@ -2,46 +2,7 @@
import { wxAuthorize, refreshToken } from '@/api'
export default {
  onLaunch: function () {
    var that = this
    if (!that.$store.state.openid) {
      let url = window.location.href
      let code = ''
      if (url.indexOf('code=') !== -1) {
        const query = url.split('?')
        console.log('app-app', url)
        for (const q of query) {
          if (q.indexOf('code=') !== -1) {
            code = q.substring(q.indexOf('code=') + 5, q.length)
          }
        }
        wxAuthorize({
          code: code
        }).then(res => {
          console.log('app_ress', res)
          if (res.code === 200) {
            that.$store.commit('setOpenId', res.data.openid)
            if (res.data.member) {
              that.$store.commit('setMember', res.data.member)
            }
          }
        })
      } else {
        // const appID = 'wx4d7c10bdec51942b'
        // let uri = encodeURIComponent(url)
        // let authURL =
        //   `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base&state=123#wechat_redirect`
        // window.location.href = authURL
      }
    }
    // åˆ·æ–°token
    const token = uni.getStorageSync('token')
    if (token) {
      //  refreshToken().then(res => {
      //      if(res.code && res.code === 200){
      //         this.$store.commit('setToken', res.data)
      //     }
      // })
    }
  },
  onShow: function () {
    console.log('App Show')
@@ -220,24 +181,42 @@
  font-size: 28rpx;
  color: #333333;
}
.popupShow {
  overflow: hidden;
  position: fixed;
  width: 100%;
}
.placeholder6 {
  color: #666666;
  font-size: 28rpx;
}
.primaryColor{
.primaryColor {
  color: $uni-color-primary;
}
.avatar {
  width: 64rpx;
  height: 64rpx;
  border-radius: 50%;
  overflow: hidden;
  margin-right: 20rpx;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: $uni-color-primary;
  color: #fff;
  font-size: 30rpx;
}
.placeholder9 {
  color: #999999;
  font-size: 28rpx;
}
.fs24{
.fs24 {
  font-size: 24rpx;
}
.mr24 {
  margin-right: 24rpx;
}
.mt24{
.mt24 {
  margin-top: 24rpx;
}
@@ -247,7 +226,7 @@
.ml12 {
  margin-left: 12rpx;
}
.mt6{
.mt6 {
  margin-top: 6rpx;
}
.mr6 {
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/main.js
@@ -4,25 +4,18 @@
import './uni.promisify.adaptor'
import uView from "uview-ui"
import store from './store/index.js'
import Tabbar from '@/components/tarbar.vue'
import navigation from '@/components/Header.vue'
Vue.config.productionTip = false
// å¼‚æ­¥hook
// Vue.prototype.$baseUrl = 'https://dmtest.ahapp.net/h5_api/';
// Vue.prototype.$baseUrl = 'http://facepay.huasunsolar.com/web_interface/';
// Vue.prototype.$baseUrl = 'http://218.23.218.228:8018/web_interface/'
Vue.use(uView)
Vue.component('Tabbar', Tabbar)
Vue.component('navigation', navigation)
Vue.prototype.$store = store
Vue.prototype.$jump = (url) => {
    uni.navigateTo({
        url
    })
}
Vue.prototype.$jump = (url) => {uni.navigateTo({url})}
Vue.prototype.$goBack = () => { uni.navigateBack() }
Vue.prototype.$eventBus = new Vue()
Vue.prototype.$onWait = new Promise((resolve) => {
h5/manifest.json
@@ -91,8 +91,8 @@
            "proxy" : {
                "/admin_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    "target" : "http://192.168.0.173/admin_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.135:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.0.173/admin_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://192.168.0.135:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
                    "pathRewrite" : {
                        "^/admin_interface" : "" // é‡å†™åœ°å€ï¼Œå¦‚果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
h5/pages.json
@@ -4,6 +4,13 @@
    },
    "pages": [
        {
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "选择身份",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "访客中心",
@@ -21,8 +28,7 @@
            "path": "pages/staffLogin/login",
            "style": {
                "navigationBarTitleText": "登录",
                "enablePullDownRefresh": false,
                "navigationStyle": "custom"
                "enablePullDownRefresh": false
            }
        },
        {
h5/pages/answer/answer.vue
@@ -8,12 +8,12 @@
      <view class="box_list_answer" v-if="list && list.length > 0">
        <view v-if="status == 1 || status == 2" class="score_static">
          <text class="name">本次得分:</text>
          <text class="num" :class="{warry: status == 2}">{{ score }}分</text>
          <text class="num" :class="{ warry: status == 2 }">{{ score }}分</text>
        </view>
        <!--    å•选/判断   -->
        <view v-for="(item, index) in list" :key="index" class="list_item">
          <view class="box_list_answer_name">
            <text>{{ index + 1 }}、{{ item.title}}</text>
            <text>{{ index + 1 }}、{{ item.title }}</text>
            <text v-if="item.score"> ({{ item.score }}分)</text>
            <text style="color: #ed4545">*</text>
          </view>
@@ -83,14 +83,18 @@
            </view>
            <view
              class="box_list_answer_tips"
              style="margin-bottom: 0rpx"
              v-if="
                item.selAnswer &&
                item.answer !== item.selAnswer &&
                status != '0'
              "
            >
              <image src="@/static/ic_wrong@2x.png" />
              <text>回答错误</text>
              <view class="line">
                <image src="@/static/ic_wrong@2x.png" />
                <text>回答错误</text>
              </view>
              <view class="line">正确答案:{{ item.answer }}</view>
            </view>
            <view
              class="box_list_answer_tips"
@@ -100,8 +104,10 @@
                status != '0'
              "
            >
              <image src="@/static/ic_success@2.png" />
              <text class="success">回答正确</text>
              <view class="line">
                <image src="@/static/ic_success@2.png" />
                <text class="success">回答正确</text>
              </view>
            </view>
          </template>
          <template v-if="item.type == 2">
@@ -116,8 +122,7 @@
                src="@/static/checkbo1x_sel@2x.png"
                v-if="
                  (line.checked && status != '2') ||
                  (item.selAnswer === item.answer &&
                    line.checked)
                  (item.selAnswer === item.answer && line.checked)
                "
              />
              <image
@@ -135,8 +140,7 @@
              <text
                v-if="
                  (line.checked && status != '2') ||
                  (item.selAnswer === item.answer &&
                    line.checked)
                  (item.selAnswer === item.answer && line.checked)
                "
                style="color: rgba(77, 153, 168, 1)"
                ><text class="mr24" style="color: rgba(77, 153, 168, 1)">{{
@@ -165,8 +169,11 @@
                status != '0'
              "
            >
              <image src="@/static/ic_wrong@2x.png" />
              <text>回答错误</text>
              <view class="line">
                <image src="@/static/ic_wrong@2x.png" />
                <text>回答错误</text>
              </view>
              <view class="line">正确答案:{{ item.answer }}</view>
            </view>
            <view
              class="box_list_answer_tips"
@@ -176,8 +183,10 @@
                status != '0'
              "
            >
              <image src="@/static/ic_success@2.png" />
              <text class="success">回答正确</text>
              <view class="line">
                <image src="@/static/ic_success@2.png" />
                <text class="success">回答正确</text>
              </view>
            </view>
          </template>
        </view>
@@ -237,12 +246,12 @@
      score: 0
    }
  },
  computed:{
    answerIng(){
  computed: {
    answerIng() {
      let count = 0
      this.list.forEach(item => {
        if(item.selAnswer || item.selAnswer == 0){
          count ++
        if (item.selAnswer || item.selAnswer == 0) {
          count++
        }
      })
      return count === this.list.length
@@ -295,7 +304,6 @@
              item.status = '0'
              item.selAnswer = null
            })
            console.log(res.data)
            this.list = res.data
          }
          // res.param.problemsDOList.forEach(item => {
@@ -307,7 +315,7 @@
    },
    // å•选选择中题目
    select(line, i) {
      if(this.status === '2') return
      if (this.status != '0') return
      this.list.forEach((item, index) => {
        if (index === i) {
          item.selAnswer = line.code
@@ -316,7 +324,7 @@
      // this.problemIndex = index
    },
    changeBox(index, jeck) {
      if(this.status === '2') return
      if (this.status != '0') return
      this.list.forEach((item, i) => {
        if (index === i) {
          item.options.forEach((item2, j) => {
@@ -356,7 +364,7 @@
    },
    // ä¸‹ä¸€é¢˜
    onSubmit() {
      if(!this.answerIng) return
      if (!this.answerIng) return
      const { list } = this
      // éªŒè¯æ‰€æœ‰é¢˜ç›®éƒ½æœ‰é€‰é¡¹
      let count = 0
@@ -376,7 +384,7 @@
      list.forEach(item => {
        if (item.selAnswer !== item.answer) {
          flag++
        }else{
        } else {
          this.score += item.score
        }
      })
@@ -468,9 +476,17 @@
        box-sizing: border-box;
        background: #f7f7f7;
        border-radius: 8rpx;
        display: flex;
        align-items: center;
        margin-bottom: 24rpx;
        .line {
          display: flex;
          align-items: center;
          font-size: 28rpx;
          color: #333333;
          margin-bottom: 20rpx;
          &:nth-last-child(1){
            margin-bottom: 0;
          }
        }
        image {
          width: 28rpx;
          height: 28rpx;
@@ -486,18 +502,18 @@
        }
      }
    }
    .score_static{
    .score_static {
      display: flex;
      font-size: 32rpx;
      margin-bottom: 40rpx;
      .name{
      .name {
        font-weight: 600;
      }
      .num{
      .num {
        color: $uni-color-primary;
      }
      .warry{
        color: #ED4545;
      .warry {
        color: #ed4545;
      }
    }
    .list_item {
@@ -541,7 +557,7 @@
      font-size: 30rpx;
      color: #ffffff;
    }
    .disable{
    .disable {
      background-color: #cccccc;
    }
  }
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">
@@ -111,7 +111,7 @@
  methods: {
    handleDetail(id) {
      uni.navigateTo({
        url: "/pages/appointmentDetails/appointmentDetails?id=" + id
        url: "/pages/appointmentDetails/appointmentDetails?detail=1&id=" + id
      })
    },
    tabsClick(val) {
h5/pages/appointmentDetails/appointmentDetails.vue
@@ -77,10 +77,25 @@
  data() {
    return {
      info: {},
      show: false
      show: false,
      detail: ''
    }
  },
  onBackPress(options) {
    if (this.detail == 1) {
      uni.redirectTo({
        url: '/pages/applicationRecord/applicationRecord'
      })
    } else {
      uni.redirectTo({
        url: '/pages/index/index'
      })
    }
    return true
  },
  onLoad(option) {
    this.detail = option.detail || ''
    this.getDetail(option.id)
    // visitorSubDetail({ id: option.id })
    //     .then(res => {
h5/pages/index/index.vue
@@ -1,162 +1,205 @@
<template>
    <view class="box">
        <view class="box_head">
            <text>安泰物流智慧园区</text>
            <text class="h2">访客专区</text>
            <image mode="widthFix" class="banner_bg" src="@/static/banner.jpg" />
        </view>
        <view class="main_title">业务办理</view>
        <view class="box_list">
            <view class="box_list_item" @click="jump(1)">
                <image src="@/static/ic_laifangdengji.png" mode="widthFix" />
            </view>
            <view class="box_list_item" @click="jump(2)">
                <image src="@/static/ic_yuyuejilu.png" mode="widthFix" />
            </view>
            <view class="box_list_item" @click="jump(3)">
                <image src="@/static/ic_yuanqudaolan.png" mode="widthFix" />
            </view>
            <view class="box_list_item" @click="jump(4)">
                <image src="@/static/ic_yuyuezhinan.png" mode="widthFix" />
            </view>
        </view>
        <!-- <view class="box_btn">退出登录</view> -->
        <view class="copyright">
            <image src="@/static/logo_s@2x.png" mode="widthFix" />
            <text>安徽安泰物流有限责任公司版权所有</text>
        </view>
    </view>
  <view class="box">
    <view class="box_head">
      <text>安泰物流智慧园区</text>
      <text class="h2">访客专区</text>
      <image mode="widthFix" class="banner_bg" src="@/static/banner.jpg" />
    </view>
    <view class="main_title">业务办理</view>
    <view class="box_list">
      <view class="box_list_item" @click="jump(1)">
        <image src="@/static/ic_laifangdengji.png" mode="widthFix" />
      </view>
      <view class="box_list_item" @click="jump(2)">
        <image src="@/static/ic_yuyuejilu.png" mode="widthFix" />
      </view>
      <view class="box_list_item" @click="jump(3)">
        <image src="@/static/ic_yuanqudaolan.png" mode="widthFix" />
      </view>
      <view class="box_list_item" @click="jump(4)">
        <image src="@/static/ic_yuyuezhinan.png" mode="widthFix" />
      </view>
    </view>
    <!-- <view class="box_btn">退出登录</view> -->
    <view class="copyright">
      <image src="@/static/logo_s@2x.png" mode="widthFix" />
      <text>安徽安泰物流有限责任公司版权所有</text>
    </view>
  </view>
</template>
<script>
import image from 'uview-ui/libs/config/props/image'
import { wxAuthorize } from '@/api'
export default {
    export default {
  data() {
    return {
        data() {
            return {
            }
        },
        methods: {
            jump(type) {
                switch (type) {
                    case 1:
                        uni.navigateTo({
                            url: '/pages/notice/notice'
                        })
                        break
                    case 2:
                        uni.navigateTo({
                            url: '/pages/applicationRecord/applicationRecord'
                        })
                        break
                    case 3:
                        uni.navigateTo({
                            url: '/pages/guidemap/guidemap'
                        })
                        break
                    case 4:
                        uni.navigateTo({
                            url: '/pages/visitorSubGuide/index'
                        })
                        break
                }
            }
        }
    }
    }
  },
  onBackPress(options) {
    uni.redirectTo({
      url: '/pages/login/login'
    })
    return true
  },
  onLoad() {
    var that = this
    // 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)
        for (const q of query) {
          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)
          // }
          // æ¥æº:0=司机;1=访客;2=内部员工
        }
        wxAuthorize({
          code: code,
          source: 1
        }).then(res => {
          console.log('app_ress', res)
          if (res.code === 200) {
            that.$store.commit('setOpenId', res.data.openid)
            if (res.data.member) {
              that.$store.commit('setMember', res.data.member)
            }
          }
        })
      } else {
        // const appID = 'wx4d7c10bdec51942b'
        // let uri = encodeURIComponent(url)
        // let authURL =
        //   `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base&state=123#wechat_redirect`
        // window.location.href = authURL
      }
    // }
  },
  methods: {
    jump(type) {
      switch (type) {
        case 1:
          uni.navigateTo({
            url: '/pages/notice/notice'
          })
          break
        case 2:
          uni.navigateTo({
            url: '/pages/applicationRecord/applicationRecord'
          })
          break
        case 3:
          uni.navigateTo({
            url: '/pages/guidemap/guidemap'
          })
          break
        case 4:
          uni.navigateTo({
            url: '/pages/visitorSubGuide/index'
          })
          break
      }
    }
  }
}
</script>
<style lang="scss" scoped>
    .box {
        width: 100%;
        height: auto;
        padding: 30rpx;
        box-sizing: border-box;
.box {
  width: 100%;
  height: auto;
  padding: 30rpx;
  box-sizing: border-box;
        .box_btn {
            position: fixed;
            bottom: 70rpx;
            left: 50%;
            transform: translate(-50%, 0);
            width: 208rpx;
            height: 72rpx;
            line-height: 72rpx;
            text-align: center;
            border-radius: 36rpx;
            border: 1rpx solid #999999;
            font-size: 28rpx;
            font-weight: 400;
            color: #333333;
        }
  .box_btn {
    position: fixed;
    bottom: 70rpx;
    left: 50%;
    transform: translate(-50%, 0);
    width: 208rpx;
    height: 72rpx;
    line-height: 72rpx;
    text-align: center;
    border-radius: 36rpx;
    border: 1rpx solid #999999;
    font-size: 28rpx;
    font-weight: 400;
    color: #333333;
  }
        .box_head {
            width: 100%;
            height: 270rpx;
            padding: 0 44rpx;
            box-sizing: border-box;
            border-radius: 8rpx;
            display: flex;
            flex-direction: column;
            position: relative;
            .banner_bg{
                position: absolute;
                top: 0;
                left: 0;
                width: 100%;
                z-index: -1;
            }
            .h2 {
                font-size: 28rpx;
                font-family: SourceHanSansSC, SourceHanSansSC;
                font-weight: 400;
                color: #FFFFFF;
                margin-top: 14rpx;
            }
            text {
                &:first-child {
                    font-size: 44rpx;
                    font-family: SourceHanSansSC, SourceHanSansSC;
                    font-weight: bold;
                    color: #FFFFFF;
                    margin-top: 54rpx;
                }
            }
        }
        .main_title{
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            margin: 40rpx 0 32rpx;
        }
        .box_list {
            width: 100%;
            display: flex;
            align-items: center;
            flex-wrap: wrap;
            justify-content: space-between;
            margin-top: 40rpx;
  .box_head {
    width: 100%;
    height: 270rpx;
    padding: 0 44rpx;
    box-sizing: border-box;
    border-radius: 8rpx;
    display: flex;
    flex-direction: column;
    position: relative;
    .banner_bg {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      z-index: -1;
    }
    .h2 {
      font-size: 28rpx;
      font-family: SourceHanSansSC, SourceHanSansSC;
      font-weight: 400;
      color: #ffffff;
      margin-top: 14rpx;
    }
    text {
      &:first-child {
        font-size: 44rpx;
        font-family: SourceHanSansSC, SourceHanSansSC;
        font-weight: bold;
        color: #ffffff;
        margin-top: 54rpx;
      }
    }
  }
  .main_title {
    font-weight: 600;
    font-size: 32rpx;
    color: #222222;
    margin: 40rpx 0 32rpx;
  }
  .box_list {
    width: 100%;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: space-between;
    margin-top: 40rpx;
            .box_list_item {
                width: 100%;
                margin-bottom: 20rpx;
                image {
                    width: 100%;
                }
            }
        }
        .copyright{
            display: flex;
            align-items: center;
            justify-content: center;
            margin-top: 84rpx;
            font-size: 24rpx;
            color: #666666;
            image{
                width: 40rpx;
                height: 40rpx;
            }
        }
    }
    .box_list_item {
      width: 100%;
      margin-bottom: 20rpx;
      image {
        width: 100%;
      }
    }
  }
  .copyright {
    display: flex;
    align-items: center;
    justify-content: center;
    margin-top: 84rpx;
    font-size: 24rpx;
    color: #666666;
    image {
      width: 40rpx;
      height: 40rpx;
    }
  }
}
</style>
h5/pages/login/login.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
<template>
  <view class="main_app">
    <image class="login_bg" src="@/static/login_bg@2x.png" />
    <view class="h1">安泰物流智慧园区</view>
    <view class="placeholder6 place">请选择您的身份</view>
    <view class="item" @click="jump('/pages/index/index')">
      <image class="avatar" src="@/static/ic_visitor@2x.png" />
      <view class="content">
        <view class="name">我是访客</view>
        <view class="placeholder6">VISITOR</view>
      </view>
      <u-icon name="arrow-right" size="24" color="#979797" />
    </view>
    <view class="item" @click="staffLogin">
      <image class="avatar" src="@/static/ic_staff@2x.png" />
      <view class="content">
        <view class="name">我是员工</view>
        <view class="placeholder6">STAFF</view>
      </view>
      <u-icon name="arrow-right" size="24" color="#979797" />
    </view>
    <view class="item">
      <image class="avatar" src="@/static/ic_driver@2x.png" />
      <view class="content">
        <view class="name">我是物流车司机</view>
        <view class="placeholder6">DRIVER</view>
      </view>
      <u-icon name="arrow-right" size="24" color="#979797" />
    </view>
  </view>
</template>
<script>
export default {
  methods: {
    jump(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'
        })
      }
    }
  }
}
</script>
<style lang="scss" >
.main_app {
  width: 100%;
  height: 100vh;
  padding-top: 80rpx;
  background: linear-gradient(
    180deg,
    rgba(39, 155, 170, 0.2) 0%,
    rgba(39, 155, 170, 0) 100%
  );
  .login_bg {
    position: absolute;
    top: 0;
    width: 750rpx;
    z-index: -1;
  }
  .h1 {
    font-weight: 600;
    font-size: 48rpx;
    color: #222222;
    line-height: 66rpx;
    margin-bottom: 16rpx;
  }
  .place {
    margin-bottom: 98rpx;
  }
  .item {
    width: 690rpx;
    height: 200rpx;
    background: #ffffff;
    border-radius: 8rpx;
    display: flex;
    align-items: center;
    padding: 40rpx;
    font-size: 26rpx;
    margin-bottom: 40rpx;
    .avatar {
      width: 120rpx;
      height: 120rpx;
      margin-right: 30rpx;
    }
    .content {
      flex: 1;
      .name {
        font-weight: 600;
        font-size: 38rpx;
        color: #222222;
        margin-bottom: 20rpx;
      }
    }
  }
}
</style>
h5/pages/notice/notice.vue
@@ -9,7 +9,7 @@
      </view>
      <view class="empty"></view>
    </scroll-view>
    <view class="button" :class="{disable: num > 0}" @click="toapply">
    <view class="button" :class="{ disable: num > 0 }" @click="toapply">
      å·²çŸ¥æ™“,下一步
      <text v-if="num > 0">({{ num }}秒)</text>
    </view>
@@ -33,12 +33,6 @@
    if (!this.$store.state.openId) {
      this.initToken()
    }
    timer = setInterval(() => {
      this.num--
      if (this.num === 0) {
        clearInterval(timer)
      }
    }, 1000)
  },
  methods: {
    initToken() {
@@ -59,6 +53,21 @@
          this.content = res.data.code
        }
      })
      // å€’计时时间
      getSystemDictData({
        dictCode: 'SYSTEM',
        label: 'NOTICE_CUTNTDOWN'
      }).then(res => {
        if (res.code === 200) {
          this.num = res.data.code
          timer = setInterval(() => {
            this.num--
            if (this.num === 0) {
              clearInterval(timer)
            }
          }, 1000)
        }
      })
      // æ˜¯å¦éœ€è¦ç­”题
      getSystemDictData({
        dictCode: 'SYSTEM',
@@ -70,7 +79,7 @@
      })
    },
    toapply() {
      if(this.num > 0) return
      if (this.num > 0) return
      if (this.answer === '0') {
        uni.navigateTo({
          url: '/pages/userinfo/userinfo'
@@ -125,7 +134,7 @@
    bottom: 30rpx;
    left: 30rpx;
  }
  .disable{
  .disable {
    background-color: #cccccc;
  }
}
h5/pages/staff/index.vue
@@ -63,7 +63,9 @@
        <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>
@@ -89,22 +91,71 @@
</template>
<script>
import { logoutPost, stagingHead } from '@/api'
import { logoutPost, stagingHead, wxAuthorize, refreshToken } from '@/api'
export default {
  data() {
    return {
      userInfo: uni.getStorageSync('userInfo'),
      taskNum: 0
      taskInfo: 0
    }
  },
  onLoad() {
    console.log('userInfo', this.userInfo)
  },
  onShow() {
    // if (this.userInfo && this.userInfo.name) {
      this.getTaskInfo()
    var that = this
    // 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)
      for (const q of query) {
        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)
        // }
        // æ¥æº:0=司机;1=访客;2=内部员工
      }
      wxAuthorize({
        code: code,
        source: 2
      }).then(res => {
        console.log('app_ress', res)
        if (res.code === 200) {
          that.$store.commit('setOpenId', res.data.openid)
          if (res.data.member) {
            that.$store.commit('setMember', res.data.member)
          }
        }
      })
    } else {
      // const appID = 'wx4d7c10bdec51942b'
      // let uri = encodeURIComponent(url)
      // let authURL =
      //   `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appID}&redirect_uri=${uri}&response_type=code&scope=snsapi_base&state=123#wechat_redirect`
      // window.location.href = authURL
    }
    // }
    this.getTaskInfo()
    // åˆ·æ–°token
    // const token = uni.getStorageSync('token')
    // if (token) {
    //   refreshToken().then(res => {
    //     if (res.code && res.code === 200) {
    //       this.$store.commit('setToken', res.data)
    //       console.log('res', res.data);
    //       // setTimeout(() => {
    //       //   this.getTaskInfo()
    //       // }, 1000)
    //     }
    //   })
    // }
  },
  mounted() {
    this.$eventBus.$on('taskBack', () => {
      this.getTaskInfo()
    })
  },
  methods: {
    jump(path) {
@@ -121,9 +172,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
@@ -1,5 +1,5 @@
<template>
  <view class="main_app">
  <view class="main_app" :class="{ popupShow: isShowSelMem }">
    <view class="search_inp df_ac">
      <image
        class="mr12 search"
@@ -15,20 +15,18 @@
      />
    </view>
    <view class="member_list">
      <view v-for="item in memberList" :key="item.id" class="line">
      <view v-for="(item, index) in memberList" :key="item.id" class="line">
        <image
          :src="
            item.avatar
              ? item.prefixUrl + item.avatar
              : require('@/static/default_avatar.png')
          "
          v-if="item.avatar"
          :src="item.prefixUrl + item.avatar"
          class="avatar"
          mode=""
        ></image>
        <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
        <view class="content">
          <view class="info">
            <text class="name">{{ item.realname }}</text>
            <!-- <text class="tag">tag</text> -->
            <text class="tag" v-if="item.status == '1'">有会议</text>
          </view>
          <view class="depart">{{ item.departmentName }}</view>
        </view>
@@ -55,7 +53,9 @@
      <view class="sel_mem">
        <text>已选择:</text>
        <view class="members">
                     <text v-for="(item, i) in selList" :key="i">{{ item.realname }};</text>
          <text v-for="(item, i) in selList" :key="i"
            >{{ item.realname }};</text
          >
        </view>
        <image
          @click="isShowSelMem = true"
@@ -64,38 +64,39 @@
          mode=""
        ></image>
      </view>
      <view class="btn" @click="onSubmit">确认({{ selList.length }}/20)</view>
      <view class="btn" @click="onSubmit"
        >确认({{ selList.length }}/{{ param.limitNum }})</view
      >
    </view>
    <!--  -->
     <u-popup
    <u-popup
      catchtouchmove
      :show="isShowSelMem"
      :round="12"
      mode="bottom"
      @close="isShowSelMem = false"
      @close="closeModal"
    >
      <view class="modal">
        <view class="modal_header">
          <text class="status">已选择:{{ selList.length }}人</text>
          <text class="btn" @click="isShowSelMem = false">确认</text>
          <text class="btn" @click="subSelMem">确认</text>
        </view>
        <view class="modal_mem_list">
          <view class="line" v-for="(item, i) in selList" :key="i">
            <image
              :src="
                item.faceImgFull
                  ? item.faceImgFull
                  : require('@/static/logo@2x.png')
              "
              v-if="item.avatar"
              :src="item.prefixUrl + item.avatar"
              class="avatar"
              mode=""
            ></image>
            <view v-else class="avatar">{{ item.realname.slice(0, 1) }}</view>
            <view class="content">
              <view class="info">
                <text class="name">{{ item.realname }}</text>
              </view>
              <view class="depart">{{ item.departmentName }}</view>
            </view>
            <view class="btn" @click="handleRemove(item)">移除</view>
            <view class="btn" @click="handleRemove(i)">移除</view>
          </view>
        </view>
      </view>
@@ -105,12 +106,15 @@
<script>
import { userPagePost } from '@/api'
import dayjs from 'dayjs'
export default {
  data() {
    return {
      memberList: [],
      selList: [],
      param: {},
      param: {
        limitNum: ''
      },
      pagination: {
        page: 1,
        capacity: 20
@@ -120,15 +124,42 @@
    }
  },
  onLoad(option) {
    this.param = { ...option, keyword: '' }
    this.param = {
      limitNum: option.limitNum,
      keyword: '',
      startTime: dayjs(Number(option.startTime)).format('YYYY-MM-DD HH:mm:ss'),
      endTime: dayjs(Number(option.endTime)).format('YYYY-MM-DD HH:mm:ss'),
    }
    this.initData()
  },
  mounted() {
    this.$eventBus.$on('meetingPeoDetail', (res) => {
      setTimeout(() => {
        res.forEach(item => {
          this.memberList.forEach(mem => {
            if (item.id == mem.id) {
              mem.checked = true
            }
          })
        })
        this.selList = this.memberList.filter(i => i.checked)
        this.$nextTick(() => {
          this.$forceUpdate()
        })
      }, 1000)
    })
  },
  methods: {
    onSubmit() {
            this.$eventBus.$emit('meetingPeo', this.selList)
      this.$eventBus.$emit('meetingPeo', this.selList)
      uni.navigateBack()
    },
        changeMem(item, index) {
    changeMem(item, index) {
      const { selList, param } = this
      if (this.selList.length == param.limitNum && !item.checked) return uni.showToast({
        title: `该会议可容纳${param.limitNum}人`,
        icon: 'none'
      })
      item.checked = !item.checked
      this.selList = this.memberList.filter(i => i.checked)
      // const arr = e.detail.value
@@ -154,17 +185,31 @@
      }).then(res => {
        this.memberList = res.data.records || []
                this.memberList.map(i => {
                    i.checked = false
                })
        this.memberList.map(i => {
          i.checked = false
        })
      })
    },
        handleRemove(item) {
      this.memberList.forEach(ite => {
        if (item.id === ite.id) {
          ite.checked = false
        }
    closeModal() {
      this.selList = this.memberList.filter(i => i.checked)
      this.isShowSelMem = false
    },
    subSelMem() {
      const { selList, memberList } = this
      memberList.forEach(ite => {
        ite.checked = false
        selList.forEach(item => {
          if (ite.id === item.id) {
            ite.checked = true
          } else { }
        })
      })
      this.isShowSelMem = false
      this.$forceUpdate()
    },
    handleRemove(i) {
      this.selList.splice(i, 1)
      // console.log(this.memberList);
      this.$forceUpdate()
    },
@@ -175,10 +220,12 @@
<style lang="scss">
.modal {
  padding: 40rpx 30rpx;
  max-height: 1000rpx;
  .modal_header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 20rpx;
    .status {
      font-weight: 600;
    }
@@ -187,6 +234,8 @@
    }
  }
  .modal_mem_list {
    max-height: 860rpx;
    overflow: auto;
    .line {
      display: flex;
      align-items: center;
@@ -198,6 +247,11 @@
        border-radius: 50%;
        overflow: hidden;
        margin-right: 20rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        background-color: $uni-color-primary;
        color: #fff;
      }
      .content {
        flex: 1;
@@ -229,7 +283,7 @@
.sub_wrap {
  position: fixed;
  bottom: 0;
    background-color: #fff;
  background-color: #fff;
  left: 0;
  width: 100%;
  box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
@@ -293,10 +347,12 @@
          color: #f62710;
          padding: 0rpx 6rpx;
          margin-left: 8rpx;
          display: flex;
          align-items: center;
        }
      }
    }
        .checked{
    .checked {
      width: 48rpx;
    }
  }
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({
@@ -146,11 +147,16 @@
        startTime: selTimeList[0].startTime,
        endTime: selTimeList[selTimeList.length - 1].endTime,
        bookingTimeList: selTimeList.map(i => i.id).join(','),
        yudingDate: activeRoom.yudingDate,
        roomName: activeRoom.roomName,
        limitNum: activeRoom.limitNum,
        roomId: activeRoom.roomId,
      }
      setTimeout(() => {
        this.$eventBus.$emit('meetingSub', obj)
      }, 500)
      uni.navigateTo({
        url: `/pages/staff/meetingSubOrder?yudingDate=${activeRoom.yudingDate}&roomName=${activeRoom.roomName}
        &roomId=${activeRoom.roomId}&startTime=${obj.startTime}&endTime=${obj.endTime}
        &bookingTimeList=${obj.bookingTimeList}&limitNum=${activeRoom.limitNum}`
        url: `/pages/staff/meetingSubOrder`
      })
      // this.$jump('/pages/staff/vehicle/apply')
    },
@@ -327,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;
@@ -343,18 +351,22 @@
    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-color: #2d5c65;
    background: #CCCCCC;
  }
}
.meeting_list {
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">
@@ -140,16 +140,6 @@
        title: '会议详情'
      })
      this.getDetail(option.id)
    } else {
      this.param = { ...option }
      const bookingTimeList = option.bookingTimeList.split(',').map(i => {
        return {
          timeId: Number(i)
        }
      })
      this.$set(this.param, 'bookingTimeList', bookingTimeList)
      this.$set(this.param, 'activeDate', dayjs(option.yudingDate).format('YYYYå¹´M月D日'))
      this.initOption()
    }
  },
  mounted() {
@@ -160,6 +150,17 @@
      }))
      // this.$set(this.param, 'memberIds', res.map(i => i.id).join(','))
      // this.$set(this.param, 'memberNames', res.map(i => i.name).join(','))
    })
    this.$eventBus.$on('meetingSub', (res) => {
      this.param = { ...res }
      this.$set(this.param, 'activeDate', dayjs(res.yudingDate).format('YYYYå¹´M月D日'))
      const bookingTimeList = res.bookingTimeList.split(',').map(i => {
        return {
          timeId: Number(i)
        }
      })
      this.$set(this.param, 'bookingTimeList', bookingTimeList)
      this.initOption()
    })
  },
  methods: {
@@ -214,6 +215,7 @@
      })
    },
    handleBack() {
      if(this.param.id) return
      uni.navigateBack( )
    },
    onSubmit() {
@@ -222,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`,
@@ -248,10 +250,15 @@
    },
    selPeople() {
      const { param } = this
      let startTime = param.yudingDate + ' ' + param.startTime
      let endTime = param.yudingDate + ' ' + param.endTime
      let startTime = new Date(param.yudingDate + ' ' + param.startTime).getTime()
      let endTime = new Date(param.yudingDate + ' ' + param.endTime).getTime()
      if(this.param.sysList && this.param.sysList.length > 0){
        setTimeout(() => {
          this.$eventBus.$emit('meetingPeoDetail', this.param.sysList || [])
        }, 500)
      }
      uni.navigateTo({
        url: `/pages/staff/meetingSel?startTime=${startTime}&endTime=${endTime}`
        url: `/pages/staff/meetingSel?startTime=${startTime}&endTime=${endTime}&limitNum=${this.param.limitNum}`
      })
    },
    serviceClick(item) {
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() {
@@ -249,6 +244,12 @@
    // this.pagination.page = 0
    // this.dataList = []
    this.getList()
  },
  onBackPress(options) {
    setTimeout(()=>{
      this.$eventBus.$emit('taskBack')
    })
    return false
  },
  onShow() {
    this.pagination.page = 0
@@ -267,6 +268,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() {
@@ -296,7 +304,6 @@
            i.param1 = JSON.parse(i.param1)
          }
        })
        console.log('dataList', this.dataList)
      })
    },
    getHeadList() {
@@ -306,8 +313,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 +349,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 +612,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 +623,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/applePeo.vue
@@ -1,5 +1,5 @@
<template>
  <view class="main_app">
  <view class="main_app" :class="{ popupShow: isShowSelMem }">
    <view class="search_inp df_ac">
      <image
        class="mr12 search"
@@ -17,14 +17,12 @@
    <view class="member_list">
      <view v-for="(item, index) in memberList" :key="item.id" class="line">
        <image
          :src="
            item.faceImgFull
              ? item.faceImgFull
              : require('@/static/logo@2x.png')
          "
          v-if="item.faceImgFull"
          :src="item.faceImgFull"
          class="avatar"
          mode=""
        ></image>
        <view v-else class="avatar">{{ item.name.slice(0, 1) }}</view>
        <view class="content">
          <view class="info">
            <text class="name">{{ item.name }}</text>
@@ -65,19 +63,19 @@
          mode=""
        ></image>
      </view>
      <view class="btn" @click="onSubmit">确认({{ selList.length }}/20)</view>
      <view class="btn" @click="onSubmit">确认</view>
    </view>
    <!--  -->
    <u-popup
      :show="isShowSelMem"
      :round="12"
      mode="bottom"
      @close="isShowSelMem = false"
      @close="closeModal"
    >
      <view class="modal">
        <view class="modal_header">
          <text class="status">已选择:{{ selList.length }}人</text>
          <text class="btn" @click="isShowSelMem = false">确认</text>
          <text class="btn" @click="subSelMem">确认</text>
        </view>
        <view class="modal_mem_list">
          <view class="line" v-for="(item, i) in selList" :key="i">
@@ -96,7 +94,7 @@
              </view>
              <view class="depart">{{ item.componey }}</view>
            </view>
            <view class="btn" @click="handleRemove(item)">移除</view>
            <view class="btn" @click="handleRemove(i)">移除</view>
          </view>
        </view>
      </view>
@@ -143,13 +141,13 @@
  },
  methods: {
    initData() {
      const { param, pagination } = this
      const { param } = this
      findTypeMemberInfo({
        // model: {
        name: param.name,
        // },
        type: '2',
        ...pagination
        companyType: 1,
      }).then(res => {
        this.memberList = res.data || []
        this.memberList.forEach(i => {
@@ -165,6 +163,23 @@
      this.$eventBus.$emit('applePeo', this.selList)
      uni.navigateBack()
    },
    closeModal() {
      this.selList = this.memberList.filter(i => i.checked)
      this.isShowSelMem = false
    },
    subSelMem() {
      const { selList, memberList } = this
      memberList.forEach(ite => {
        ite.checked = false
        selList.forEach(item => {
          if (ite.id === item.id) {
            ite.checked = true
          } else { }
        })
      })
      this.isShowSelMem = false
      this.$forceUpdate()
    },
    changeMem(item, index) {
      // this.memberList.forEach(mem => {
      //   if(item.id === mem.id){
@@ -175,13 +190,8 @@
      this.selList = this.memberList.filter(i => i.checked)
      this.$forceUpdate()
    },
    handleRemove(item) {
      this.memberList.forEach(ite => {
        if (item.id === ite.id) {
          ite.checked = false
        }
      })
      // console.log(this.memberList);
    handleRemove(i) {
      this.selList.splice(i, 1)
      this.$forceUpdate()
    },
  }
@@ -191,10 +201,12 @@
<style lang="scss">
.modal {
  padding: 40rpx 30rpx;
  max-height: 1000rpx;
  .modal_header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding-bottom: 20rpx;
    .status {
      font-weight: 600;
    }
@@ -203,6 +215,8 @@
    }
  }
  .modal_mem_list {
    max-height: 860rpx;
    overflow: auto;
    .line {
      display: flex;
      align-items: center;
h5/pages/staff/vehicle/apply.vue
@@ -91,13 +91,15 @@
            }"
          >
            <text v-if="param.memberNames">
              <text v-for="mem,i in param.memberList" :key="mem.id">
                                <template v-if="i < 2">
                                    <text>{{ mem.name }}</text>
                                    <text v-if="i < 1 && param.memberList.length > 1">,</text>
                                </template>
                            </text>
                            <text v-if="param.memberList.length > 2">等{{ param.memberList.length }}人</text>
              <text v-for="(mem, i) in param.memberList" :key="mem.id">
                <template v-if="i < 2">
                  <text>{{ mem.name }}</text>
                  <text v-if="i < 1 && param.memberList.length > 1">,</text>
                </template>
              </text>
              <text v-if="param.memberList.length > 2"
                >等{{ param.memberList.length }}人</text
              >
            </text>
            <text v-else>请选择</text>
          </text>
@@ -135,11 +137,13 @@
    </view>
    <view class="sub_btn" @click="handleSub">提交</view>
    <!--  -->
    <!-- :minDate="new Date(param.startTime).getTime()"
      :maxDate="new Date(param.endTime).getTime()" -->
    <u-datetime-picker
      :show="isShowDatetime"
      @confirm="confirmDate"
      :minDate="new Date(param.startTime).getTime()"
      :maxDate="new Date(param.endTime).getTime()"
      @confirm="confirmDate"
      @cancel="isShowDatetime = false"
      mode="datetime"
    ></u-datetime-picker>
@@ -207,7 +211,7 @@
      })
    },
    selPeople() {
      if(this.param.memberList && this.param.memberList.length > 0){
      if (this.param.memberList && this.param.memberList.length > 0) {
        setTimeout(() => {
          this.$eventBus.$emit('applePeoDetail', this.param.memberList || [])
        }, 500)
h5/pages/staff/vehicle/index.vue
@@ -1,7 +1,7 @@
<template>
  <view class="main_app">
    <image
      src="../../../static/staff/yongche_bg.png"
      src="@/static/staff/yongche_bg.png"
      class="banner"
      mode="widthFix"
    ></image>
@@ -10,20 +10,34 @@
      <view class="title">选择目的地类别</view>
      <view class="item" @click="$jump('/pages/staff/vehicle/shinei')">
        <image
          src="../../../static/bg_shineiyongche@2x.png"
          src="@/static/bg_shineiyongche@2x.png"
          class="img"
          mode="widthFix"
        ></image>
        <view class="h1">市内用车</view>
        <view class="h1">
          <text>市内用车</text>
          <image
            src="@/static/ic_enter_shinei@2x.png"
            class="icon"
            mode="widthFix"
          ></image>
        </view>
        <view class="h2">URBAN AREA</view>
      </view>
      <view class="item" @click="$jump('/pages/staff/vehicle/shiwai')">
        <image
          src="../../../static/bg_shiwaiyongche@2x.png"
          src="@/static/bg_shiwaiyongche@2x.png"
          class="img"
          mode="widthFix"
        ></image>
        <view class="h1">市外用车</view>
        <view class="h1">
          <text>市外用车</text>
          <image
            src="@/static/ic_enter_shiwai@2x.png"
            class="icon"
            mode="widthFix"
          ></image>
        </view>
        <view class="h2">SUBURB AREA</view>
      </view>
    </view>
@@ -70,6 +84,12 @@
        color: #222222;
        line-height: 48rpx;
        margin-bottom: 10rpx;
        display: flex;
        align-items: center;
        .icon{
          width: 32rpx;
          margin-left: 10rpx;
        }
      }
      .h2 {
        font-size: 22rpx;
@@ -91,7 +111,7 @@
      font-size: 34rpx;
      color: #222222;
      line-height: 48rpx;
            text-align: center;
      text-align: center;
    }
  }
  .banner {
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/pages/visitorApplication/visitorApplication.vue
@@ -119,6 +119,7 @@
      v-if="form1.starttime"
      :show="show5"
      :minDate="formatTimeStamp(form1.starttime)"
      :maxDate="formatTimeStamp(form1.starttime.slice(0,10) + ' 23:59')"
      mode="datetime"
      @cancel="show5 = false"
      @confirm="setendtime"
@@ -775,7 +776,7 @@
      this.form1.starttime = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM')
      // this.maxTime = getDaysAfterDate(uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM'), this.day)
      this.maxTime = this.form1.starttime
      console.log(this.form1.starttime)
      console.log(this.form1.starttime.slice(0,10))
      this.show4 = false
    },
    setendtime(e) {
h5/static/ic_driver@2x.png
h5/static/ic_enter_shinei@2x.png
h5/static/ic_enter_shiwai@2x.png
h5/static/ic_staff@2x.png
h5/static/ic_visitor@2x.png
h5/store/index.js
@@ -71,7 +71,7 @@
            state.sessionKey = val
            uni.setStorageSync('sessionKey', val)
        },
        // æ¸…空所有缓存
        // æ¸…空登录缓存
        empty(state) {
            state.token = ''
            state.userInfo = {}
h5/utils/service.js
@@ -36,8 +36,9 @@
                        })
                    }
                    if (data.code === 5112) {
                        uni.clearStorageSync()
                        uni.navigateTo({
                            url: '/pages/staffLogin/login'
                            url: '/pages/login/login'
                        })
                    }
                    resolve(data)