''
liukangdong
2024-06-04 356fbaf0baa43b22113ddcf40345e459bee0c2fb
''
已修改11个文件
2166 ■■■■■ 文件已修改
h5/api/meeting.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/staff.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingCalendar.vue 806 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingDetail.vue 404 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingManager.vue 301 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSubOrder.vue 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/memberSel.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/snapshot.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/index.vue 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACar.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACarDetail.vue 267 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/api/meeting.js
@@ -48,6 +48,13 @@
    data
  })
}
// 会议室 h5详情
export const getAppRoomDetail = (id) => {
  return http({
    url: 'meetingAdmin/cloudService/business/bookings/'+id,
    method: 'get'
  })
}
// 会议室 管理
export const myMeetingPage = (data) => {
  return http({
@@ -56,3 +63,27 @@
    data
  })
}
// 会议室 当月
export const monthMeetingPage = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/web/meeting/monthMeeting',
    method: 'get',
    data
  })
}
// 会议室 修改
export const updateById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/business/rooms/updateById',
    method: 'post',
    data
  })
}
// 会议室 撤回
export const cancelById = (data) => {
  return http({
    url: 'meetingAdmin/cloudService/business/meeting/reservationCancel',
    method: 'get',
    data
  })
}
h5/api/staff.js
@@ -149,4 +149,28 @@
    url: 'visitsAdmin/cloudService/business/carUseBook/'+id,
    method: 'get'
  })
}
// 查询车辆 派车记录 审批
export const carUseBookAppr = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/approve/approved',
    method: 'post',
    data
  })
}
// 查询车辆 派车记录 撤销申请
export const carUseBookBack = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/carUseBook/revoke',
    method: 'get',
    data
  })
}
// 查询车辆 司机列表
export const driveListPost = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/business/member/driveList',
    method: 'post',
    data
  })
}
h5/pages/staff/meetingCalendar.vue
@@ -1,379 +1,489 @@
<template>
    <view class="main_app">
        <view class="tabs">
            <view class="tab" :class="{ active: activeTab === '0' }" @click="tabClick('0')">
                <text class="name">会议日历</text>
                <view class="line"></view>
            </view>
            <view class="tab" :class="{ active: activeTab === '1' }" @click="tabClick('1')">
                <text class="name">预约记录</text>
                <view class="line"></view>
            </view>
        </view>
        <!--  -->
        <template v-if="activeTab == '0'">
            <!-- <uni-calendar @change="changeCalendar" :selected="selected" /> -->
            <!-- 日历 -->
            <view class="container_b">
                <Calendar
                    ref="Calendar"
                    :currentTime="currentTime1"
                    :mark="mark"
                    :showLunar="false"
                    @dayChange="dayChange"
                    @monthChange="monthChange"
                    :rangeMode="false"
                    :maskColor="'#ffffff'"
                    :dateStart="dateStart"
                    :dateEnd="dateEnd"
                    :canDrag="false"
                ></Calendar>
            </view>
            <!--  -->
            <view class="card_list">
                <view class="card_title">
                    <view class="name">
                        <view class="icon"></view>
                        <view class="text">今日会议</view>
                    </view>
                    <view class="meeting">
                        <view class="text mr24">全部会议室</view>
                        <u-icon name="arrow-down" size="12" color="#999999" />
                    </view>
                </view>
                <view class="list">
                    <view class="item">
                        <view class="head">
                            <view class="name">aaaaa选型</view>
                            <view class="status">即将开始</view>
                        </view>
                        <view class="line">
                            <view class="label">会议时间:</view>
                            <view class="value">12:00-12</view>
                        </view>
                        <view class="line">
                            <view class="label">会议室:</view>
                            <view class="value">202会议室</view>
                        </view>
                        <view class="line">
                            <view class="label">预约人:</view>
                            <view class="value">杨某某</view>
                        </view>
                        <view class="line">
                            <view class="label">备注:</view>
                            <view class="value">--</view>
                        </view>
                    </view>
                </view>
            </view>
        </template>
        <!--  -->
        <template v-if="activeTab === '1'">
            <view class="card_list">
                <view class="list">
                    <view class="item" v-for="item in recordList" :key="item.id" @click="handleDetail(item.id)">
                        <view class="head">
                            <view class="name">{{ item.meetingName }}</view>
                            <view class="status" v-if="item.meetingStatus == '1'">未开始</view>
                            <view class="status red" v-if="item.meetingStatus == '2'">进行中</view>
                            <view class="status" v-if="item.meetingStatus == '3'">已结束</view>
                            <view class="status padding" v-if="item.meetingStatus == '4'">即将开始</view>
                            <view class="status" v-if="item.meetingStatus == '5'">已撤销</view>
                        </view>
                        <view class="line">
                            <view class="label">会议时间:</view>
                            <view class="value">{{ item.meetingTime     }}</view>
                        </view>
                        <view class="line">
                            <view class="label">会议室:</view>
                            <view class="value">{{ item.roomName }}</view>
                        </view>
                        <view class="line">
                            <view class="label">预约人:</view>
                            <view class="value">{{ item.bookingUser }}</view>
                        </view>
                        <view class="line">
                            <view class="label">备注:</view>
                            <view class="value">{{ item.remark }}</view>
                        </view>
                    </view>
                </view>
            </view>
        </template>
    </view>
  <view class="main_app">
    <view class="tabs">
      <view
        class="tab"
        :class="{ active: activeTab === '0' }"
        @click="tabClick('0')"
      >
        <text class="name">会议日历</text>
        <view class="line"></view>
      </view>
      <view
        class="tab"
        :class="{ active: activeTab === '1' }"
        @click="tabClick('1')"
      >
        <text class="name">预约记录</text>
        <view class="line"></view>
      </view>
    </view>
    <!--  -->
    <template v-if="activeTab == '0'">
      <!-- <uni-calendar @change="changeCalendar" :selected="selected" /> -->
      <!-- 日历 -->
      <view class="container_b">
        <Calendar
          ref="Calendar"
          :currentTime="currentDate"
          :mark="monthMark"
          :showLunar="false"
          @dayChange="dayChange"
          @monthChange="monthChange"
          :rangeMode="false"
          :maskColor="'#ffffff'"
          :dateStart="dateStart"
          :dateEnd="dateEnd"
          :canDrag="false"
        ></Calendar>
      </view>
      <!--  -->
      <view class="card_list">
        <view class="card_title">
          <view class="name">
            <view class="icon"></view>
            <view class="text">今日会议</view>
          </view>
          <view class="meeting">
            <view class="text mr24" @click="isShowStatus = true">{{
              activeRoom.name
            }}</view>
            <u-icon name="arrow-down" size="12" color="#999999" />
          </view>
        </view>
        <view class="list">
          <view
            @click="handleDetail(item.id)"
            class="item"
            v-for="item in myMeetingList"
            :key="item.id"
          >
            <view class="head">
              <view class="name">{{ item.meetingName }}</view>
              <view class="status" v-if="item.meetingStatus == '1'"
                >未开始</view
              >
              <view class="status red" v-if="item.meetingStatus == '2'"
                >进行中</view
              >
              <view class="status" v-if="item.meetingStatus == '3'"
                >已结束</view
              >
              <view class="status padding" v-if="item.meetingStatus == '4'"
                >即将开始</view
              >
              <view class="status" v-if="item.meetingStatus == '5'"
                >已撤销</view
              >
            </view>
            <view class="line">
              <view class="label">会议时间:</view>
              <view class="value">{{ item.meetingTime }}</view>
            </view>
            <view class="line">
              <view class="label">会议室:</view>
              <view class="value">{{ item.roomName }}</view>
            </view>
            <view class="line">
              <view class="label">预约人:</view>
              <view class="value">{{ item.bookingUser }}</view>
            </view>
            <view class="line">
              <view class="label">备注:</view>
              <view class="value">{{ item.remark || item.meetingRemark }}</view>
            </view>
          </view>
        </view>
      </view>
    </template>
    <!--  -->
    <template v-if="activeTab === '1'">
      <view class="card_list">
        <view class="list">
          <view
            class="item"
            v-for="item in recordList"
            :key="item.id"
            @click="handleDetail(item.id)"
          >
            <view class="head">
              <view class="name">{{ item.meetingName }}</view>
              <view class="status" v-if="item.meetingStatus == '1'"
                >未开始</view
              >
              <view class="status red" v-if="item.meetingStatus == '2'"
                >进行中</view
              >
              <view class="status" v-if="item.meetingStatus == '3'"
                >已结束</view
              >
              <view class="status padding" v-if="item.meetingStatus == '4'"
                >即将开始</view
              >
              <view class="status" v-if="item.meetingStatus == '5'"
                >已撤销</view
              >
            </view>
            <view class="line">
              <view class="label">会议时间:</view>
              <view class="value">{{ item.meetingTime }}</view>
            </view>
            <view class="line">
              <view class="label">会议室:</view>
              <view class="value">{{ item.roomName }}</view>
            </view>
            <view class="line">
              <view class="label">预约人:</view>
              <view class="value">{{ item.bookingUser }}</view>
            </view>
            <view class="line">
              <view class="label">备注:</view>
              <view class="value">{{ item.remark || item.meetingRemark }}</view>
            </view>
          </view>
        </view>
      </view>
    </template>
    <u-picker
      keyName="name"
      :show="isShowStatus"
      :columns="meetingList"
      @confirm="seletedStatus"
      @cancel="isShowStatus = false"
    ></u-picker>
  </view>
