ll
liukangdong
2024-09-20 c5b5706cd645440a877c546978751b63bf40d008
ll
已删除4个文件
已修改21个文件
2160 ■■■■■ 文件已修改
admin/.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/meeting/bookings.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/strandedPersonnel.vue 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visitorManagement.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/visits.vue 252 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/bookings.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/meeting.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingDetail.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSel.vue 751 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/memberSel.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/vDangetAppr.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/.hbuilderx/launch.json 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/manifest.json 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/package-lock.json 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/pages/index/config.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/pages/index/index.vue 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/dist/cache/.vite/deps/_metadata.json 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/dist/cache/.vite/deps/dayjs.js 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/dist/cache/.vite/deps/dayjs.js.map 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/dist/cache/.vite/deps/package.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/utils/config.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/utils/service.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development
@@ -2,5 +2,5 @@
NODE_ENV = 'development'
VUE_APP_API_URL  = 'http://localhost:10010'
VUE_APP_API_URL  = 'http://192.168.0.139:10010'
VUE_APP_API_URL  = 'http://192.168.137.1:10010'
# VUE_APP_API_URL  = 'http://10.50.250.178:8088/gateway_interface'
admin/src/api/meeting/bookings.js
@@ -1,13 +1,13 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
export function fetchList(data) {
  return request.post('/meetingAdmin/cloudService/business/bookings/page', data, {
    trim: true
  })
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
export function exportExcel(data) {
  return request.post('/meetingAdmin/cloudService/business/bookings/exportExcel', data, {
    trim: true,
    download: true
@@ -15,41 +15,49 @@
}
// åˆ›å»º
export function create (data) {
export function create(data) {
  return request.post('/meetingAdmin/cloudService/business/bookings/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
export function updateById(data) {
  return request.post('/meetingAdmin/cloudService/business/bookings/updateById', data)
}
// å–消
export function cancelById (data) {
export function cancelById(data) {
  return request.post('/meetingAdmin/cloudService/business/meeting/reservationCancel', data)
}
// ç»“束
export function overBookById (data) {
// å¼€å§‹
export function startById(data) {
  return request.post('/meetingAdmin/cloudService/business/meeting/start', data)
}
// æå‰å¼€å§‹
export function startEarlyById(data) {
  return request.post('/meetingAdmin/cloudService/business/meeting/startEarly', data)
}
//
export function overBookById(data) {
  return request.post('/meetingAdmin/cloudService/business/meeting/reservationOver', data)
}
// é¢„定详情
export function BookDetailById (params) {
export function BookDetailById(params) {
  return request.get('/meetingAdmin/cloudService/web/meeting/meetingDetail', {
    params
  })
}
// åˆ é™¤
export function deleteById (id) {
export function deleteById(id) {
  return request.get(`/meetingAdmin/cloudService/business/bookings/delete/${id}`)
}
// æ ¹æ®ID查询
export function bookingsDetail (id) {
export function bookingsDetail(id) {
  return request.get(`/meetingAdmin/cloudService/business/bookings/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
export function deleteByIdInBatch(ids) {
  return request.get('/meetingAdmin/cloudService/business/bookings/delete/batch', {
    params: {
      ids
@@ -58,11 +66,11 @@
}
// ä¼šè®®å®¤ä½¿ç”¨æ—¶é•¿ç»Ÿè®¡
export function getRoomStatistics (yearNum, roomId) {
export function getRoomStatistics(yearNum, roomId) {
  return request.get(`/meetingAdmin/cloudService/business/bookings/getRoomStatistics?yearNum=${yearNum}&roomId=${roomId}`)
}
// ä¼šè®®å®¤ä½¿ç”¨æ—¶é•¿ç»Ÿè®¡å¯¼å‡ºExcel
export function exportRoomStatistics (data) {
export function exportRoomStatistics(data) {
  return request.post(`/meetingAdmin/cloudService/business/bookings/exportRoomStatistics`, data, {
    trim: true,
    download: true
@@ -70,11 +78,11 @@
}
// äººå‘˜å‚加会议时常
export function getUserStatistics (data) {
export function getUserStatistics(data) {
  return request.post(`/meetingAdmin/cloudService/business/bookings/getUserStatistics`, data)
}
// äººå‘˜å‚会时长统计导出Excel
export function exportUserStatistics (data) {
export function exportUserStatistics(data) {
  return request.post(`/meetingAdmin/cloudService/business/bookings/exportUserStatistics`, data, {
    trim: true,
    download: true
@@ -82,10 +90,10 @@
}
//
export function reservationCancel (type) {
export function reservationCancel(type) {
  return request.get(`/meetingAdmin/cloudService/business/bookings/reservationCancel?type=${type}`)
}
//
export function findMothBookingMeet ({roomId, dateMonth}) {
export function findMothBookingMeet({ roomId, dateMonth }) {
  return request.post(`/meetingAdmin/cloudService/business/bookings/findMothBookingMeet?roomId=${roomId}&dateMonth=${dateMonth}`)
}
admin/src/views/business/internalMember.vue
@@ -61,7 +61,12 @@
                @selection-change="handleSelectionChange"
            >
                <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="name" label="姓名" min-width="110px">
                  <template slot-scope="{row}">
                    <span>{{ row.name }}</span>
                      <span class="zhuguan" v-if="row.headStatus == 1">主管</span>
                    </template>
                </el-table-column>
                <el-table-column prop="phone" label="手机号" min-width="100px"></el-table-column>
                <el-table-column prop="idcardDecode" label="身份证号" min-width="100px"></el-table-column>
                <el-table-column label="性别" min-width="100px">
@@ -381,6 +386,7 @@
</script>
<style lang="scss" scoped>
 @import '@/assets/style/variables.scss';
    .box {
        width: 100%;
        display: flex;
@@ -395,4 +401,11 @@
            height: 100%;
        }
    }
    .zhuguan{
      color: $primary-color;
      border: 1px solid $primary-color;
      padding: 0px 3px;
      border-radius: 4px;
      margin-left: 6px;
    }
</style>
admin/src/views/business/strandedPersonnel.vue
@@ -1,26 +1,12 @@
<template>
  <TableLayout :permissions="['business:member: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="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="companyName">
        <el-input
          v-model="searchForm.companyName"
          placeholder="请输入组织名称"
          @keypress.enter.native="search"
        ></el-input>
        <el-input v-model="searchForm.companyName" placeholder="请输入组织名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="用户类型" prop="type">
        <el-select v-model="searchForm.type" placeholder="请选择">
@@ -38,28 +24,11 @@
      <!--            <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">-->
      <!--                <li><el-button type="primary" v-permissions="['business:member:create']" @click="thaws">离场</el-button></li>-->
      <!--            </ul>-->
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <!--                <el-table-column type="selection" width="55"></el-table-column>-->
        <el-table-column
          prop="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="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 label="用户类型" min-width="100px">
          <template slot-scope="{ row }">
            <span v-if="row.type === 0">劳务访客</span>
@@ -67,60 +36,34 @@
            <span v-if="row.type === 2">内部人员</span>
          </template>
        </el-table-column>
        <el-table-column
          prop="inDate"
          label="在园时间"
          min-width="100px"
        ></el-table-column>
        <el-table-column
          prop="outDate"
          label="授权到期时间"
          min-width="100px"
        ></el-table-column>
        <el-table-column prop="inDate" label="在园时间" min-width="100px"></el-table-column>
        <el-table-column prop="outDate" label="授权到期时间" min-width="100px"></el-table-column>
        <el-table-column label="超时时长" min-width="100px">
          <template slot-scope="{ row }">
            <span v-if="row.outStatus === 1"
              >{{ row.timeOut.toString().replace("-", "") }}分钟</span
            >
            <span v-if="row.outStatus === 1">{{ row.timeOut.toString().replace("-", "") }}分钟</span>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{ row }">
            <span v-if="row.outStatus === 0">未超时</span>
            <span style="color: red" v-else-if="row.outStatus === 1"
              >已超时</span
            >
            <span style="color: red" v-else-if="row.outStatus === 1">已超时</span>
            <span v-else-if="row.outStatus === 2">即将超时</span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="
            containPermissions([
              'business:member:update',
              'business:member:delete',
            ])
          "
          label="操作"
          min-width="120"
          fixed="right"
        >
        <el-table-column v-if="
          containPermissions([
            'business:member:update',
            'business:member:delete',
          ])
        " label="操作" min-width="120" fixed="right">
          <template slot-scope="{ row }">
            <el-button
              type="text"
              icon="el-icon-edit"
              v-permissions="['business:member:update']"
              @click="departure(row.id)"
              >离厂</el-button
            >
            <el-button type="text" icon="el-icon-edit" v-permissions="['business:member:update']"
              @click="departure(row.id)">离厂</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
  </TableLayout>
@@ -160,7 +103,7 @@
  },
  methods: {
    departure(id) {
      this.$confirm('确定离场吗, æ˜¯å¦ç»§ç»­?', '提示', {
      this.$confirm('确定离厂吗, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
admin/src/views/business/visitorManagement.vue
@@ -55,8 +55,8 @@
                </el-table-column>
                <el-table-column prop="idcardDecode" label="身份证号" width="150px"></el-table-column>
                <el-table-column prop="visitCompanyName" label="组织" min-width="100px"></el-table-column>
                <el-table-column prop="visitsCount" label="拜访次数" min-width="100px"></el-table-column>
                <el-table-column prop="visitsLastDate" label="最后拜访时间" min-width="100px"></el-table-column>
                <el-table-column prop="visitTimes" label="拜访次数" min-width="100px"></el-table-column>
                <el-table-column prop="lastVisitDate" label="最后拜访时间" min-width="100px"></el-table-column>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
admin/src/views/business/visits.vue
@@ -1,123 +1,115 @@
<template>
    <TableLayout :permissions="['business:visits:query']">
        <!-- æœç´¢è¡¨å• -->
        <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
            <el-form-item label="姓名/手机号" prop="name">
                <el-input v-model="searchForm.name" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
            </el-form-item>
            <el-form-item label="身份证号" prop="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>
            <el-form-item label="审批状态" prop="status">
                <el-select v-model="searchForm.status" placeholder="请选择">
                    <el-option label="待提交审批" value="0"></el-option>
                    <el-option label="审批中" value="1"></el-option>
                    <el-option label="审核通过" value="2"></el-option>
                    <el-option label="审核不通过" value="3"></el-option>
                    <el-option label="取消" value="4"></el-option>
                    <el-option label="预约成功" value="5"></el-option>
                    <el-option label="预约失败" value="6"></el-option>
                    <el-option label="拜访中" value="7"></el-option>
                    <el-option label="已签离" value="8"></el-option>
                    <el-option label="已失效" value="9"></el-option>
                </el-select>
            </el-form-item>
            <section>
                <el-button type="primary" @click="search">搜索</el-button>
<!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:visits:exportExcel']" @click="exportExcel">导出</el-button>-->
                <el-button @click="reset">重置</el-button>
            </section>
        </el-form>
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
           <ul class="toolbar" v-permissions="['business:visits:create', 'business:visits:exportExcel']">
               <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus" v-permissions="['business:visits:create']">新建</el-button></li>
               <li><el-button type="primary" :loading="isWorking.export" @click="exportExcel" v-permissions="['business:visits:exportExcel']">导出</el-button></li>
           </ul>
            <el-table
                v-loading="isWorking.search"
                :data="tableData.list"
                stripe
                @selection-change="handleSelectionChange"
            >
                <el-table-column type="selection" width="55"></el-table-column>
                <el-table-column prop="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="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">
                    <template slot-scope="{row}">
                        <span>起:{{row.starttime}}</span><br/>
                        <span>止:{{row.endtime}}</span>
                    </template>
                </el-table-column>
                <el-table-column label="签到时间" min-width="170px">
                    <template slot-scope="{row}">
                        <div v-if="row.inDate && row.outDate">
                            <span>起:{{row.inDate}}</span><br/>
                            <span>止:{{row.outDate}}</span>
                        </div>
                        <span v-else>-</span>
                    </template>
                </el-table-column>
                <el-table-column label="施工人员" min-width="100px">
                    <template slot-scope="{row}">
                        <span v-if="row.type == 0">否</span>
                        <span v-if="row.type == 1">是</span>
                    </template>
                </el-table-column>
                <el-table-column label="随访车辆" min-width="100px">
                    <template slot-scope="{row}">
                        <span>{{row.carNos}}</span>
                    </template>
                </el-table-column>
                <el-table-column prop="status" fixed="right" label="状态" min-width="100px">
                    <template slot-scope="{row}">
                        <span style="color: rgba(245, 154, 35, 0.996);" v-if="row.status === 0">待提交审批</span>
                        <span v-if="row.status === 1" style="color: rgba(245, 154, 35, 0.996);">处理中</span>
                        <span v-if="row.status === 2" style="color: rgba(245, 154, 35, 0.996);">已同意</span>
                        <span style="color: gray;" v-if="row.status === 3" >已拒绝</span>
                        <span v-if="row.status === 4" style="color: gray">取消</span>
                        <span v-if="row.status === 5" style="color: green">下发成功</span>
                        <span v-if="row.status === 6" style="color: gray">下发失败</span>
                        <span v-if="row.status === 7" style="color: green">拜访中</span>
                        <span v-if="row.status === 8" style="color: red">已签离</span>
                      <span v-if="row.status === 9" style="color: gray">已失效</span>
                    </template>
                </el-table-column>
                <el-table-column
                    v-if="containPermissions(['business:visits:update', 'business:visits:delete'])"
                    label="操作"
                    min-width="200"
                    fixed="right"
                >
                    <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="resend(row.id)" v-permissions="['business:visits:update']" icon="el-icon-edit"   v-if="row.status == 6">重新下发</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>
            </el-table>
            <pagination
                @size-change="handleSizeChange"
                @current-change="handlePageChange"
                :pagination="tableData.pagination"
            >
            </pagination>
            <!--      è¯¦æƒ…      -->
            <!-- <OperaVisitsDesWindow ref="OperaVisitsDesWindow" /> -->
            <TaskDetail v-if="isShowDetail" ref="DetailRef" />
            <!-- æ–°å»º -->
            <OperaVisitsWindow @close="isShowEdit = false" @success="search"  v-if="isShowEdit" ref="operaVisitsWindowRef" />
        </template>
    </TableLayout>
  <TableLayout :permissions="['business:visits:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="姓名/手机号" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="身份证号" prop="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>
      <el-form-item label="审批状态" prop="status">
        <el-select v-model="searchForm.status" placeholder="请选择">
          <el-option label="待提交审批" value="0"></el-option>
          <el-option label="审批中" value="1"></el-option>
          <el-option label="审核通过" value="2"></el-option>
          <el-option label="审核不通过" value="3"></el-option>
          <el-option label="取消" value="4"></el-option>
          <el-option label="预约成功" value="5"></el-option>
          <el-option label="预约失败" value="6"></el-option>
          <el-option label="拜访中" value="7"></el-option>
          <el-option label="已签离" value="8"></el-option>
          <el-option label="已失效" value="9"></el-option>
        </el-select>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <!--                <el-button type="primary" :loading="isWorking.export" v-permissions="['business:visits:exportExcel']" @click="exportExcel">导出</el-button>-->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:visits:create', 'business:visits:exportExcel']">
        <li><el-button type="primary" @click="handleEdit()" icon="el-icon-plus"
            v-permissions="['business:visits:create']">新建</el-button></li>
        <li><el-button type="primary" :loading="isWorking.export" @click="exportExcel"
            v-permissions="['business:visits:exportExcel']">导出</el-button></li>
      </ul>
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="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="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">
          <template slot-scope="{row}">
            <span>起:{{ row.starttime }}</span><br />
            <span>止:{{ row.endtime }}</span>
          </template>
        </el-table-column>
        <el-table-column label="签到时间" min-width="170px">
          <template slot-scope="{row}">
            <div v-if="row.inDate && row.outDate">
              <span>起:{{ row.inDate }}</span><br />
              <span>止:{{ row.outDate }}</span>
            </div>
            <span v-else>-</span>
          </template>
        </el-table-column>
        <el-table-column label="施工人员" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type == 0">否</span>
            <span v-if="row.type == 1">是</span>
          </template>
        </el-table-column>
        <el-table-column label="随访车辆" min-width="100px">
          <template slot-scope="{row}">
            <span>{{ row.carNos }}</span>
          </template>
        </el-table-column>
        <el-table-column prop="status" fixed="right" label="状态" min-width="100px">
          <template slot-scope="{row}">
            <span style="color: rgba(245, 154, 35, 0.996);" v-if="row.status === 0">待提交审批</span>
            <span v-if="row.status === 1" style="color: rgba(245, 154, 35, 0.996);">处理中</span>
            <span v-if="row.status === 2" style="color: rgba(245, 154, 35, 0.996);">已同意</span>
            <span style="color: gray;" v-if="row.status === 3">已拒绝</span>
            <span v-if="row.status === 4" style="color: gray">取消</span>
            <span v-if="row.status === 5" style="color: green">下发成功</span>
            <span v-if="row.status === 6" style="color: gray">下发失败</span>
            <span v-if="row.status === 7" style="color: green">拜访中</span>
            <span v-if="row.status === 8" style="color: red">已签离</span>
            <span v-if="row.status === 9" style="color: gray">已失效</span>
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:visits:update', 'business:visits:delete'])" label="操作"
          min-width="200" fixed="right">
          <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="resend(row.id)" v-permissions="['business:visits:update']"
              icon="el-icon-edit" v-if="row.status == 6">重新下发</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>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
      <!--      è¯¦æƒ…      -->
      <!-- <OperaVisitsDesWindow ref="OperaVisitsDesWindow" /> -->
      <TaskDetail v-if="isShowDetail" ref="DetailRef" />
      <!-- æ–°å»º -->
      <OperaVisitsWindow @close="isShowEdit = false" @success="search" v-if="isShowEdit" ref="operaVisitsWindowRef" />
    </template>
  </TableLayout>
</template>
<script>
@@ -132,7 +124,7 @@
  name: 'Visits',
  extends: BaseTable,
  components: { TableLayout, Pagination, TaskDetail, OperaVisitsWindow },
  data () {
  data() {
    return {
      isShowEdit: false,
      isShowDetail: false,
@@ -146,7 +138,7 @@
      }
    }
  },
  created () {
  created() {
    this.config({
      module: '访客申请信息表',
      api: '/business/visits',
@@ -156,9 +148,9 @@
    this.search()
  },
  methods: {
    handleDetail (row) {
    handleDetail(row) {
      this.isShowDetail = true
      console.log('row', row);
      console.log('row', row)
      this.$nextTick(() => {
        this.$refs.DetailRef.id = row.id
        this.$refs.DetailRef.type = 0
@@ -166,19 +158,19 @@
        this.$refs.DetailRef.isShowModal = true
      })
    },
    handleEdit () {
    handleEdit() {
      this.isShowEdit = true
      this.$nextTick(() => {
        this.$refs.operaVisitsWindowRef.isShowModal = true
      })
    },
    departure (id) {
      this.$confirm('确定离场吗, æ˜¯å¦ç»§ç»­?', '提示', {
    departure(id) {
      this.$confirm('确定离厂吗, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
      level(id)
        level(id)
          .then(res => {
            this.page = 1
            this.getData()
@@ -187,13 +179,13 @@
      })
    },
    cancel (id) {
    cancel(id) {
      this.$confirm('确定取消预约吗, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
      visitCancel(id)
        visitCancel(id)
          .then(res => {
            this.page = 1
            this.getData()
@@ -202,7 +194,7 @@
      })
    },
    resend (id) {
    resend(id) {
      this.$confirm('确定尝试重新发起预约吗, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
admin/src/views/meeting/bookings.vue
@@ -1,36 +1,15 @@
<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"
          filterable
          clearable
          placeholder="请选择会议室"
        >
          <el-option
            v-for="item in rooms"
            :key="item.id"
            :value="item.id"
            :label="item.name"
          />
        <el-select v-model="searchForm.roomId" filterable clearable placeholder="请选择会议室">
          <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">
        <el-cascader
          v-model="searchForm.department"
          :options="department"
          :show-all-levels="false"
          clearable
          :props="props"
        ></el-cascader>
        <el-cascader v-model="searchForm.department" :options="department" :show-all-levels="false" clearable
          :props="props"></el-cascader>
        <!-- @change="handleChange" -->
        <!-- <el-select
          v-model="searchForm.departmentId"
@@ -42,52 +21,23 @@
        </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.meetingStatus"
          filterable
          clearable
          placeholder="请选择状态"
        >
          <el-option
            v-for="item in status"
            :key="item.id"
            :value="item.id"
            :label="item.name"
          />
        <el-select v-model="searchForm.meetingStatus" filterable clearable placeholder="请选择状态">
          <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">
        <el-date-picker
          v-model="date"
          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"
        ></el-date-picker>
        <el-date-picker v-model="date" 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"></el-date-picker>
        <!-- <el-date-picker v-model="searchForm.startTime" value-format="yyyy-MM-dd" placeholder="请输入开始时间" @change="search"/> -->
      </el-form-item>
      <el-radio-group
        v-model="searchForm.radio"
        size="small"
        @input="changeRadio"
      >
      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
@@ -102,73 +52,35 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul
        class="toolbar"
        v-permissions="[
          'business:bookings:create',
          'business:bookings:exportExcel',
        ]"
      >
      <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
          >
          <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
          >
          <el-button :loading="isWorking.export" v-permissions="['business:bookings:exportExcel']"
            @click="exportExcel">导出</el-button>
        </li>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        border
        @selection-change="handleSelectionChange"
      >
      <el-table v-loading="isWorking.search" :data="tableData.list" stripe border
        @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
        >
        <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
        >
        <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 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>
@@ -179,56 +91,34 @@
            <!-- {{ row.status==0 ? '正常' : '取消' }} -->
          </template>
        </el-table-column>
        <el-table-column
          prop="createDate"
          label="创建时间"
          align="center"
          min-width="150px"
        ></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',
            ])
          "
          label="操作"
          min-width="100"
          align="center"
          fixed="right"
        >
        <el-table-column v-if="
          containPermissions([
            'business:bookings:update',
            'business:bookings:delete',
          ])
        " label="操作" min-width="100" align="center" fixed="right">
          <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>
              <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" v-if="row.meetingStatus == '1'" @click="handleStart(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> -->
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaBookingsWindow
      ref="operaBookingsWindow"
      @success="handlePageChange"
    />
    <OperaBookingsDetailWindow
      @success="search"
      ref="operaBookingsDetailWindow"
    />
    <OperaBookingsWindow ref="operaBookingsWindow" @success="handlePageChange" />
    <OperaBookingsDetailWindow @success="search" ref="operaBookingsDetailWindow" />
  </TableLayout>
</template>
@@ -242,13 +132,13 @@
import { findList } from '@/api/meeting/rooms'
import { getSystemDictData } from '@/api/system/dictData'
import { fetchList } from '@/api/business/company'
import { cancelById, bookingsDetail } from '@/api/meeting/bookings'
import { cancelById, bookingsDetail, startEarlyById, startById } from '@/api/meeting/bookings'
import { timeForMat } from '@/utils/util'
export default {
  name: 'Bookings',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaBookingsWindow, OperaBookingsDetailWindow },
  data () {
  data() {
    return {
      date: [],
      // æœç´¢
@@ -290,12 +180,12 @@
      link: 'https://dmtest.ahapp.net/meeting_h5/' // H5_LINK_ADDR
    }
  },
  provide () {
  provide() {
    return {
      rooms: () => this.rooms
    }
  },
  created () {
  created() {
    this.config({
      module: '会议室预定信息表',
      api: '/meeting/bookings',
@@ -318,7 +208,7 @@
    this.changeRadio('0')
  },
  methods: {
    changeRadio (e) {
    changeRadio(e) {
      if (e === '0') {
        this.searchForm.startTime = timeForMat(0)[0]
        this.searchForm.endTime = timeForMat(0)[1]
@@ -334,7 +224,7 @@
      }
      this.search()
    },
    newTree (tree) {
    newTree(tree) {
      if (tree == null) {
        return []
      }
@@ -351,12 +241,12 @@
        return newItem
      })
    },
    selectDate (v) {
    selectDate(v) {
      this.searchForm.endTime = v[1] + ' 23:59:59'
      this.searchForm.startTime = v[0] + ' 00:00:00'
      this.searchForm.radio = null
    },
    reset () {
    reset() {
      this.$refs.searchForm.resetFields()
      this.date = []
      this.searchForm.radio = '0'
@@ -364,7 +254,7 @@
      this.searchForm.endTime = ''
      this.changeRadio('0')
    },
    copy (row) {
    copy(row) {
      const text = `${row.realName} é‚€è¯·æ‚¨åŠ å…¥ä¼šè®®\n会议主题:${row.name}\n会议室:${row.roomName}\n会议时间:${row.meetingTime}\n点击链接直接加入会议:\n${this.link}?id=${row.id}`
      this.$copyText(text)
        .then(() => {
@@ -373,7 +263,20 @@
        .catch(e => {
        })
    },
    cancelMeeting (id) {
    handleStart(row) {
      this.$dialog.messageWaring('开始会议', '是否开始当前会议?')
        .then(() => {
          let fn = new Date(row.startTime).getTime() > new Date().getTime() ? startEarlyById : startById
          fn({ id: row.id })
            .then(() => {
              this.$message.success('会议已开始')
              this.handlePageChange()
            })
            .catch(e => {
            })
        })
    },
    cancelMeeting(id) {
      this.$dialog.messageWaring('取消会议', '是否取消当前会议?')
        .then(() => {
          cancelById({ id })
@@ -385,7 +288,7 @@
            })
        })
    },
    showDetail (id) {
    showDetail(id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsDetailWindow.open('会议详情', res)
@@ -393,7 +296,7 @@
        .catch(e => {
        })
    },
    editBookings (id) {
    editBookings(id) {
      bookingsDetail(id)
        .then(res => {
          this.$refs.operaBookingsWindow.open('编辑会议预约', res)
@@ -401,7 +304,7 @@
        .catch(e => {
        })
    },
    handlePageChange (pageIndex) {
    handlePageChange(pageIndex) {
      this.__checkApi()
      this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex
      this.isWorking.search = true
@@ -433,24 +336,29 @@
<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;
    }
h5/api/meeting.js
@@ -95,3 +95,19 @@
    data
  })
}
// ä¼šè®®å®¤ å¼€å§‹
export const startMeetignById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/web/meeting/start',
    method: 'post',
    data
  })
}
// ä¼šè®®å®¤ æå‰å¼€å§‹
export const startEarlyMeetignById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/web/meeting/startEarly',
    method: 'post',
    data
  })
}
h5/manifest.json
@@ -91,7 +91,7 @@
            "proxy" : {
                "/admin_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    "target" : "http://192.168.137.1:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "target" : "http://172.20.10.7:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://192.168.31.42:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target" : "http://10.50.250.178:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ 
h5/pages/staff/meetingDetail.vue
@@ -76,9 +76,10 @@
    <view class="empty empty2"></view>
    <view class="main_footer" v-if="detail.meetingStatus == '1'">
      <view class="btn" @click="openCancel">撤回</view>
      <view class="btn agree" @click="handleEdit">修改</view>
      <view class="btn edit" @click="handleEdit">修改</view>
      <view class="btn agree" @click="handleStart">开始会议</view>
    </view>
    <view class="main_footer" v-if="detail.meetingStatus == '2'">
    <view class="main_footer" v-if="detail.meetingStatus == '2' && detail.isAdmin == 1">
      <view class="btn agree" @click="openClose">结束</view>
    </view>
    <!-- æ’¤å›ž -->
@@ -131,7 +132,7 @@
</template>
<script>
import { meetingDetail, cancelById, closeMeetignById } from '@/api'
import { meetingDetail, cancelById, closeMeetignById,startMeetignById,startEarlyMeetignById } from '@/api'
export default {
  data() {
    return {
@@ -171,7 +172,7 @@
          setTimeout(() => {
            uni.showToast({
              title: '提交成功',
              icon: 'success'
              icon: 'none'
            })
          })
          setTimeout(() => {
@@ -180,6 +181,23 @@
        }
      })
    },
        handleStart() {
            const { id, detail } = this
            let fn = new Date(detail.startTime).getTime() > new Date().getTime() ? startEarlyMeetignById : startMeetignById
            fn({ id }).then(res => {
              if (res.code === 200) {
                setTimeout(() => {
                  uni.showToast({
                    title: '会议已开始',
                    icon: 'none'
                  })
                })
                setTimeout(() => {
                  uni.navigateBack()
                })
              }
            })
        },
    handleEdit() {
      const { id } = this
      uni.navigateTo({
@@ -273,7 +291,7 @@
  background-color: #fff;
  padding: 0 30rpx;
  .btn {
    flex: 1;
    flex: 3;
    height: 88rpx;
    line-height: 88rpx;
    background: #ffffff;
@@ -283,8 +301,12 @@
    text-align: center;
    margin: 16rpx 8rpx;
  }
    .edit{
        color: $uni-color-primary;
        border: 1rpx solid $uni-color-primary;
    }
  .agree {
        flex: 5;
    background: $uni-color-primary;
    color: #fff;
    border: 1rpx solid $uni-color-primary;
h5/pages/staff/meetingSel.vue
@@ -1,378 +1,373 @@
<template>
  <view class="main_app" :class="{ popupShow: isShowSelMem }">
    <view class="search_inp df_ac">
      <image
        class="mr12 search"
        src="../../static/ic_search@2x.png"
        mode="widthFix"
      ></image>
      <input
        v-model="param.keyword"
        @blur="initData()"
        type="text"
        placeholder="搜索"
        placeholder-style="color: #999999;"
      />
    </view>
    <view class="member_list">
      <view v-for="(item, index) in memberList" :key="item.id" class="line">
        <image
          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" v-if="item.status == '1'">有会议</text>
          </view>
          <view class="depart">{{ item.departmentName }}</view>
        </view>
        <image
          @click="changeMem(item, index)"
          v-if="item.checked"
          src="@/static/checkbox_sel@2x.png"
          mode="widthFix"
          class="checked"
        ></image>
        <image
          @click="changeMem(item, index)"
          v-if="!item.checked"
          src="@/static/meeting/icon/ic_choose@2x.png"
          mode="widthFix"
          class="checked"
        ></image>
        <text></text>
      </view>
      <view class="empty"></view>
    </view>
    <!--  -->
    <view class="sub_wrap">
      <view class="sel_mem">
        <text>已选择:</text>
        <view class="members">
          <text v-for="(item, i) in selList" :key="i"
            >{{ item.realname }};</text
          >
        </view>
        <image
          @click="isShowSelMem = true"
          class="open_icon"
          src="../../static/staff/renyuan_ic_open.png"
          mode=""
        ></image>
      </view>
      <view class="btn" @click="onSubmit"
        >确认({{ selList.length }}/{{ param.limitNum }})</view
      >
    </view>
    <!--  -->
    <u-popup
      catchtouchmove
      :show="isShowSelMem"
      :round="12"
      mode="bottom"
      @close="closeModal"
    >
      <view class="modal">
        <view class="modal_header">
          <text class="status">已选择:{{ selList.length }}人</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
              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(i)">移除</view>
          </view>
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script>
import { userPagePost } from '@/api'
import dayjs from 'dayjs'
export default {
  data() {
    return {
      memberList: [],
      selList: [],
      param: {
        limitNum: ''
      },
      pagination: {
        page: 1,
        capacity: 20
      },
      isShowSelMem: false
    }
  },
  onLoad(option) {
    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)
      uni.navigateBack()
    },
    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
      // let arrTemp = arr.map(item => {
      //   let obj = {}
      //   this.memberList.forEach(ite => {
      //     if (item == ite.id) {
      //       obj.name = ite.name.split('-')[0]
      //       obj.componey = ite.name.split('-')[1] || ''
      //       obj.id = ite.id
      //     }
      //   })
      //   return obj
      // })
      // this.selList = arrTemp
      this.$forceUpdate()
    },
    initData() {
      const { param, pagination } = this
      userPagePost({
        model: { ...param },
        ...pagination,
      }).then(res => {
        this.memberList = res.data.records || []
        this.memberList.map(i => {
          i.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()
    },
  }
};
</script>
<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;
    }
    .btn {
      color: $uni-color-primary;
    }
  }
  .modal_mem_list {
    max-height: 860rpx;
    overflow: auto;
    .line {
      display: flex;
      align-items: center;
      border-bottom: 1rpx solid #e5e5e5;
      padding: 30rpx 0;
      .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;
      }
      .content {
        flex: 1;
        .depart {
          font-size: 24rpx;
          color: #666666;
        }
        .info {
          display: flex;
          margin-bottom: 16rpx;
          .name {
            font-size: 30rpx;
          }
        }
      }
      .btn {
        width: 80rpx;
        height: 48rpx;
        line-height: 48rpx;
        text-align: center;
        font-size: 24rpx;
        color: #333333;
        border-radius: 4rpx;
        border: 1rpx solid #999999;
      }
    }
  }
}
.sub_wrap {
  position: fixed;
  bottom: 0;
  background-color: #fff;
  left: 0;
  width: 100%;
  box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
  padding: 30rpx 30rpx 64rpx;
  .sel_mem {
    display: flex;
    align-items: center;
    .members {
      width: 500rpx;
      color: $uni-color-primary;
      white-space: nowrap;
      overflow: hidden; //文本超出隐藏
      text-overflow: ellipsis;
      margin-right: 20rpx;
    }
    .open_icon {
      width: 44rpx;
      height: 44rpx;
    }
  }
  .btn {
    width: 690rpx;
    height: 88rpx;
    line-height: 88rpx;
    background: $uni-color-primary;
    border-radius: 44rpx;
    color: #fff;
    text-align: center;
    margin-top: 22rpx;
  }
}
.member_list {
  .line {
    display: flex;
    align-items: center;
    border-bottom: 1rpx solid #e5e5e5;
    padding: 30rpx 0;
    .avatar {
      width: 64rpx;
      height: 64rpx;
      border-radius: 50%;
      overflow: hidden;
      margin-right: 20rpx;
    }
    .content {
      flex: 1;
      .depart {
        font-size: 24rpx;
        color: #666666;
      }
      .info {
        display: flex;
        margin-bottom: 16rpx;
        .name {
          font-size: 30rpx;
        }
        .tag {
          font-size: 24rpx;
          border-radius: 4rpx;
          border: 1rpx solid #f62710;
          color: #f62710;
          padding: 0rpx 6rpx;
          margin-left: 8rpx;
          display: flex;
          align-items: center;
        }
      }
    }
    .checked {
      width: 48rpx;
    }
  }
  .empty {
    width: 100%;
    height: 280rpx;
  }
}
.search_inp {
  height: 72rpx;
  background: #f7f7f7;
  border-radius: 4rpx;
  padding-left: 16rpx;
  .search {
    width: 28rpx;
  }
  input {
    flex: 1;
    font-size: 28rpx;
    color: #333333;
  }
}
</style>
<template>
    <view class="main_app" :class="{ popupShow: isShowSelMem }">
        <view class="search_inp df_ac">
            <image class="mr12 search" src="../../static/ic_search@2x.png" mode="widthFix"></image>
            <input v-model="param.keyword" @blur="initData()" type="text" placeholder="搜索"
                placeholder-style="color: #999999;" />
        </view>
        <view class="member_list">
            <view v-for="(item, index) in memberList" :key="item.id" class="line">
                <image 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" v-if="item.status == '1'">有会议</text>
                    </view>
                    <view class="depart">{{ item.departmentName }}</view>
                </view>
                <image @click="changeMem(item, index)" v-if="item.checked" src="@/static/checkbox_sel@2x.png" mode="widthFix"
                    class="checked"></image>
                <image @click="changeMem(item, index)" v-if="!item.checked" src="@/static/meeting/icon/ic_choose@2x.png"
                    mode="widthFix" class="checked"></image>
                <text></text>
            </view>
            <view class="empty"></view>
        </view>
        <!--  -->
        <view class="sub_wrap">
            <view class="sel_mem">
                <text>已选择:</text>
                <view class="members">
                    <text v-for="(item, i) in selList" :key="i">{{ item.realname }};</text>
                </view>
                <image @click="openSeleter" class="open_icon" src="../../static/staff/renyuan_ic_open.png" mode=""></image>
            </view>
            <view class="btn" @click="onSubmit">确认({{ selList.length }}/{{ param.limitNum }})</view>
        </view>
        <!--  -->
        <u-popup catchtouchmove :show="isShowSelMem" :round="12" mode="bottom" @close="closeModal">
            <view class="modal">
                <view class="modal_header">
                    <text class="status">已选择:{{ selList.filter(i => i.checkedTemp).length }}人</text>
                    <text class="btn" @click="subSelMem">确认</text>
                </view>
                <view class="modal_mem_list">
                    <template v-for="(item, i) in selList">
                        <view class="line" v-if="item.checkedTemp">
                            <image 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(i)">移除</view>
                        </view>
                    </template>
                </view>
            </view>
        </u-popup>
    </view>
</template>
<script>
    import {
        userPagePost
    } from '@/api'
    import dayjs from 'dayjs'
    export default {
        data() {
            return {
                memberList: [],
                selList: [],
                param: {
                    limitNum: ''
                },
                pagination: {
                    page: 1,
                    capacity: 20
                },
                isShowSelMem: false
            }
        },
        onLoad(option) {
            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)
                uni.navigateBack()
            },
            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)
                // //
                item.checked = !item.checked
                const i = this.selList.findIndex(a => a.id === item.id)
                if (item.checked && i === -1) {
                    this.selList.push(item)
                } else {
                    this.selList.splice(i, 1)
                }
                this.$forceUpdate()
            },
            openSeleter() {
                this.isShowSelMem = true
                this.selList.forEach(item => {
                    item.checkedTemp = true
                })
                this.$forceUpdate()
            },
            initData() {
                const {
                    param,
                    pagination
                } = this
                userPagePost({
                    model: {
                        ...param
                    },
                    ...pagination,
                }).then(res => {
                    this.memberList = res.data.records || []
                    this.memberList.forEach(i => {
                        const index = this.selList.findIndex(ite => ite.id === i.id)
                        i.checked = index > -1
                    })
                })
            },
            closeModal() {
                this.selList.forEach(item => {
                    item.checkedTemp = true
                })
                this.isShowSelMem = false
            },
            subSelMem() {
                const {
                    memberList
                } = this
                this.selList = this.selList.filter(i => i.checkedTemp)
                memberList.forEach(ite => {
                    const index = this.selList.findIndex(i => i.id === ite.id)
                    ite.checked = index > -1
                })
                this.isShowSelMem = false
                this.$forceUpdate()
            },
            handleRemove(i) {
                this.selList[i].checkedTemp = false
                this.$forceUpdate()
            },
        }
    };
</script>
<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;
            }
            .btn {
                color: $uni-color-primary;
            }
        }
        .modal_mem_list {
            max-height: 860rpx;
            overflow: auto;
            .line {
                display: flex;
                align-items: center;
                border-bottom: 1rpx solid #e5e5e5;
                padding: 30rpx 0;
                .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;
                }
                .content {
                    flex: 1;
                    .depart {
                        font-size: 24rpx;
                        color: #666666;
                    }
                    .info {
                        display: flex;
                        margin-bottom: 16rpx;
                        .name {
                            font-size: 30rpx;
                        }
                    }
                }
                .btn {
                    width: 80rpx;
                    height: 48rpx;
                    line-height: 48rpx;
                    text-align: center;
                    font-size: 24rpx;
                    color: #333333;
                    border-radius: 4rpx;
                    border: 1rpx solid #999999;
                }
            }
        }
    }
    .sub_wrap {
        position: fixed;
        bottom: 0;
        background-color: #fff;
        left: 0;
        width: 100%;
        box-shadow: 0rpx 0rpx 6rpx 0rpx #b2b2b2;
        padding: 30rpx 30rpx 64rpx;
        .sel_mem {
            display: flex;
            align-items: center;
            .members {
                width: 500rpx;
                color: $uni-color-primary;
                white-space: nowrap;
                overflow: hidden; //文本超出隐藏
                text-overflow: ellipsis;
                margin-right: 20rpx;
            }
            .open_icon {
                width: 44rpx;
                height: 44rpx;
            }
        }
        .btn {
            width: 690rpx;
            height: 88rpx;
            line-height: 88rpx;
            background: $uni-color-primary;
            border-radius: 44rpx;
            color: #fff;
            text-align: center;
            margin-top: 22rpx;
        }
    }
    .member_list {
        .line {
            display: flex;
            align-items: center;
            border-bottom: 1rpx solid #e5e5e5;
            padding: 30rpx 0;
            .avatar {
                width: 64rpx;
                height: 64rpx;
                border-radius: 50%;
                overflow: hidden;
                margin-right: 20rpx;
            }
            .content {
                flex: 1;
                .depart {
                    font-size: 24rpx;
                    color: #666666;
                }
                .info {
                    display: flex;
                    margin-bottom: 16rpx;
                    .name {
                        font-size: 30rpx;
                    }
                    .tag {
                        font-size: 24rpx;
                        border-radius: 4rpx;
                        border: 1rpx solid #f62710;
                        color: #f62710;
                        padding: 0rpx 6rpx;
                        margin-left: 8rpx;
                        display: flex;
                        align-items: center;
                    }
                }
            }
            .checked {
                width: 48rpx;
            }
        }
        .empty {
            width: 100%;
            height: 280rpx;
        }
    }
    .search_inp {
        height: 72rpx;
        background: #f7f7f7;
        border-radius: 4rpx;
        padding-left: 16rpx;
        .search {
            width: 28rpx;
        }
        input {
            flex: 1;
            font-size: 28rpx;
            color: #333333;
        }
    }
</style>
h5/pages/staff/memberSel.vue
@@ -17,15 +17,8 @@
    <view class="member_list">
      <checkbox-group @change="changeMem">
        <view v-for="item in memberList" :key="item.id" class="line">
          <image
            :src="
              item.faceImgFull
                ? item.faceImgFull
                : require('@/static/default_avatar.png')
            "
            class="avatar"
            mode=""
          ></image>
          <image v-if="item.faceImgFull" :src="item.faceImgFull" class="avatar" ></image>
          <span v-else class="img_name">{{item.name && item.name.slice(0,1)}}</span>
          <view class="content">
            <view class="info">
              <text class="name">{{ item.name }}</text>
@@ -234,6 +227,18 @@
      overflow: hidden;
      margin-right: 20rpx;
    }
        .img_name{
            width: 64rpx;
            height: 64rpx;
            line-height: 64rpx;
            text-align: center;
            border-radius: 50%;
            overflow: hidden;
            margin-right: 20rpx;
            background: $uni-color-primary;
            color: #fff;
            border: 1rpx solid $uni-color-primary;
        }
    .content {
      flex: 1;
      .depart {
h5/pages/staff/task/vDangetAppr.vue
@@ -12,7 +12,7 @@
                <view class="img_wrap" v-for="item in info.submitFileList" :key="item.id">
                    <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="video" controls />
                    <video v-if="item.type == 1" :src="item.fileurlFull" class="video" :controls="false" />
                </view>
            </view>
            <view class="text_wrap">
@@ -28,8 +28,8 @@
        </view>
        <!--  -->
        <view class="emyty"></view>
        <view v-if="info.status == 1 || info.status == 2" class="module_list">
            <view class="flow_title">处理结果</view>
        <view v-if="info.status == 1 || info.status == 2" class="module_list">
            <view class="title">处理结果</view>
            <view class="item">
                <view class="label">处理结果</view>
                <view class="value primaryColor" :class="{ red: info.status == 2 }">{{ statusMap[info.status] }}</view>
@@ -39,7 +39,7 @@
                <view class="value">
                    <view class="adduser_list_item_ipt1_upload" v-for="(item, i) in info.dealBeforeFileList" :key="i">
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull"></video>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
            </view>
@@ -48,7 +48,7 @@
                <view class="value">
                    <view class="adduser_list_item_ipt1_upload" v-for="(item, i) in info.dealAfterFileList" :key="i">
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull"></video>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
            </view>
@@ -68,7 +68,7 @@
                            v-if="info.status == 1 || index < flowList.length - 1" />
                        <image src="@/static/staff/liucheng_fail@2x.png" class="status"
                            v-if="info.status == 2 && index == flowList.length - 1" />
                        <image v-if="item.avatar != null && item.avatar != ''" :src="item.avatar" class="img" alt="" />
                        <image v-if="item.avatar != null && item.avatar != ''" :src="item.avatar" class="img" alt="" />
                        <!-- <image v-else src="@/static/default_avatar.png" class="img" mode=""></image> -->
                        <span v-if="item.avatar == null || item.avatar == ''"
                            class="img_name">{{ item.createUserName && item.createUserName.slice(0, 1) }}</span>
@@ -76,7 +76,7 @@
                    <view class="content">
                        <view class="head">
                            <view class="event">{{ item.title }}</view>
                            <view class="time">{{ item.createDate }}</view>
                            <view class="time" v-if="item.createDate">{{ item.createDate.slice(0,16) }}</view>
                        </view>
                        <view class="line">
                            <view class="company">
@@ -97,9 +97,11 @@
        </view>
        <view class="emyty"></view>
        <view class="main_footer">
            <view  v-if="info.status==0&& info.checkUserId == userInfo.memberId" class="btn" @click="handleBack">退回</view>
            <view v-if="info.status==0 && info.checkUserId == userInfo.memberId" class="btn transfer" @click="handleTransfer">转交</view>
            <view v-if="info.status==0&& info.checkUserId == userInfo.memberId" class="btn handle" @click="handleOpen">处理</view>
            <view v-if="info.status==0&& info.checkUserId == userInfo.memberId" class="btn" @click="handleBack">退回</view>
            <view v-if="info.status==0 && info.checkUserId == userInfo.memberId" class="btn transfer" @click="handleTransfer">
                è½¬äº¤</view>
            <view v-if="info.status==0&& info.checkUserId == userInfo.memberId" class="btn handle" @click="handleOpen">处理
            </view>
        </view>
        <!-- é€€å›ž -->
@@ -128,7 +130,7 @@
                        <u-icon class="close" size="20" name="close-circle-fill" color="red"
                            @click="fileDel('dealBeforeFileList', i)"></u-icon>
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull"></video>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
                <view class="label">退回说明</view>
@@ -168,7 +170,7 @@
                        <u-icon class="close" size="20" name="close-circle-fill" color="red"
                            @click="fileDel('dealBeforeFileList', i)"></u-icon>
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull"></video>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
                <view class="label">
@@ -184,7 +186,7 @@
                        <u-icon class="close" size="20" name="close-circle-fill" color="red"
                            @click="fileDel('dealAfterFileList', i)"></u-icon>
                        <image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
                        <video v-if="item.type == 1" :src="item.fileurlFull"></video>
                        <video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
                    </view>
                </view>
                <view class="label">整改说明</view>
@@ -226,8 +228,8 @@
                <view class="member_list">
                    <view class="mt24 placeholder6">共{{ memberList.length }}条数据</view>
                    <view v-for="item in memberList" :key="item.id" class="line">
                        <image :src="item.faceImgFull ? item.faceImgFull : require('@/static/meeting/common/default_user@2x.png')"
                            class="avatar" mode=""></image>
                        <image v-if="item.faceImgFull" :src="item.faceImgFull" class="avatar"></image>
                        <span v-else class="img_name">{{item.name && item.name.slice(0,1)}}</span>
                        <view class="content">
                            <view class="info">
                                <text class="name">{{ item.name }}</text>
@@ -235,10 +237,9 @@
                            </view>
                            <view class="depart">{{ item.companyName }}</view>
                        </view>
                        <image @click="changeMem(item)" v-if="transferParam.id == item.id"
                            src="@/static/checkbox_sel@2x.png" mode="widthFix" class="checked"></image>
                        <image @click="changeMem(item)" v-else src="@/static/video@2x.png" mode="widthFix"
                            class="checked"></image>
                        <image @click="changeMem(item)" v-if="transferParam.id == item.id" src="@/static/checkbox_sel@2x.png"
                            mode="widthFix" class="checked"></image>
                        <image @click="changeMem(item)" v-else src="@/static/video@2x.png" mode="widthFix" class="checked"></image>
                        <text></text>
                    </view>
                    <view class="empty"></view>
@@ -250,7 +251,8 @@
            </view>
        </u-popup>
        <!-- é€€å›žæ—¶é—´ -->
        <u-datetime-picker :show="isShowBackDate" @confirm="confirmBackDate" @cancel="isShowBackDate = false"
        <u-datetime-picker :show="isShowBackDate" :minDate="new Date().getTime()" :closeOnClickOverlay="false"
            @confirm="confirmBackDate" @close="isShowBackDate = false" @cancel="isShowBackDate = false"
            mode="datetime"></u-datetime-picker>
        <u-datetime-picker :minDate="new Date().getTime()" :show="isShowHandleDate" @confirm="confirmHandleDate"
@@ -273,7 +275,7 @@
            return {
                isShowBack: false,
                param: {},
                info: {},
                info: {},
                userInfo: this.$store.state.userInfo,
                flowList: [],
@@ -341,14 +343,14 @@
            },
            handleOpen() {
                this.isShowHandle = true;
                const submitFileList = this.info.submitFileList || []
                const submitFileList = this.info.submitFileList || []
                this.submitFileList = [...submitFileList];
                this.$set(this.handleParam, 'dealTime', dayjs().format('YYYY-MM-DD HH:mm:ss'));
            },
            handleBack() {
                this.isShowBack = true;
                this.isShowBack = true;
                // const submitFileList = this.info.submitFileList || []
                // this.submitFileList = [...submitFileList];
                // this.submitFileList = [...submitFileList];
                this.dealBeforeFileList = []
                this.$set(this.backParam, 'dealTime', dayjs().format('YYYY-MM-DD HH:mm:ss'));
            },
@@ -435,10 +437,8 @@
            },
            getMemList() {
                findHiddenAreaMemberList({
                    model: {
                        ...this.transferModel,
                        id: this.info.areaId
                    },
                    ...this.transferModel,
                    id: this.info.areaId,
                    ...this.pagination
                }).then(res => {
                    this.memberList = res.data || [];
@@ -748,21 +748,27 @@
        }
    };
</script>
<style>
<style lang="scss">
    page {
        background-color: #f7f7f7;
        ::v-deep .u-popup__content {
            border-top: 1rpx solid #cccccc;
        }
    }
</style>
<style lang="scss">
    .main_app {
        background-color: #fff;
        padding-bottom: 0;
        .flow_title {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            margin-bottom: 24rpx;
        .flow_title {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
            margin-bottom: 24rpx;
        }
        .flow_wrap {
            padding: 30rpx 0;
@@ -831,17 +837,19 @@
                            }
                        }
                        .line{
                            .company{
                                font-size: 26rpx;
                                color: #777777;
                            }
                            .status-green{
                                color: $uni-color-primary;
                            }
                            .status-red{
                                color: red;
                            }
                        .line {
                            .company {
                                font-size: 26rpx;
                                color: #777777;
                            }
                            .status-green {
                                color: $uni-color-primary;
                            }
                            .status-red {
                                color: red;
                            }
                        }
                        .remark {
@@ -920,10 +928,14 @@
            }
        }
        .module_list {
            .title{
        .module_list {
            .title {
                font-weight: 600;
                font-size: 32rpx;
                color: #222222;
                padding-top: 28rpx;
            }
            .item {
                padding: 30rpx 0;
                border-bottom: 1rpx solid #e5e5e5;
@@ -1012,7 +1024,8 @@
                }
                .video {
                    height: 160rpx;
                    width: 100%;
                    max-height: 100%;
                }
            }
@@ -1184,7 +1197,7 @@
                video {
                    width: 100%;
                    max-height: 120rpx;
                    height: 100%;
                }
            }
        }
@@ -1227,6 +1240,19 @@
                margin-right: 20rpx;
            }
            .img_name {
                width: 64rpx;
                height: 64rpx;
                line-height: 64rpx;
                text-align: center;
                border-radius: 50%;
                overflow: hidden;
                margin-right: 20rpx;
                background: $uni-color-primary;
                color: #fff;
                border: 1rpx solid $uni-color-primary;
            }
            .content {
                flex: 1;
h5_meeting/.hbuilderx/launch.json
@@ -4,6 +4,13 @@
        {
            "openVueDevtools" : false,
            "type" : "uni-app:h5"
        }
        },
    {
        "app-plus" :
        {
            "launchtype" : "local"
        },
        "type" : "uniCloud"
    }
    ]
}
h5_meeting/manifest.json
@@ -5,30 +5,6 @@
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
        "h5": {
                "router": {
                    "mode": "hash",
                    "base": "./"
                },
                // "base" : "/h5/"
                "devServer": {
                    "port": 8090,
                    "historyApiFallback": true,
                    "disableHostCheck": true,
                    "proxy": {
                        "/meetingAdmin": {
                            // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                            // "target" : "http://192.168.0.173/admin_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                            "target": "http://192.168.137.1:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                            "changeOrigin": true, // å…è®¸è·¨åŸŸ
                            "pathRewrite": {
                                "^/meetingAdmin": "" // é‡å†™åœ°å€ï¼Œå¦‚果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
                            }
                        }
                    },
                    "https": false
                }
            },
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
@@ -65,9 +41,13 @@
                ]
            },
            /* ios打包配置 */
            "ios" : {},
            "ios" : {
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {}
            "sdkConfigs" : {
                "ad" : {}
            }
        }
    },
    /* å¿«åº”用特有相关 */
h5_meeting/package-lock.json
@@ -2,130 +2,15 @@
  "requires": true,
  "lockfileVersion": 1,
  "dependencies": {
    "balanced-match": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
    },
    "brace-expansion": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
      "requires": {
        "balanced-match": "^1.0.0"
      }
    },
    "dayjs": {
      "version": "1.11.13"
      "version": "1.11.13",
      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
      "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
    },
    "decompress-response": {
      "version": "6.0.0",
      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
      "requires": {
        "mimic-response": "^3.1.0"
      }
    },
    "fs.realpath": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
    },
    "glob": {
      "version": "8.1.0",
      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
      "requires": {
        "fs.realpath": "^1.0.0",
        "inflight": "^1.0.4",
        "inherits": "2",
        "minimatch": "^5.0.1",
        "once": "^1.3.0"
      }
    },
    "inflight": {
      "version": "1.0.6",
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
      "requires": {
        "once": "^1.3.0",
        "wrappy": "1"
      }
    },
    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    },
    "js-binary-schema-parser": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/js-binary-schema-parser/-/js-binary-schema-parser-2.0.3.tgz",
      "integrity": "sha512-xezGJmOb4lk/M1ZZLTR/jaBHQ4gG/lqQnJqdIv4721DMggsa1bDVlHXNeHYogaIEHD9vCRv0fcL4hMA+Coarkg=="
    },
    "mimic-response": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
    },
    "minimatch": {
      "version": "5.1.6",
      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
      "requires": {
        "brace-expansion": "^2.0.1"
      }
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
      "requires": {
        "wrappy": "1"
      }
    },
    "parenthesis": {
      "version": "3.1.8",
      "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
      "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="
    },
    "simple-concat": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
    },
    "simple-get": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
      "requires": {
        "decompress-response": "^6.0.0",
        "once": "^1.3.1",
        "simple-concat": "^1.0.0"
      }
    },
    "string-split-by": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
      "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
      "requires": {
        "parenthesis": "^3.1.5"
      }
    },
    "vue-qr": {
      "version": "4.0.9",
      "resolved": "https://registry.npmjs.org/vue-qr/-/vue-qr-4.0.9.tgz",
      "integrity": "sha512-pAISV94T0MNEYA3NGjykUpsXRE2QfaNxlu9ZhEL6CERgqNc21hJYuP3hRVzAWfBQlgO18DPmZTbrFerJC3+Ikw==",
      "requires": {
        "glob": "^8.0.1",
        "js-binary-schema-parser": "^2.0.2",
        "simple-get": "^4.0.1",
        "string-split-by": "^1.0.0"
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    "uqrcodejs": {
      "version": "4.0.7",
      "resolved": "https://registry.npmjs.org/uqrcodejs/-/uqrcodejs-4.0.7.tgz",
      "integrity": "sha512-84+aZmD2godCVI+93lxE3YUAPNY8zAJvNA7xRS7R7U+q57KzMDepBSfNCwoRUhWOfR6eHFoAOcHRPwsP6ka1cA=="
    }
  }
}
h5_meeting/package.json
@@ -1,6 +1,6 @@
{
  "dependencies": {
    "dayjs": "^1.11.13",
    "vue-qr": "^4.0.9"
    "uqrcodejs": "^4.0.7"
  }
}
h5_meeting/pages/index/config.vue
@@ -11,7 +11,7 @@
            <view class="item">
                <view class="title">接口地址</view>
                <view class="line">
                    <input type="text" v-model="param.addr" />
                    <input type="text" v-model="param.baseUrl" />
                    <image src="../../static/icon/right.svg" class="icon"></image>
                </view>
            </view>
@@ -48,7 +48,9 @@
                    })
                })
                setTimeout(()=>{
                    uni.navigateBack()
                    uni.redirectTo({
                        url:'/pages/index/index'
                    })
                }, 400)
            }
        }
h5_meeting/pages/index/index.vue
@@ -28,7 +28,8 @@
                    <text>预约人:{{meetingInfo.bookingUser }}</text>
                </view>
            </view>
            <vueQr v-if="meetingInfo.id" :text="meetingInfo.id" class="qrcode" />
            <canvas id="qrcode" canvas-id="qrcode" class="qrcode"></canvas>
            <!-- <vueQr v-if="meetingInfo.id" :text="meetingInfo.id" class="qrcode" /> -->
        </view>
        <view class="meeting_wrap">
            <view class="title">今日会议({{ info.meetingListResponseList && info.meetingListResponseList.length > 0 ? info.meetingListResponseList.length : 0 }})</view>
@@ -63,12 +64,13 @@
<script>
    import dayjs from 'dayjs'
    import vueQr from 'vue-qr/src/packages/vue-qr.vue'
    // import vueQr from 'vue-qr/src/packages/vue-qr.vue'
    import UQRCode from 'uqrcodejs'
    import {
        meetScreenData
    } from '@/api/index.js'
    export default {
        components: {vueQr},
        // components: {vueQr},
        data() {
            return {
                time: '',
@@ -87,7 +89,7 @@
                meetingInfo: {}
            }
        },
        onLoad() {
        onShow() {
            this.initDatetime()
            this.param = uni.getStorageSync('param') || {}
            if (!this.param.code) {
@@ -96,6 +98,8 @@
                })
            }
            this.getData()
        },
        onReady() {
        },
        methods: {
            getData() {
@@ -105,9 +109,25 @@
                    this.info = res.data
                    if(this.info.meetingListResponseList && this.info.meetingListResponseList.length > 0){
                        this.meetingInfo = this.info.meetingListResponseList[0]
                        this.$forceUpdate()
                        this.qrcodeCreate()
                    }
                })
            },
            qrcodeCreate(){
                 // èŽ·å–uQRCode实例
                  var qr = new UQRCode();
                  // è®¾ç½®äºŒç»´ç å†…容
                  qr.data = "https://uqrcode.cn/doc";
                  // è®¾ç½®äºŒç»´ç å¤§å°ï¼Œå¿…须与canvas设置的宽高一致
                  qr.size = 83;
                  // è°ƒç”¨åˆ¶ä½œäºŒç»´ç æ–¹æ³•
                  qr.make();
                  // èŽ·å–canvas上下文
                  var canvasContext = uni.createCanvasContext('qrcode', this); // å¦‚果是组件,this必须传入
                  // è®¾ç½®uQRCode实例的canvas上下文
                  qr.canvasContext = canvasContext;
                  // è°ƒç”¨ç»˜åˆ¶æ–¹æ³•将二维码图案绘制到canvas上
                  qr.drawCanvas();
            },
            touchend() {
                this.touchNum++
@@ -169,7 +189,7 @@
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        padding-bottom: 35rpx;
        padding-bottom: 42rpx;
        color: #fff;
        overflow: hidden;
        .meeting_wrap {
@@ -260,8 +280,8 @@
            }
            .qrcode {
                width: 166rpx;
                height: 166rpx;
                width: 83px;
                height: 83px;
            }
        }
@@ -285,7 +305,7 @@
        }
        .header_wrap {
            padding: 34rpx 34rpx 0 0;
            padding: 42rpx 34rpx 0 0;
            display: flex;
            justify-content: space-between;
            align-items: center;
h5_meeting/unpackage/dist/cache/.vite/deps/_metadata.json
ÎļþÒÑɾ³ý
h5_meeting/unpackage/dist/cache/.vite/deps/dayjs.js
ÎļþÒÑɾ³ý
h5_meeting/unpackage/dist/cache/.vite/deps/dayjs.js.map
ÎļþÒÑɾ³ý
h5_meeting/unpackage/dist/cache/.vite/deps/package.json
ÎļþÒÑɾ³ý
h5_meeting/utils/config.js
@@ -1,6 +1,6 @@
export const baseUrl = 'meetingAdmin/'
// export const baseUrl = 'http://192.168.0.139:10010/admin_interface/'
// export const baseUrl = 'meetingAdmin/'
export const baseUrl = 'http://10.50.250.178:8088/gateway_interface/meetingAdmin/'
export const uploadAvatar = `${baseUrl}visitsAdmin/cloudService/web/public/uploadFtp.do`
export const uploadUrl = `${baseUrl}visitsAdmin/cloudService/public/uploadBatch`
h5_meeting/utils/service.js
@@ -12,8 +12,9 @@
                title: '加载中',
                mask: true
            })
            const param = uni.getStorageSync('param') || {}
            uni.request({
                url: baseUrl + options.url,
                url: param.baseUrl || baseUrl + options.url,
                data: options.data || {},
                method: options.method || 'GET',
                header: options.header || {