</template>
<script>
import Calendar from '@/components/Li-Calendar/Li-Calendar.vue';
import { getDay } from '@/utils/utils.js';
import { myMeetingPage } from '@/api'
import Calendar from '@/components/Li-Calendar/Li-Calendar.vue'
import dayja from 'dayjs'
import { myMeetingPage, monthMeetingPage, roomsListPost } from '@/api'
function getDate(date, AddDayCount = 0) {
    if (!date) {
        date = new Date();
    }
    if (typeof date !== 'object') {
        date = date.replace(/-/g, '/');
    }
    const dd = new Date(date);
  if (!date) {
    date = new Date()
  }
  if (typeof date !== 'object') {
    date = date.replace(/-/g, '/')
  }
  const dd = new Date(date)
    dd.setDate(dd.getDate() + AddDayCount); // 获取AddDayCount天后的日期
  dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
    const y = dd.getFullYear();
    const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1; // 获取当前月份的日期,不足10补0
    const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate(); // 获取当前几号,不足10补0
    return {
        fullDate: y + '-' + m + '-' + d,
        year: y,
        month: m,
        date: d,
        day: dd.getDay()
    };
  const y = dd.getFullYear()
  const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
  const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
  return {
    fullDate: y + '-' + m + '-' + d,
    year: y,
    month: m,
    date: d,
    day: dd.getDay()
  }
}
export default {
    components: {
        Calendar
    },
    data() {
        return {
            activeTab: '0',
            recordList: [],
            recordPage: 1,
            currentTime1: '',
            dateStart: '1999-05-01',
            dateEnd: '2999-06-15',
            mark: [],
            selected: [
                {
                    date: getDate(new Date(), -3).fullDate
                    // info: '打卡'
                },
                {
                    date: getDate(new Date(), -2).fullDate,
                    // info: '签到',
                    data: {
                        custom: '自定义信息',
                        name: '自定义消息头'
                    }
                },
                {
                    date: getDate(new Date(), -1).fullDate,
                    info: '已打卡'
                }
            ],
  components: {
    Calendar
  },
  data() {
    return {
      activeTab: '0',
      recordList: [],
      recordPage: 1,
      myPage: 1,
      myMeetingList: [],
      currentDate: '',
      dateStart: '1999-05-01',
      dateEnd: '2999-06-15',
      monthMark: [],
        };
      isShowStatus: false,
      activeRoom: {
        name: '全部会议室',
        id: ''
      },
      meetingList: [],
    }
  },
  onLoad() {
    this.currentDate = dayja().format('YYYY-MM-DD')
    this.initData()
    this.getRoomList()
  },
    onShow() {
        this.tabClick('0')
    },
    methods: {
        tabClick(val) {
            this.activeTab = val;
            if(val === '1'){
                this.getRecordList()
            }else{
                this.getList()
            }
        },
        handleDetail(id) {
            uni.navigateTo({
                url: `/pages/staff/meetingDetail?id=${id}`,
                // url: `/pages/staff/meetingDetail`
            });
        },
        changeCalendar(e) {
            console.log(e);
        },
        // 点击某天
        dayChange(data) {
            console.log(data);
            let date = data.time;
            let yyyy = data.time.substring(0, 4);
            let mm = Number(data.time.substring(data.time.indexOf('-') + 1, data.time.lastIndexOf('-')));
            let dd = Number(data.time.substring(data.time.lastIndexOf('-') + 1, data.time.length));
            mm = mm < 10 ? `0${mm}` : mm;
            dd = dd < 10 ? `0${dd}` : dd;
            let riqi = `${yyyy}-${mm}-${dd}`;
            this.currentTime = riqi;
            this.list = [];
            this.next = false;
            this.page = 0;
            // this.getRoomList()
        },
        // 下一月
        monthChange(data) {
            let date = data.date.replace(/[/]/g, '-');
            let yyyy = date.substring(0, 4);
            let mm = Number(date.substring(date.indexOf('-') + 1, date.lastIndexOf('-')));
            let dd = Number(date.substring(date.lastIndexOf('-') + 1, date.length));
            mm = mm < 10 ? `0${mm}` : mm;
            dd = dd < 10 ? `0${dd}` : dd;
            let riqi = `${yyyy}-${mm}-${dd}`;
            console.log('日期', riqi);
            this.currentTime1 = riqi;
            // this.getDateNum()
        },
        getList(){},
        getRecordList() {
            const { activeStatus } = this
  onReachBottom() {
    const { activeTab } = this
    if (activeTab == '0') {
      this.myPage = this.myPage + 1
      this.getDayMeeting()
    } else {
      this.recordPage = this.recordPage + 1
      this.getRecordList()
    }
  },
  methods: {
    initData() {
      // 当月数据
      monthMeetingPage({
        yearMonth: this.currentDate.slice(0, 7)
      }).then(res => {
        this.monthMark = res.data.filter(i => i.meetingNum > 0).map(j => {
          return {
            time: j.monthDate,
            pointText: j.meetingNum,
            pointTextColor: 'red'
          }
        })
      })
    },
        getRoomList() {
      roomsListPost({}).then(res => {
        this.meetingList = [[{ id: '', name: '全部会议室' }, ...res.data]]
                console.log('meetingList', this.meetingList);
      })
    },
    tabClick(val) {
      this.activeTab = val
      if (val === '1') {
        this.recordPage = 1
        this.getRecordList()
      } else {
        this.myMeetingList = []
        this.activeRoom = {
          name: '全部会议室',
          id: ''
        }
        this.myPage = 1
        this.getDayMeeting()
      }
    },
    seletedStatus(e) {
            this.myMeetingList = []
      this.activeRoom = { ...e.value[0] }
      this.isShowStatus = false
      this.getDayMeeting()
    },
    handleDetail(id) {
      uni.navigateTo({
        url: `/pages/staff/meetingDetail?id=${id}`,
        // url: `/pages/staff/meetingDetail`
      })
    },
    changeCalendar(e) {
      console.log(e)
    },
    // 点击某天
    dayChange(data) {
      let date = data.time
      let yyyy = data.time.substring(0, 4)
      let mm = Number(data.time.substring(data.time.indexOf('-') + 1, data.time.lastIndexOf('-')))
      let dd = Number(data.time.substring(data.time.lastIndexOf('-') + 1, data.time.length))
      mm = mm < 10 ? `0${mm}` : mm
      dd = dd < 10 ? `0${dd}` : dd
      let riqi = `${yyyy}-${mm}-${dd}`
      this.currentDate = riqi
      this.myMeetingList = []
      this.activeStatus = {
        name: '全部会议室',
        key: ''
      }
      this.myPage = 1
      this.getDayMeeting()
    },
    // 下一月
    monthChange(data) {
      let date = data.date.replace(/[/]/g, '-')
      let yyyy = date.substring(0, 4)
      let mm = Number(date.substring(date.indexOf('-') + 1, date.lastIndexOf('-')))
      let dd = Number(date.substring(date.lastIndexOf('-') + 1, date.length))
      mm = mm < 10 ? `0${mm}` : mm
      dd = dd < 10 ? `0${dd}` : dd
      let riqi = `${yyyy}-${mm}-${dd}`
      console.log('日期', riqi)
      this.currentDate = riqi
      this.initData()
    },
    getRecordList() {
      const { activeStatus } = this
      myMeetingPage({
        capacity: 10,
        page: this.recordPage,
        model: {
                    // status: activeStatus.key || null,
          // status: activeStatus.key || null,
          // roomsId: this.roomId,
          queryType: 2
        }
      }).then(res => {
                this.recordList = res.data.records
            })
        this.recordList = [...this.recordList, ...res.data.records]
      })
    },
    }
    getDayMeeting() {
      const { myPage, activeRoom, currentDate } = this
      // 当天我参与的会议
      myMeetingPage({
        model: {
          queryType: '1',
          roomsId: activeRoom.id,
          queryDate: currentDate
        },
        page: myPage,
        capacity: 10
      }).then(res => {
        this.myMeetingList = [ ...this.myMeetingList, ...res.data.records ]
      })
    },
  }
};
</script>
<style lang="scss">
page {
    background-color: #f7f7f7;
  background-color: #f7f7f7;
}
.main_app {
    padding: 0;
    background-color: #f7f7f7;
    ::v-deep .uni-calendar-item--checked {
        background-color: $uni-color-primary;
        border-radius: 8rpx;
    }
    ::v-deep .uni-calendar-item--isDay-text {
        color: $uni-color-primary;
    }
    ::v-deep .uni-calendar-item--isDay {
        background-color: $uni-color-primary;
        color: #fff;
        border-radius: 8rpx;
    }
    .tabs {
        display: flex;
        background-color: #fff;
        .tab {
            flex: 1;
            height: 88rpx;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 28rpx;
            color: #666666;
            position: relative;
            .line {
                width: 60rpx;
                height: 4rpx;
                background: #fff;
                border-radius: 3rpx;
                position: absolute;
                bottom: 0;
                left: 50%;
                transform: translate(-50%, 0);
            }
        }
        .active {
            font-weight: 500;
            font-size: 30rpx;
            color: #222222;
            .line {
                background-color: $uni-color-primary;
            }
        }
    }
    //
    .card_list {
        padding: 30rpx;
        .card_title {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 22rpx;
            .name {
                display: flex;
                align-items: center;
                .icon {
                    width: 6rpx;
                    height: 32rpx;
                    background: $uni-color-primary;
                    border-radius: 4rpx;
                    margin-right: 16rpx;
                }
                .text {
                    font-weight: 600;
                    font-size: 32rpx;
                    color: #222222;
                }
            }
            .meeting {
                display: flex;
                height: 52rpx;
                line-height: 52rpx;
                background: #ffffff;
                border-radius: 26rpx;
                border: 2rpx solid #eeeeee;
                padding: 0 24rpx;
                .text {
                    font-size: 24rpx;
                    color: #333333;
                }
            }
        }
        .list {
            .item {
                padding: 0rpx 30rpx 30rpx;
                background: #ffffff;
                border-radius: 8rpx;
                margin-bottom: 24rpx;
                .head {
                    display: flex;
                    justify-content: space-between;
                    align-items: center;
                    border-bottom: 1rpx solid #e5e5e5;
                    padding: 22rpx 0;
                    margin-bottom: 22rpx;
                    .name {
                        font-weight: 600;
                        font-size: 32rpx;
                        color: #222222;
                    }
                    .status {
                        height: 38rpx;
                        line-height: 38rpx;
                        padding: 0 16rpx;
                        border-radius: 4rpx;
                        border: 1rpx solid #999999;
                        font-size: 22rpx;
                        color: #999999;
                    }
                    .padding{
                        color: $uni-color-primary;
                        border: 1rpx solid $uni-color-primary;
                    }
                    .red{
                        color: #e23f29;
                        border: 1rpx solid #e23f29;
                    }
                }
                .line {
                    display: flex;
                    margin-bottom: 12rpx;
                    .label {
                        width: 140rpx;
                        color: #666666;
                    }
                    .value {
                        flex: 1;
                    }
                }
            }
        }
    }
  padding: 0;
  background-color: #f7f7f7;
  ::v-deep .uni-calendar-item--checked {
    background-color: $uni-color-primary;
    border-radius: 8rpx;
  }
  ::v-deep .uni-calendar-item--isDay-text {
    color: $uni-color-primary;
  }
  ::v-deep .uni-calendar-item--isDay {
    background-color: $uni-color-primary;
    color: #fff;
    border-radius: 8rpx;
  }
  .tabs {
    display: flex;
    background-color: #fff;
    .tab {
      flex: 1;
      height: 88rpx;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 28rpx;
      color: #666666;
      position: relative;
      .line {
        width: 60rpx;
        height: 4rpx;
        background: #fff;
        border-radius: 3rpx;
        position: absolute;
        bottom: 0;
        left: 50%;
        transform: translate(-50%, 0);
      }
    }
    .active {
      font-weight: 500;
      font-size: 30rpx;
      color: #222222;
      .line {
        background-color: $uni-color-primary;
      }
    }
  }
  //
  .card_list {
    padding: 30rpx;
    .card_title {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 22rpx;
      .name {
        display: flex;
        align-items: center;
        .icon {
          width: 6rpx;
          height: 32rpx;
          background: $uni-color-primary;
          border-radius: 4rpx;
          margin-right: 16rpx;
        }
        .text {
          font-weight: 600;
          font-size: 32rpx;
          color: #222222;
        }
      }
      .meeting {
        display: flex;
        height: 52rpx;
        line-height: 52rpx;
        background: #ffffff;
        border-radius: 26rpx;
        border: 2rpx solid #eeeeee;
        padding: 0 24rpx;
        .text {
          font-size: 24rpx;
          color: #333333;
        }
      }
    }
    .list {
      .item {
        padding: 0rpx 30rpx 30rpx;
        background: #ffffff;
        border-radius: 8rpx;
        margin-bottom: 24rpx;
        .head {
          display: flex;
          justify-content: space-between;
          align-items: center;
          border-bottom: 1rpx solid #e5e5e5;
          padding: 22rpx 0;
          margin-bottom: 22rpx;
          .name {
            font-weight: 600;
            font-size: 32rpx;
            color: #222222;
          }
          .status {
            height: 38rpx;
            line-height: 38rpx;
            padding: 0 16rpx;
            border-radius: 4rpx;
            border: 1rpx solid #999999;
            font-size: 22rpx;
            color: #999999;
          }
          .padding {
            color: $uni-color-primary;
            border: 1rpx solid $uni-color-primary;
          }
          .red {
            color: #e23f29;
            border: 1rpx solid #e23f29;
          }
        }
        .line {
          display: flex;
          margin-bottom: 12rpx;
          .label {
            width: 140rpx;
            color: #666666;
          }
          .value {
            flex: 1;
          }
        }
      }
    }
  }
}
.container_b {
    width: 100%;
    padding: 30rpx;
    background: #ffffff;
    padding-top: 20rpx;
    box-sizing: border-box;
  width: 100%;
  padding: 30rpx;
  background: #ffffff;
  padding-top: 20rpx;
  box-sizing: border-box;
}
</style>
h5/pages/staff/meetingDetail.vue
@@ -1,180 +1,244 @@
<template>
    <view class="main_app">
        <view class="head_app">
            <view class="title">讨论智能会议室系统选型</view>
            <view class="text">201会议室|2023年5月4日 10:00-12:00</view>
        </view>
        <!--  -->
        <view class="empty"></view>
        <view class="module_list">
            <view class="item">
                <view class="label">会议内容</view>
                <view class="value">
                    <!-- <text>主要讨论智能会议室系统选型,请大家一定要按时来开会,时间宝贵。感谢大家!</text> -->
                    <u-textarea border="none" v-model="param.aaa" count :maxlength="300" placeholder="请输入会议内容" placeholder-class="placeholder9"     />
                </view>
            </view>
            <view class="item">
                <view class="label">参会人员</view>
                <view class="value">
                    <view class="personnel">
                        <view class="per_item" v-for="i in 10">
                            <image src="../../static/logo@2x.png" class="avatar" mode=""></image>
                            <view class="name">胡八一</view>
                        </view>
                    </view>
                </view>
            </view>
            <view class="item">
                <view class="label">服务项</view>
                <view class="value">席卡 |  投影仪 |  笔记本电脑</view>
            </view>
            <view class="item">
                <view class="label">备注</view>
                <view class="value">今天人多,请按时参加</view>
            </view>
            <view class="item">
                <view class="label">预约人</view>
                <view class="value">行政部 赵强 18832319899</view>
            </view>
        </view>
        <view class="empty empty2"></view>
        <view class="main_footer">
            <view class="btn" @click="handleSub('0')">撤回</view>
            <view class="btn agree" @click="handleSub('1')">修改</view>
        </view>
    </view>
  <view class="main_app">
    <view class="head_app">
      <view class="title">{{ detail.meetingName }}</view>
      <view class="text"
        >{{ detail.roomName }}|{{ detail.meetingDate }}
        {{ detail.meetingTime }}</view
      >
    </view>
    <!--  -->
    <view class="empty"></view>
    <view class="module_list">
      <view class="item">
        <view class="label">会议内容</view>
        <view class="value">
          <!-- <text>主要讨论智能会议室系统选型,请大家一定要按时来开会,时间宝贵。感谢大家!</text> -->
          <u-textarea
            border="none"
            v-model="detail.meetingContent"
            disabled
            :maxlength="300"
            placeholder="请输入会议内容"
            placeholder-class="placeholder9"
          />
        </view>
      </view>
      <view class="item">
        <view class="label">参会人员</view>
        <view class="value">
          <view class="personnel">
            <view
              class="per_item"
              v-for="mem in detail.userResponseList"
              :key="mem.id"
            >
              <image :src="mem.avatar" class="avatar" mode=""></image>
              <view class="name">{{ mem.realname }}</view>
            </view>
          </view>
        </view>
      </view>
      <view class="item">
        <view class="label">服务项</view>
        <view class="value">
          <template v-for="(ser, serI) in detail.projectsResponseList">
            <text :key="ser.id">{{ ser.name }}</text>
            <text
              :key="ser.id"
              class="mr12 ml12"
              v-if="serI != detail.projectsResponseList.length - 1"
            >
              |
            </text>
          </template>
        </view>
      </view>
      <view class="item">
        <view class="label">备注</view>
        <view class="value">{{ detail.remark || detail.meetingRemark }}</view>
      </view>
      <view class="item">
        <view class="label">预约人</view>
        <view class="value"
          >{{ detail.bookingUser.companyName || "" }}
          {{ detail.bookingUser.realname }}
          {{ detail.bookingUser.mobile }}</view
        >
      </view>
    </view>
    <view class="empty empty2"></view>
    <view class="main_footer" v-if="detail.meetingStatus == '1'">
      <view class="btn" @click="handleCancel(detail.id)">撤回</view>
      <view class="btn agree" @click="handleEdit">修改</view>
    </view>
    <view class="main_footer" v-if="detail.meetingStatus == '2'">
      <view class="btn agree" @click="handleSub('2')">结束</view>
    </view>
  </view>
</template>
<script>
import { meetingDetail } from '@/api'
    export default {
        data() {
            return {
                param: {},
                detail: {}
            };
        },
        onLoad(option) {
            this.id = option.id
            this.getDetail()
        },
        methods: {
            getDetail() {
                const { id } = this
                meetingDetail({id}).then(res => {
                    this.detail = res.data
                })
            },
            handleSub() {
            }
        }
    }
import { meetingDetail, cancelById } from '@/api'
export default {
  data() {
    return {
      param: {},
      detail: {},
      id: ''
    }
  },
  onLoad(option) {
    this.id = option.id
    this.getDetail()
  },
  methods: {
    getDetail() {
      const { id } = this
      meetingDetail({ id }).then(res => {
        this.detail = res.data
      })
    },
    handleCancel(id) {
      uni.showModal({
        title: '提示',
        // confirmText: '确认',
        content: '确认撤回该会议吗',
        success: function (res) {
          if (res.confirm) {
            cancelById({ id }).then(res => {
              if (res.code === 200) {
                setTimeout(() => {
                  uni.showToast({
                    title: '撤回成功',
                    icon: 'success'
                  })
                })
                setTimeout(() => {
                  uni.navigateBack()
                })
              }
            })
          }
        }
      })
    },
    handleEdit() {
      const { id } = this
      uni.navigateTo({
        url: `/pages/staff/meetingSubOrder?id=${id}`
      })
    },
    handleSub() {
    }
  }
}
</script>
<style lang="scss">
    page{
        background-color: #f7f7f7;
    }
    .main_app{
        padding: 0 ;
        .head_app{
            padding: 30rpx;
            background-color: #fff;
            .title{
                font-weight: 600;
                font-size: 36rpx;
                color: #222222;
                margin-bottom: 30rpx;
            }
            .text{
                font-size: 28rpx;
                color: #666666;
            }
        }
    }
    .module_list {
        background-color: #fff;
        padding: 0 30rpx;
        .item {
            padding: 30rpx 0;
            border-bottom: 1rpx solid #E5E5E5;
            .label {
                font-size: 26rpx;
                color: #666666;
                margin-bottom: 20rpx;
            }
            .value {
                font-size: 30rpx;
                display: flex;
                align-items: center;
                ::v-deep textarea{
                    padding: 0;
                    background-color: #fff !important;
                }
                .personnel{
                    display: flex;
                    width: 100%;
                    overflow-x: auto;
                    .per_item{
                        flex-shrink: 0;
                            display: flex;
                            flex-direction: column;
                            justify-content: center;
                            align-items: center;
                            margin-right: 24rpx;
                            .avatar{
                                width: 72rpx;
                                height: 72rpx;
                                border-radius: 50%;
                            }
                            .name{
                                font-size: 26rpx;
                                color: #777777;
                            }
                    }
                }
            }
        }
    }
    .main_footer {
        padding-bottom: 64rpx;
        display: flex;
        justify-content: space-between;
        position: fixed;
        bottom: 0;
        left: 0;
        width: 100%;
        background-color: #fff;
        padding: 0 30rpx;
        .btn {
            width: 336rpx;
            height: 88rpx;
            line-height: 88rpx;
            background: #FFFFFF;
            border-radius: 44rpx;
            border: 1rpx solid #999999;
            font-size: 32rpx;
            text-align: center;
            margin: 16rpx 0;
        }
        .agree {
            background: $uni-color-primary;
            color: #fff;
            border: 1rpx solid $uni-color-primary;
        }
    }
.empty{
    width: 750rpx;
        height: 20rpx;
        background-color: #f7f7f7;
        margin: 0 -30rpx;
page {
  background-color: #f7f7f7;
}
.empty2{
    height: 280rpx !important;
.main_app {
  padding: 0;
  .head_app {
    padding: 30rpx;
    background-color: #fff;
    .title {
      font-weight: 600;
      font-size: 36rpx;
      color: #222222;
      margin-bottom: 30rpx;
    }
    .text {
      font-size: 28rpx;
      color: #666666;
    }
  }
}
.module_list {
  background-color: #fff;
  padding: 0 30rpx;
  .item {
    padding: 30rpx 0;
    border-bottom: 1rpx solid #e5e5e5;
    .label {
      font-size: 26rpx;
      color: #666666;
      margin-bottom: 20rpx;
    }
    .value {
      font-size: 30rpx;
      display: flex;
      align-items: center;
      ::v-deep textarea {
        padding: 0;
        background-color: #fff !important;
      }
      .personnel {
        display: flex;
        width: 100%;
        overflow-x: auto;
        .per_item {
          flex-shrink: 0;
          display: flex;
          flex-direction: column;
          justify-content: center;
          align-items: center;
          margin-right: 24rpx;
          .avatar {
            width: 72rpx;
            height: 72rpx;
            border-radius: 50%;
          }
          .name {
            font-size: 26rpx;
            color: #777777;
          }
        }
      }
    }
  }
}
.main_footer {
  padding-bottom: 64rpx;
  display: flex;
  justify-content: space-between;
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  background-color: #fff;
  padding: 0 30rpx;
  .btn {
    flex: 1;
    height: 88rpx;
    line-height: 88rpx;
    background: #ffffff;
    border-radius: 44rpx;
    border: 1rpx solid #999999;
    font-size: 32rpx;
    text-align: center;
    margin: 16rpx 8rpx;
  }
  .agree {
    background: $uni-color-primary;
    color: #fff;
    border: 1rpx solid $uni-color-primary;
  }
}
.empty {
  width: 750rpx;
  height: 20rpx;
  background-color: #f7f7f7;
  margin: 0 -30rpx;
}
.empty2 {
  height: 280rpx !important;
}
</style>
h5/pages/staff/meetingManager.vue
@@ -1,66 +1,87 @@
<template>
  <view class="main_app">
    <!--  -->
    <!-- <uni-calendar @change="changeCalendar" :selected="selected" /> -->
    <!-- 日历 -->
    <view class="container_b">
      <Calendar
        ref="Calendar"
        :currentTime="currentDate"
        :mark="mark"
        :showLunar="false"
        @dayChange="dayChange"
        @monthChange="monthChange"
        :rangeMode="false"
        :maskColor="'#ffffff'"
        :dateStart="dateStart"
        :dateEnd="dateEnd"
        :canDrag="false"
      ></Calendar>
    </view>
    <!--  -->
    <view class="card_list">
      <view class="card_title">
        <view class="name">
          <view class="icon"></view>
          <view class="text">今日会议</view>
        </view>
        <view class="meeting" @click="isShowStatus = true">
          <view class="text mr24">{{ activeStatus.name }}</view>
          <u-icon name="arrow-down" size="12" color="#999999" />
        </view>
    <template>
      <!-- <uni-calendar @change="changeCalendar" :selected="selected" /> -->
      <!-- 日历 -->
      <view class="container_b">
        <Calendar
          ref="Calendar"
          :currentTime="currentDate"
          :mark="monthMark"
          :showLunar="false"
          @dayChange="dayChange"
          @monthChange="monthChange"
          :rangeMode="false"
          :maskColor="'#ffffff'"
          :dateStart="dateStart"
          :dateEnd="dateEnd"
          :canDrag="false"
        ></Calendar>
      </view>
      <view class="list">
        <view class="item">
          <view class="head">
            <view class="name">aaaaa选型</view>
            <view class="status">即将开始</view>
      <!--  -->
      <view class="card_list">
        <view class="card_title">
          <view class="name">
            <view class="icon"></view>
            <view class="text">今日会议</view>
          </view>
          <view class="line">
            <view class="label">会议时间:</view>
            <view class="value">12:00-12</view>
          <view class="meeting">
            <view class="text mr24" @click="isShowStatus = true">{{
              activeRoom.name
            }}</view>
            <u-icon name="arrow-down" size="12" color="#999999" />
          </view>
          <view class="line">
            <view class="label">会议室:</view>
            <view class="value">202会议室</view>
          </view>
          <view class="line">
            <view class="label">预约人:</view>
            <view class="value">杨某某</view>
          </view>
          <view class="line">
            <view class="label">备注:</view>
            <view class="value">--</view>
        </view>
        <view class="list">
          <view
            @click="handleDetail(item.id)"
            class="item"
            v-for="item in myMeetingList"
            :key="item.id"
          >
            <view class="head">
              <view class="name">{{ item.meetingName }}</view>
              <view class="status" v-if="item.meetingStatus == '1'"
                >未开始</view
              >
              <view class="status red" v-if="item.meetingStatus == '2'"
                >进行中</view
              >
              <view class="status" v-if="item.meetingStatus == '3'"
                >已结束</view
              >
              <view class="status padding" v-if="item.meetingStatus == '4'"
                >即将开始</view
              >
              <view class="status" v-if="item.meetingStatus == '5'"
                >已撤销</view
              >
            </view>
            <view class="line">
              <view class="label">会议时间:</view>
              <view class="value">{{ item.meetingTime }}</view>
            </view>
            <view class="line">
              <view class="label">会议室:</view>
              <view class="value">{{ item.roomName }}</view>
            </view>
            <view class="line">
              <view class="label">预约人:</view>
              <view class="value">{{ item.bookingUser }}</view>
            </view>
            <view class="line">
              <view class="label">备注:</view>
              <view class="value">{{ item.remark || item.meetingRemark }}</view>
            </view>
          </view>
        </view>
      </view>
    </view>
    </template>
    <!--  -->
        <u-picker
    <u-picker
      keyName="name"
      :show="isShowStatus"
      :columns="statusList"
      :columns="meetingList"
      @confirm="seletedStatus"
      @cancel="isShowStatus = false"
    ></u-picker>
@@ -69,70 +90,100 @@
<script>
import Calendar from '@/components/Li-Calendar/Li-Calendar.vue'
import dayjs from 'dayjs'
import { myMeetingPage } from '@/api'
import dayja from 'dayjs'
import { myMeetingPage, monthMeetingPage, roomsListPost } from '@/api'
function getDate(date, AddDayCount = 0) {
  if (!date) {
    date = new Date()
  }
  if (typeof date !== 'object') {
    date = date.replace(/-/g, '/')
  }
  const dd = new Date(date)
  dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
  const y = dd.getFullYear()
  const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
  const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
  return {
    fullDate: y + '-' + m + '-' + d,
    year: y,
    month: m,
    date: d,
    day: dd.getDay()
  }
}
export default {
  components: {
    Calendar
  },
  data() {
    return {
      activeTab: '0',
      recordList: [],
      recordPage: 1,
      myPage: 1,
      myMeetingList: [],
      currentDate: '',
      dateStart: '2024-01-01',
      dateStart: '1999-05-01',
      dateEnd: '2999-06-15',
            mark: [
                {
                    time: '2024-05-30'
                },
                {
                    time: '2024-05-22',
                    pointText: 'aaa',
                    pointTextColor: '#fff'
                },
                {
                    time: '2024-05-28',
                    text: ['111','222'],
                    pointTextColor: '#fff'
                }
            ],
            activeStatus: {
                name: '全部会议室'
            },
            isShowStatus: false,
            statusList: [[
                { name: '全部会议室', key: '' },
                { name: '未开始', key: '1' },
                { name: '已结束', key: '2' },
            ]],
            dataList: [],
            page: 1
      monthMark: [],
      isShowStatus: false,
      activeRoom: {
        name: '全部会议室',
        id: ''
      },
      meetingList: [],
    }
  },
  onLoad() {
        this.currentDate = dayjs().format('YYYY-MM-DD')
        this.getList()
    this.currentDate = dayja().format('YYYY-MM-DD')
    this.initData()
    this.getRoomList()
  },
    onShow() {
        this.myPage = 1
    this.myMeetingList = []
    this.getDayMeeting()
    },
  onReachBottom() {
    this.myPage = this.myPage + 1
      this.getDayMeeting()
  },
  methods: {
    getList() {
            const { activeStatus } = this
      myMeetingPage({
        capacity: 10,
        page: this.page,
        model: {
          queryDate: this.currentDate,
                    status: activeStatus.key || null,
          // roomsId: this.roomId,
          queryType: 2
        }
    initData() {
      // 当月数据
      monthMeetingPage({
        yearMonth: this.currentDate.slice(0, 7)
      }).then(res => {
                this.dataList = res.data.records
            })
        this.monthMark = res.data.filter(i => i.meetingNum > 0).map(j => {
          return {
            time: j.monthDate,
            pointText: j.meetingNum,
            pointTextColor: 'red'
          }
        })
      })
    },
    handleDetail(item) {
        getRoomList() {
      roomsListPost({}).then(res => {
        this.meetingList = [[{ id: '', name: '全部会议室' }, ...res.data]]
                console.log('meetingList', this.meetingList);
      })
    },
    seletedStatus(e) {
            this.myMeetingList = []
      this.activeRoom = { ...e.value[0] }
      this.isShowStatus = false
      this.getDayMeeting()
    },
    handleDetail(id) {
      uni.navigateTo({
        // url: `/pages/staff/meetingDetail?id=${item.id}`,
        url: `/pages/staff/meetingDetail`
        url: `/pages/staff/meetingDetail?id=${id}`,
        // url: `/pages/staff/meetingDetail`
      })
    },
    changeCalendar(e) {
@@ -140,7 +191,6 @@
    },
    // 点击某天
    dayChange(data) {
      console.log(data)
      let date = data.time
      let yyyy = data.time.substring(0, 4)
      let mm = Number(data.time.substring(data.time.indexOf('-') + 1, data.time.lastIndexOf('-')))
@@ -148,11 +198,14 @@
      mm = mm < 10 ? `0${mm}` : mm
      dd = dd < 10 ? `0${dd}` : dd
      let riqi = `${yyyy}-${mm}-${dd}`
      this.currentTime = riqi
      this.list = []
      this.next = false
      this.page = 0
      // this.getRoomList()
      this.currentDate = riqi
      this.myMeetingList = []
      this.activeStatus = {
        name: '全部会议室',
        key: ''
      }
      this.myPage = 1
      this.getDayMeeting()
    },
    // 下一月
    monthChange(data) {
@@ -164,14 +217,25 @@
      dd = dd < 10 ? `0${dd}` : dd
      let riqi = `${yyyy}-${mm}-${dd}`
      console.log('日期', riqi)
      this.currentTime1 = riqi
      // this.getDateNum()
      this.currentDate = riqi
      this.initData()
    },
        seletedStatus(e) {
            this.activeStatus = { ...e.value[0] }
            this.isShowStatus = false
            this.getList()
        },
    getDayMeeting() {
      const { myPage, activeRoom, currentDate } = this
      // 当天我参与的会议
      myMeetingPage({
        model: {
          queryType: '1',
          roomsId: activeRoom.id,
          queryDate: currentDate
        },
        page: myPage,
        capacity: 10
      }).then(res => {
        this.myMeetingList = [ ...this.myMeetingList, ...res.data.records ]
      })
    },
  }
};
</script>
@@ -190,10 +254,6 @@
  ::v-deep .uni-calendar-item--isDay-text {
    color: $uni-color-primary;
  }
    ::v-deep .calendar-point {
    /* background-color: $uni-color-primary; */
  }
  ::v-deep .uni-calendar-item--isDay {
    background-color: $uni-color-primary;
    color: #fff;
@@ -274,6 +334,7 @@
        padding: 0rpx 30rpx 30rpx;
        background: #ffffff;
        border-radius: 8rpx;
        margin-bottom: 24rpx;
        .head {
          display: flex;
          justify-content: space-between;
@@ -295,6 +356,14 @@
            font-size: 22rpx;
            color: #999999;
          }
          .padding {
            color: $uni-color-primary;
            border: 1rpx solid $uni-color-primary;
          }
          .red {
            color: #e23f29;
            border: 1rpx solid #e23f29;
          }
        }
        .line {
          display: flex;
h5/pages/staff/meetingSubOrder.vue
@@ -5,7 +5,9 @@
        <view class="name">会议时间</view>
        <view class="line">
          <view class="label">
            {{ param.activeDate }} {{ param.startTime }}-{{ param.endTime }}
            {{ param.activeDate || param.meetingDate }}
            <text class="ml12" v-if="!param.id">{{ param.startTime }}-{{ param.endTime }}</text>
            <text class="ml12" v-if="param.id">{{ param.meetingTime }}</text>
          </view>
          <u-icon name="arrow-right" color="#999999" size="14" />
        </view>
@@ -60,8 +62,8 @@
        <view class="line" @click="selPeople">
          <view class="label">
            <text v-if="param.sysList && param.sysList.length > 0">
                            {{ param.sysList.map(i=>i.realname).join(',') }}
                        </text>
              {{ param.sysList.map((i) => i.realname).join(",") }}
            </text>
            <text
              v-else
              class="placeholder9"
@@ -83,10 +85,10 @@
          <view class="label">
            <view
              class="service_item"
                            :class="{active: item.checked}"
              :class="{ active: item.checked }"
              v-for="(item, index) in info.projectList"
              :key="index"
                            @click="serviceClick(item)"
              @click="serviceClick(item)"
            >
              {{ item.projectName }}
            </view>
@@ -108,7 +110,8 @@
        </view>
      </view>
      <view class="sub_btn" @click="onSubmit"> 确认预约 </view>
      <view v-if="param.id" class="sub_btn" @click="onUpdate">确认修改</view>
      <view v-else class="sub_btn" @click="onSubmit"> 确认预约 </view>
    </view>
  </view>
</template>
@@ -116,7 +119,10 @@
<script>
import {
  reservationMeeting,
  getRoomDetail
  getRoomDetail,
  meetingDetail,
  updateById,
  getAppRoomDetail
} from '@/api'
import dayjs from 'dayjs'
export default {
@@ -124,23 +130,30 @@
    return {
      param: {},
      userInfo: uni.getStorageSync('userInfo'),
            info: {},
      info: {},
    }
  },
  onLoad(option) {
    this.param = { ...option }
    const bookingTimeList = option.bookingTimeList.split(',').map(i => {
      return {
        timeId: Number(i)
      }
    })
    this.$set(this.param, 'bookingTimeList', bookingTimeList)
    this.$set(this.param, 'activeDate', dayjs(option.yudingDate).format('YYYY年M月D日'))
        this.initOption()
    if (option.id) {
      uni.setNavigationBarTitle({
        title: '会议详情'
      })
      this.getDetail(option.id)
    } else {
      this.param = { ...option }
      const bookingTimeList = option.bookingTimeList.split(',').map(i => {
        return {
          timeId: Number(i)
        }
      })
      this.$set(this.param, 'bookingTimeList', bookingTimeList)
      this.$set(this.param, 'activeDate', dayjs(option.yudingDate).format('YYYY年M月D日'))
      this.initOption()
    }
  },
    mounted() {
  mounted() {
    this.$eventBus.$on('meetingPeo', (res) => {
      this.$set(this.param, 'sysList', res.map(i=>{
      this.$set(this.param, 'sysList', res.map(i => {
        i.userId = i.id
        return i
      }))
@@ -149,61 +162,109 @@
    })
  },
  methods: {
        onSubmit() {
            const { param, info } = this
            if (!param.name) return uni.showToast({
    getDetail(id) {
      meetingDetail({ id }).then(res => {
        this.param = { ...res.data,name: res.data.meetingName, content: res.data.meetingContent, sysList: res.data.userResponseList }
        // this.param = { ...res.data }
        if(this.param.sysList && this.param.sysList.length > 0){
          this.param.sysList.forEach(i => {
            i.userId = i.id
          })
        }
        getRoomDetail({ roomId: res.data.roomId }).then(ress => {
          this.info = ress.data
          if (this.info && this.info.projectList) {
            this.info.projectList.forEach(i => {
              i.checked = false
              if(res.data.projectsResponseList && res.data.projectsResponseList.length > 0){
                res.data.projectsResponseList.forEach(item2 => {
                  if(i.projectId === item2.id){
                    i.checked = true
                  }
                })
              }
            })
          }
        })
      })
    },
    onUpdate() {
      const { param, info } = this
      if (!param.name) return uni.showToast({
        title: '请输入会议主题',
        icon: 'none'
      })
            reservationMeeting({
                ...param,
                startTime: `${param.yudingDate} ${param.startTime}:00`,
                endTime: `${param.yudingDate} ${param.endTime}:00`,
                projectList: info.projectList.filter(i => i.checked),
            }).then(res => {
                if(res.code === 200){
                    setTimeout(() => {
                        uni.showToast({
                            title: '预约成功',
                            icon:'success',
                            duration: 2000
                        })
                    })
          uni.redirectTo({
              url: '/pages/staff/index'
      reservationMeeting({
        ...param,
        projectList: info.projectList.filter(i => i.checked),
      }).then(res => {
        if (res.code === 200) {
          setTimeout(() => {
            uni.showToast({
              title: '修改成功',
              icon: 'success',
              duration: 2000
            })
          })
                }
            })
        },
          uni.redirectTo({
            url: '/pages/staff/index'
          })
        }
      })
    },
    onSubmit() {
      const { param, info } = this
      if (!param.name) return uni.showToast({
        title: '请输入会议主题',
        icon: 'none'
      })
      reservationMeeting({
        ...param,
        startTime: `${param.yudingDate} ${param.startTime}:00`,
        endTime: `${param.yudingDate} ${param.endTime}:00`,
        projectList: info.projectList.filter(i => i.checked),
      }).then(res => {
        if (res.code === 200) {
          setTimeout(() => {
            uni.showToast({
              title: '预约成功',
              icon: 'success',
              duration: 2000
            })
          })
          uni.redirectTo({
            url: '/pages/staff/index'
          })
        }
      })
    },
    selPeople() {
            const { param } = this
            let startTime = param.yudingDate + ' ' + param.startTime
            let endTime = param.yudingDate + ' ' + param.endTime
      const { param } = this
      let startTime = param.yudingDate + ' ' + param.startTime
      let endTime = param.yudingDate + ' ' + param.endTime
      uni.navigateTo({
        url: `/pages/staff/meetingSel?startTime=${startTime}&endTime=${endTime}`
      })
    },
        serviceClick(item) {
            const { info } = this
            info.projectList.forEach(ite => {
                if(ite.projectId === item.projectId){
                    ite.checked = !ite.checked
                }
            })
            this.$forceUpdate()
        },
    serviceClick(item) {
      const { info } = this
      info.projectList.forEach(ite => {
        if (ite.projectId === item.projectId) {
          ite.checked = !ite.checked
        }
      })
      this.$forceUpdate()
    },
    initOption() {
            const roomId = Number(this.param.roomId)
      const roomId = Number(this.param.roomId)
      getRoomDetail({ roomId }).then(res => {
        res.data.projectList.forEach(item => {
          item.active = false
        })
        this.info = res.data
                if(this.info && this.info.projectList){
                    this.info.projectList.forEach(i => {
                        i.checked = false
                    })
                }
        if (this.info && this.info.projectList) {
          this.info.projectList.forEach(i => {
            i.checked = false
          })
        }
      })
    }
  }
@@ -233,10 +294,10 @@
          padding: 0 24rpx;
          margin-right: 20rpx;
        }
                .active{
                    background-color: #4d99a8;
                    color: #fff;
                }
        .active {
          background-color: #4d99a8;
          color: #fff;
        }
      }
    }
  }
h5/pages/staff/memberSel.vue
@@ -116,10 +116,8 @@
            console.log( e.detail.value[0]);
            const id = Number(e.detail.value[0])
            const item = this.memberList.find(i => i.id === id)
            console.log('item', item);
            uni.navigateTo({
                url: `/pages/staff/snapshot?id=${item.id}&name=${item.name}`
            })
      this.$eventBus.$emit('snapshotSel', item)
            uni.navigateBack()
    },
    initData() {
      const { param } = this
h5/pages/staff/snapshot.vue
@@ -55,23 +55,32 @@
            class="adduser_list_item_ipt1_upload"
            v-for="(item, i) in submitFileList"
            :key="i"
            ><image :src="item.fileurlFull" mode="widthFix"></image
            ><image
              v-if="item.type == 0"
              :src="item.fileurlFull"
              mode="widthFix"
            ></image
            ><video
              v-if="item.type == 1"
              :src="item.fileurlFull"
            ></video
          ></view>
        </view>
      </view>
      <view class="empty"></view>
       <view class="upload_line" style="padding: 15px 0 0;">
        <view class="name" style="margin-bottom: 10rpx;">
          <text style="color: #e42d2d;">*</text>
      <view class="upload_line" style="padding: 15px 0 0">
        <view class="name" style="margin-bottom: 10rpx">
          <text style="color: #e42d2d">*</text>
          <text>情况说明</text>
        </view>
        <view class="value"
          ><textarea
        <view class="value">
          <textarea
            placeholder="请详细描述现场情况,不少于10个字"
            minlength="10"
            v-model="param.content"
            placeholder-style="color: #999999;"
        /></view>
          />
        </view>
      </view>
      <view class="empty"></view>
      <view class="line">
@@ -184,17 +193,19 @@
    }
  },
  onLoad(option) {
    if (option && option.id) {
      this.$set(this.param, 'checkUserId', option.id)
      this.$set(this.param, 'applyCheckUserId', option.id)
      this.$set(this.param, 'checkorName', option.name)
    }
    this.initConfig()
    const userInfo = uni.getStorageSync('userInfo') || {}
    this.$set(this.param, 'memberName', userInfo.realname)
    this.$set(this.param, 'memberPhone', userInfo.mobile)
    this.$set(this.param, 'memberId', userInfo.id)
    this.$set(this.param, 'submitTime', dayjs().format('YYYY-MM-DD HH:mm:ss'))
  },
  mounted() {
    this.$eventBus.$on('snapshotSel', (option) => {
      this.$set(this.param, 'checkUserId', option.id)
      this.$set(this.param, 'applyCheckUserId', option.id)
      this.$set(this.param, 'checkorName', option.name)
    })
  },
  methods: {
    onSubmit() {
@@ -258,7 +269,7 @@
    uploadImage() {
      this.showUpload = false
      uni.chooseImage({
        count: 6,
        count: 1,
        success: (chooseImageRes) => {
          console.log('chooseImageRes.tempFilePaths', chooseImageRes.tempFilePaths)
          uni.showLoading({ title: '上传中', mask: true })
@@ -296,30 +307,27 @@
      uni.chooseVideo({
        success: (chooseImageRes) => {
          uni.showLoading({ title: '上传中', mask: true })
          for (let i = 0; i < chooseImageRes.tempFilePaths.length; i++) {
            uni.uploadFile({
              url: `${uploadUrl}`,
              filePath: chooseImageRes.tempFilePaths[i],
              name: 'file',
              formData: {
                folderCode: 'HIDDEN_DANGER_FILE'
              },
              success: (uploadFileRes) => {
                let res = JSON.parse(uploadFileRes.data)
                console.log('uploadFileRes', res)
                let obj = { type: '1' }
                obj.fileurl = res.data.halfPath
                obj.fileurlFull = res.data.addr
                that.submitFileList.push(obj)
                console.log(that.submitFileList)
              },
              complete() {
                if (i === chooseImageRes.tempFilePaths.length - 1) {
                  uni.hideLoading()
                }
          uni.uploadFile({
            url: `${uploadUrl}`,
            filePath: chooseImageRes.tempFilePath,
            name: 'file',
            formData: {
              folderCode: 'HIDDEN_DANGER_FILE'
            },
            success: (uploadFileRes) => {
              let res = JSON.parse(uploadFileRes.data)
              console.log('res', res)
              let obj = {
                type: '1'
              }
            })
          }
              obj.fileurl = res.data.halfPath
              obj.fileurlFull = res.data.addr
              this.submitFileList.push(obj)
            },
            complete() {
              uni.hideLoading()
            }
          })
        }
      })
    },
@@ -366,7 +374,7 @@
  }
  .upload_line {
    padding: 30rpx 0;
    .wrap{
    .wrap {
      display: flex;
      flex-wrap: wrap;
    }
@@ -387,6 +395,9 @@
        width: 100%;
        height: 100%;
      }
      video {
        width: 100%;
      }
    }
  }
}
h5/pages/staff/task/index.vue
@@ -12,10 +12,10 @@
        </view>
      </view>
      <view class="box_head_list">
        <view class="box_head_item active">待处理 12</view>
        <view class="box_head_item">已处理</view>
        <view class="box_head_item">我发起的</view>
        <view class="box_head_item">抄送我的</view>
        <view @click="statusClick()" class="box_head_item active">待处理</view>
        <view @click="statusClick()" class="box_head_item">已处理</view>
        <view @click="statusClick()" class="box_head_item">我发起的</view>
        <view @click="statusClick()" class="box_head_item">抄送我的</view>
      </view>
    </scroll-view>
    <view class="box_list">
@@ -139,7 +139,10 @@
        startTime: '',
        endTime: ''
      },
      pagination: {},
      pagination: {
        capacity: 10,
        page: 1
      },
      dataList: [],
      cate: [
        { name: '访客申请', id: 1 },
@@ -152,12 +155,20 @@
    this.getList()
  },
  methods: {
    statusClick(val) {
      this.pagination.page = 1
      this.getList()
    },
    getList() {
      const { pagination } = this
      const { pagination, search } = this
      pagination.page++
      taskCenter({
        model: {}
        ...pagination,
        model: {
          ...search
        }
      }).then(res => {
        this.dataList = res.data.records
        this.dataList = [...this.dataList, ...res.data.records]
      })
    },
    handleAppr(item) {
h5/pages/staff/vehicle/sendACar.vue
@@ -61,10 +61,11 @@
    <!-- 日期 -->
    <u-datetime-picker
      mode="date"
      v-model="param.queryDate"
      :show="isShowDate"
      :minDate="minDate"
      closeOnClickOverlay
      @close="isShowDate = false"
      :closeOnClickOverlay="true"
      @confirm="seletedDate"
      @cancel="isShowDate = false"
    />
@@ -81,6 +82,7 @@
      isShowDate: false,
      carsList: [],
      param: {
        queryDate: dayjs().format('YYYY-MM-DD'),
        memberId: uni.getStorageSync('userInfo').memberId
      },
      minDate: '',
@@ -89,7 +91,7 @@
        capacity: 10
      },
      total: 0,
      dataList: []
      dataList: [],
    }
  },
  onLoad() {
@@ -107,6 +109,10 @@
    getList() {
      const { param, pagination } = this
      pagination.page = pagination.page + 1
      if(param.queryDate){
        param.queryStartTime = param.queryDate + ' 00:00:00'
        param.queryEndTime = param.queryDate + ' 23:59:59'
      }
      carUseBookPaiche({
        ...pagination,
        model: { ...param }
@@ -126,21 +132,17 @@
        },
    seletedCar(e) {
      const item = e.value[0]
      this.pagination.page = 0
      this.$set(this.param, 'carCode', item.code)
      this.$set(this.param, 'carId', item.id)
      this.isShowCar = false
      if (this.param.carId && this.param.queryDate) {
        this.pagination.page = 0
        this.getList()
      }
      this.getList()
    },
    seletedDate(e) {
      this.param.queryDate = dayjs(e.value).format('YYYY-MM-DD')
      this.pagination.page = 0
      this.isShowDate = false
      if (this.param.carId && this.param.queryDate) {
        this.pagination.page = 0
        this.getList()
      }
      this.getList()
    },
    endtimeClose() {
      this.param.endTime = ''
h5/pages/staff/vehicle/sendACarDetail.vue
@@ -16,19 +16,25 @@
    <view class="module_list">
      <view class="item">
        <view class="label">预计用车时段</view>
        <view class="value">{{ info.startTime.slice(0, 16) }}至{{ info.endTime.slice(0, 16) }}</view>
        <view class="value" v-if="info.startTime"
          >{{ info.startTime.slice(0, 16) }}至{{
            info.endTime.slice(0, 16)
          }}</view
        >
      </view>
            <view class="item">
      <view class="item">
        <view class="label">预计出发时间</view>
        <view class="value">{{ info.planUseDate }}</view>
      </view>
            <view class="item">
      <view class="item">
        <view class="label">乘车人员</view>
        <view class="value">{{ info.memberNames }}</view>
      </view>
      <view class="item">
        <view class="label">目的地</view>
        <view class="value">{{ info.type == '1' ? '市外' : '室内' }}:{{ info.addr }}</view>
        <view class="value"
          >{{ info.type == "1" ? "市外" : "室内" }}:{{ info.addr }}</view
        >
      </view>
      <view class="item">
        <view class="label">用车事由</view>
@@ -46,31 +52,27 @@
    <!-- 流程 -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <view class="list">
        <view class="item">
      <view
        class="list"
        v-if="
          info.approveDateVO != null && info.approveDateVO.approveList != null
        "
      >
        <view
          class="item"
          v-for="(item, index) in info.approveDateVO.approveList"
          :key="item.id"
        >
          <view class="separate"></view>
          <view class="avatar">
            <image class="img" src="@/static/logo@2x.png" mode="widthFix" />
            <image
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
              class="img"
              :src="
                item.faceImg
                  ? item.faceImg
                  : require('@/static/meeting/common/default_user@2x.png')
              "
            />
            <view class="separate"></view>
          </view>
          <view class="content">
            <view class="head">
              <view class="event">某某提交的拜访申请</view>
              <view class="time">time</view>
            </view>
            <view class="name_wrap">
              <text>李东(<text class="status">处理中</text>)</text>
            </view>
            <view class="remark">同意放行</view>
          </view>
        </view>
        <view class="item">
          <view class="avatar">
            <image class="img" src="@/static/logo@2x.png" mode="widthFix" />
            <image
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
@@ -79,19 +81,36 @@
          </view>
          <view class="content">
            <view class="head">
              <view class="event">某某提交的拜访申请</view>
              <view class="time">time</view>
              <view class="event">{{ item.title }}</view>
              <view class="time">{{ item.checkDate }}</view>
            </view>
            <view class="name_wrap">
              <text>李东(<text class="status">处理中</text>)</text>
              <text
                >{{ item.memberName
                }}<text class="status" v-if="item.statusInfo"
                  >({{ item.statusInfo }})</text
                ></text
              >
            </view>
            <view class="carbon">
              <view class="carbon_item" v-for="i in 12">
            <view v-if="item.checkInfo" class="remark">{{
              item.checkInfo
            }}</view>
            <!-- 抄送人 -->
            <view v-if="item.approveType == 1" class="children">
              <view
                class="child"
                v-for="child in item.approveList"
                :key="child.id"
              >
                <image
                  src="../../../static/logo@2x.png"
                  mode="widthFix"
                ></image>
                <view class="text">name</view>
                  class="child_img"
                  :src="
                    child.faceImg
                      ? child.faceImg
                      : require('@/static/meeting/common/default_user@2x.png')
                  "
                />
                <view>{{ child.memberName }}</view>
              </view>
            </view>
          </view>
@@ -100,10 +119,32 @@
    </view>
    <view class="emyty"></view>
    <view class="main_footer">
      <view class="btn" @click="handleSub('0')">拒绝</view>
      <view class="btn agree" @click="handleSub('1')">同意</view>
      <!-- <view class="btn" @click="handleSub(3)">拒绝</view>
      <view class="btn agree" @click="handleSub(2)">同意</view> -->
      <view class="btn agree" @click="isShowBack = true">撤销用车</view>
    </view>
    <!-- 撤销 -->
    <u-popup
      :show="isShowBack"
      :round="10"
      :safeAreaInsetBottom="true"
      mode="bottom"
      @close="isShowBack = false"
    >
      <view class="appr_modal">
        <view class="title">撤销用车</view>
        <view class="line"> 撤销说明 </view>
        <textarea
          v-model="backParam.info"
          placeholder="非必填"
          placeholder-class="placeholder9"
        />
        <view class="main_footer">
          <view class="btn agree" @click="onSubBack">提交</view>
        </view>
      </view>
    </u-popup>
    <!--  -->
    <u-popup
      :show="showApprModal"
@@ -113,29 +154,53 @@
      @close="showApprModal = false"
    >
      <view class="appr_modal">
        <view class="title">同意</view>
        <view class="title">{{ param.status == 2 ? "同意" : "拒绝" }}</view>
        <view class="line" @click="isShowDrive = true">
          <text v-if="param.driverName">{{ param.driverName }}</text>
          <text v-else class="placeholder9">派车司机</text>
          <u-icon class="ml12" name="arrow-right" color="#999999" />
        </view>
        <textarea
          placeholder="同意说明,非必填"
          v-model="param.checkInfo"
          :placeholder="
            param.status == 2 ? '同意说明,非必填' : '拒绝说明,非必填'
          "
          placeholder-class="placeholder9"
        />
        <view class="main_footer">
          <view class="btn" @click="showApprModal = false">取消</view>
          <view class="btn agree">提交</view>
          <view class="btn agree" @click="onSubmit">提交</view>
        </view>
      </view>
    </u-popup>
    <!-- 司机 -->
    <u-picker
      keyName="name"
      :show="isShowDrive"
      @close="isShowDrive = false"
      :closeOnClickOverlay="true"
      :columns="driveList"
      @confirm="seletedDrive"
      @cancel="isShowDrive = false"
    ></u-picker>
  </view>
</template>
<script>
import { carUseBookDetail } from '@/api'
import { carUseBookDetail, carUseBookAppr, driveListPos, carUseBookBack } from '@/api'
export default {
  data() {
    return {
      showApprModal: false,
      isShowBack: false,
      backParam: {},
      isShowDrive: false,
      id: '',
      info: {},
      param: {},
      param: {
        status: ''
      },
      driveList: []
    }
  },
@@ -150,15 +215,69 @@
        this.info = { ...res.data }
      })
    },
    handleSub(flag) {
    onSubBack() {
      carUseBookBack({
        id: this.id,
        info: this.backParam.info
      }).then(res => {
        if (res.code === 200) {
          uni.showToast({
            title: '撤销成功',
            icon: 'success',
            duration: 2000
          })
          this.isShowBack = false
          setTimeout(() => {
            uni.navigateBack()
          }, 1000)
        }
      })
    },
    onSubmit() {
      const { param, info } = this
      carUseBookAppr({
        status: param.status,
        objType: info.type == 1 ? 4 : 3,
        objId: this.id,
        driverId: param.driverId,
        checkInfo: param.checkInfo
      }).then(res => {
        if (res.code === 200) {
          this.showApprModal = false
          setTimeout(() => {
            uni.showToast({
              title: '操作成功',
              icon: 'success'
            })
          })
          uni.navigateBack()
        }
      })
    },
    handleSub(status) {
      // this.param.flag = 
      if (flag === '1') {
      this.param = {
        status
      }
      this.showApprModal = true
      if (status === 2) { // 同意
        this.getDriveList()
      } else {
      }
      this.showApprModal = true
    }
    },
    getDriveList() {
      driveListPost({}).then(res => {
        this.driveList = [res.data]
      })
    },
    seletedDrive(e) {
      console.log(e.value[0])
      this.$set(this.param, 'driverId', e.value[0].id)
      this.$set(this.param, 'driverName', e.value[0].name)
      this.isShowDrive = false
    },
  },
}
</script>
@@ -186,7 +305,16 @@
      .item {
        display: flex;
        margin-bottom: 48rpx;
        position: relative;
        .separate {
          position: absolute;
          width: 4rpx;
          height: 100%;
          background-color: #eeeeee;
          left: 40rpx;
          transform: translate(-50%, 0);
          top: 80rpx;
        }
        .avatar {
          width: 80rpx;
          height: 80rpx;
@@ -206,16 +334,6 @@
            position: absolute;
            right: 0;
            bottom: 0;
          }
          .separate {
            position: absolute;
            width: 4rpx;
            height: 100%;
            background-color: #eeeeee;
            left: 50%;
            transform: translate(-50%, 0);
            bottom: -80rpx;
          }
        }
@@ -243,6 +361,23 @@
            .status {
              color: $uni-color-primary;
            }
          }
          .children {
            display: flex;
            flex-wrap: wrap;
            margin-top: 12rpx;
            .child {
              display: flex;
              flex-direction: column;
              justify-content: center;
              align-items: center;
              margin-right: 12rpx;
              .child_img {
                width: 48rpx;
                height: 48rpx;
                border-radius: 50%;
              }
            }
          }
@@ -274,6 +409,11 @@
              font-size: 26rpx;
              color: #777777;
            }
          }
        }
        &:nth-last-child(1) {
          .separate {
            height: 0;
          }
        }
      }
@@ -356,7 +496,7 @@
    justify-content: space-between;
    .btn {
      width: 336rpx;
      flex: 1;
      height: 88rpx;
      line-height: 88rpx;
      background: #ffffff;
@@ -364,7 +504,7 @@
      border: 1rpx solid #999999;
      font-size: 32rpx;
      text-align: center;
      margin: 16rpx 0;
      margin: 16rpx;
    }
    .agree {
@@ -376,7 +516,14 @@
  .appr_modal {
    padding: 36rpx 30rpx 0;
    .line {
      height: 90rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      border-bottom: 1rpx solid #e4e4e4;
      margin-bottom: 20rpx;
    }
    .title {
      font-weight: 500;
      font-size: 32rpx;