ll
liukangdong
2024-10-18 e6acb39a2475e211f2c1decc45a95c868239c25f
ll
已添加3个文件
已修改23个文件
851 ■■■■■ 文件已修改
admin/src/api/system/sms.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalAlertWindow.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/operation/OperCarUseBookParamWindow.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/role/OperaSystemRoleDataWindow.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/role/PermissionConfigWindow.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/components/OperaBookingsWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/publicMsg.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/index.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSel.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/meetingSubOrder.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/memberSel.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/driver.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorApprove.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorReport.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/applePeo.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACar.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACarDetail.vue 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shinei.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shiwai.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/release/apk/会议室.apk 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/release/apk/pda.apk 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/sms.js
@@ -16,3 +16,20 @@
    }
  })
}
// å…¬ä¼—号通知 åˆ†é¡µåˆ—表
export function getH5List (data) {
  return request.post('/visitsAdmin/cloudService/business/wxNoticeConfig/page', data)
}
// å…¬ä¼—号通知 çŠ¶æ€æ›´æ–°
export function H5StatusUpdate (data) {
  return request.post('/visitsAdmin/cloudService/business/wxNoticeConfig/updateById', data)
}
// å…¬ä¼—号通知 æ‰¹é‡çŠ¶æ€æ›´æ–°
export function H5StatussUpdate (data) {
  return request.get('/visitsAdmin/cloudService/business/wxNoticeConfig/updateStatus/batch', {
    params: {
      ...data
    }
  })
}
admin/src/components/common/CommonHeader.vue
@@ -119,7 +119,8 @@
            { required: true, message: '请输入原始密码' }
          ],
          newPwd: [
            { required: true, message: '请输入新密码' }
          { required: true, message: '请输入密码', trigger: 'blur' },
          { validator: this.validatePassword, trigger: 'blur' },
          ],
          confirmPwd: [
            { required: true, message: '请再次输入新密码' }
@@ -133,6 +134,10 @@
    // title () {
    //   return this.$route.meta.title
    // }
  },
  mounted() {
    console.log('userInfo',this.userInfo);
  },
  filters: {
    // å±•示名称
@@ -154,6 +159,26 @@
      this.$nextTick(() => {
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    validatePassword(rule, value, callback) {
      if (!value) {
        callback(new Error('请输入密码'));
      } else {
        const lengthValid = /^.{6,20}$/.test(value);
        const hasLetter = /[a-zA-Z]/.test(value);
        const hasNumber = /[0-9]/.test(value);
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value);
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length;
        if (!lengthValid) {
          callback(new Error('密码长度需为6到20个字符'));
        } else if (typesCount < 2) {
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'));
        } else {
          callback(); // éªŒè¯é€šè¿‡
        }
      }
    },
    getHeaderNav(type){
      getAppHeaderNav(type).then(res => {
@@ -277,6 +302,7 @@
    background: url("../../assets/images/top_ic_bolang@2x.png") no-repeat;
    flex-shrink: 0;
    text-align: right;
    cursor: pointer;
    .el-dropdown {
      top: 2px;
      color: #fff;
admin/src/components/common/GlobalAlertWindow.vue
@@ -6,6 +6,7 @@
    :with-header="true"
    :width="width"
    :close-on-press-escape="false"
    :close-on-click-modal="false"
    :wrapper-closable="false"
    :append-to-body="true"
    @close="close"
admin/src/components/operation/OperCarUseBookParamWindow.vue
@@ -107,7 +107,7 @@
      title="选择用车时间"
      :visible.sync="isShowTime"
      append-to-body
      width="600px"
      width="640px"
    >
      <el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
        <el-form-item label="用车日期" prop="dateDay">
@@ -591,28 +591,37 @@
}
.time_list {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  .item {
    width: 154px;
    height: 32px;
    line-height: 32px;
    text-align: center;
    background: #f7f7f7;
    border-radius: 4px;
    margin-bottom: 10px;
    margin-right: 8px;
    margin-bottom: 8px;
    font-size: 14px;
    font-weight: 400;
    line-height: 14px;
    width: 124px;
    height: 36px;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 5px;
    color: #111;
    border: #cccccc solid 1px;
    cursor: pointer;
  }
  .active {
    background-color: $primary-color;
    color: #fff;
    border-color: $primary-color;
    background-color: #f6f9fe;
    color: $primary-color;
  }
  .disable {
    color: #fff;
    border-color: #cccccc;
    background-color: #cccccc;
    color: #999999;
  }
  .hasSub {
    border-color: #bed6f9;
    background-color: #bed6f9;
      color: #fff;
      background: #cccccc;
    }
}
.color_op {
admin/src/components/system/role/OperaSystemRoleDataWindow.vue
@@ -1,32 +1,16 @@
<template>
  <GlobalWindow
    :title="title"
    width="60%"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
  >
  <GlobalWindow :title="title" width="80%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
    <p class="tip">正在为角色【 <em>{{role.name || '-'}}</em>】 é…ç½®æ•°æ®æƒé™</p>
    <p class="tip-warn"><i class="el-icon-warning"></i>提醒:权限配置后需重新登录后生效</p>
    <el-form :model="form" ref="form" style="margin-top:15px">
      <el-form-item label="权限类型:" prop="type">
        <el-select v-model="form.type" clearable filterable placeholder="请选择权限类型">
          <el-option
            v-for="(item, index) in options"
            :key="index"
            :label="item.name"
            :value="item.id"
          >
          <el-option v-for="(item, index) in options" :key="index" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item v-if="form.type == 4" label="自定义部门:" prop="customData">
        <el-cascader
          :options="departments"
          v-model="form.customData"
          :props=defaultProps
          clearable
        ></el-cascader>
        <el-cascader :options="departments" v-model="form.customData" :props=defaultProps clearable></el-cascader>
      </el-form-item>
    </el-form>
@@ -109,7 +93,7 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        console.log(target);
        console.log(target)
        if (target.customData === undefined ||target.customData === null || target.customData === '') {
          this.form.customData = []
        } else {
@@ -133,7 +117,7 @@
          newItem.children = this.newTree(newItem.children)
        }
        return newItem
      });
      })
    },
    __confirmCreate () {
      // console.log(JSON.stringify(this.form.customData));
@@ -196,3 +180,25 @@
  }
}
</script>
<style scoped lang="scss">
.transfer {
  height: 600px;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  ::v-deep .el-transfer-panel {
    flex: 1;
    height: 100%;
  }
  ::v-deep .el-transfer-panel__body {
    height: 500px;
  }
  ::v-deep .el-transfer-panel__list.is-filterable {
    height: 480px;
  }
}
</style>
admin/src/components/system/role/PermissionConfigWindow.vue
@@ -1,25 +1,12 @@
<template>
  <GlobalWindow
    :visible.sync="visible"
    :confirm-working="isWorking"
    width="582px"
    title="配置角色权限"
    @confirm="confirm"
  >
  <GlobalWindow :visible.sync="visible" :confirm-working="isWorking" width="80%" title="配置角色权限" @confirm="confirm">
    <p class="tip" v-if="role != null">为角色 <em>{{role.name}}</em> é…ç½®æƒé™</p>
    <p class="tip-warn"><i class="el-icon-warning"></i>提醒:权限配置后需重新登录后生效</p>
    <el-transfer
      ref="permissionTransfer"
      v-model="selectedIds"
      filterable
      class="transfer"
      :filter-method="filterPermissions"
      :titles="['未授权权限', '已授权权限']"
      :props="{
    <el-transfer ref="permissionTransfer" v-model="selectedIds" filterable class="transfer"
      :filter-method="filterPermissions" :titles="['未授权权限', '已授权权限']" :props="{
        key: 'id',
        label: 'name'
      }"
      :data="permissions">
      }" :data="permissions">
    </el-transfer>
  </GlobalWindow>
</template>
@@ -101,6 +88,7 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.global-window {
  .tip {
    em {
@@ -109,10 +97,12 @@
      font-weight: bold;
    }
  }
  .tip-warn {
    margin: 4px 0 12px 0;
    font-size: 12px;
    color: #999;
    i {
      color: orange;
      margin-right: 4px;
@@ -122,6 +112,7 @@
    }
  }
}
.transfer {
  height: 600px;
  width: 100%;
admin/src/views/login.vue
@@ -6,16 +6,17 @@
        <div class="h3">智慧物流园区安消一体化系统</div>
      </div>
      <div class="form_wrap">
        <!-- <div class="tabs">
          <div class="tab active">
        <div class="tabs">
          <div class="tab" @click="tabClick('0')" :class="{ active: activeTab == '0' }">
            <div class="name">帐号登录</div>
            <div class="icon"></div>
          </div>
          <div class="tab">
          <div class="tab" @click="tabClick('1')" :class="{ active: activeTab == '1' }">
            <div class="name">手机登录</div>
            <div class="icon"></div>
          </div>
        </div> -->
        </div>
        <template v-if="activeTab == '0'">
        <div class="df_ac">
          <div class="label">帐号</div>
          <div class="line">
@@ -28,7 +29,6 @@
            <el-input v-model="password" placeholder="请输入密码" type="password" maxlength="30" show-password />
          </div>
        </div>
        <div class="df_ac">
          <div class="label">验证码</div>
          <div class="line">
@@ -37,8 +37,24 @@
            <span v-else><i class="el-icon-loading"></i></span>
          </div>
        </div>
        <el-button :loading="loading" type="primary" class="login_btn"
          @click.native.prevent="login">立即登录</el-button>
        </template>
        <template v-if="activeTab == '1'">
          <div class="df_ac">
            <div class="label">手机号</div>
            <div class="line">
              <el-input v-model="password" placeholder="请输入手机号" type="password" maxlength="30" show-password />
            </div>
          </div>
          <div class="df_ac">
            <div class="label">验证码</div>
            <div class="line">
              <el-input v-model="captcha.value" placeholder="请输入验证码" maxlength="4" @keypress.enter.native="login" />
              <span class="code_get" @click="getCode">获取验证码</span>
            </div>
          </div>
        </template>
        <el-button :loading="loading" type="primary" class="login_btn" @click.native.prevent="login">立即登录</el-button>
        <div class="btn_wrap">
          <el-checkbox v-model="isRemPsd">
            <span style="font-size: 13px; font-weight: 400" class="placeholder9">记住密码</span>
@@ -66,6 +82,7 @@
      isRemPsd: false,
      username: '',
      password: '',
      activeTab: '1',
      // éªŒè¯ç 
      captcha: {
        loading: false,
@@ -120,6 +137,13 @@
        .finally(() => {
          this.loading = false
        })
    },
    getCode() {
      console.log('getCode');
    },
    tabClick(val) {
      this.activeTab = val
    },
    // åˆ·æ–°éªŒè¯ç 
    refreshCaptcha() {
@@ -221,7 +245,7 @@
      background-color: #fff;
      box-sizing: border-box;
      /* padding: 50px 80px 20px; */
      padding: 80px 80px 20px;
      padding: 50px 80px 20px;
      position: relative;
      .tabs {
@@ -236,6 +260,7 @@
          flex-direction: column;
          justify-content: center;
          align-items: center;
          cursor: pointer;
          .icon {
            width: 36px;
@@ -287,10 +312,11 @@
        margin-bottom: 17px;
        display: flex;
        width: 100%;
        align-items: center;
        position: relative;
        .el-input {
          height: 40px;
          flex: 1;
          // font-size: 14px;
          ::v-deep .el-input__inner {
            height: 40px !important;
@@ -301,6 +327,17 @@
          width: 100px;
          margin-left: 10px;
        }
        .code_get{
          position: absolute;
          top: 10px;
          right: 10px;
          font-size: 14px;
          width: 72px;
          z-index: 11;
          margin-left: 10px;
          cursor: pointer;
          color: $primary-color;
        }
      }
      .forget {
admin/src/views/meeting/components/OperaBookingsWindow.vue
@@ -466,7 +466,6 @@
  .time-item {
    margin-right: 8px;
    margin-bottom: 8px;
    border: #cccccc solid 1px;
    font-size: 14px;
    font-weight: 400;
    line-height: 14px;
@@ -477,6 +476,8 @@
    align-items: center;
    border-radius: 5px;
    color: #111;
    border: #cccccc solid 1px;
    cursor: pointer;
  }
  .time-item-sel {
    border-color: $primary-color;
admin/src/views/system/publicMsg.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
<template>
  <div class="main_app">
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear">
    </QueryForm>
    <div class="pt16 mb10">
      <el-button type="primary" @click="batchStatus(0)" v-permissions="['business:platformjob:update']">批量启用</el-button>
      <el-button @click="batchStatus(1)" v-permissions="['business:platformjob:update']">批量禁用</el-button>
    </div>
    <el-table @selection-change="handleSelectionChange" class="mb20" v-loading="loading" :data="list" stripe>
      <el-table-column align="center" type="selection" width="55">
      </el-table-column>
      <el-table-column prop="titile" label="消息标题" min-width="160" show-overflow-tooltip />
      <el-table-column prop="objCode" label="消息编码" min-width="150" show-overflow-tooltip />
      <el-table-column prop="tempId" label="模板ID" min-width="300" show-overflow-tooltip />
      <el-table-column label="状态" width="120" align="center" fixed="right">
        <template v-slot="scope">
          <el-switch v-permissions="['business:platformjob:update']" v-model="scope.row.status"
            @change="changeStatus(scope.row)" :active-value="0" :inactive-value="1">
          </el-switch>
        </template>
      </el-table-column>
    </el-table>
    <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { getH5List, H5StatusUpdate, H5StatussUpdate } from '@/api/system/sms'
import GlobalWindow from '@/components/common/GlobalWindow'
import { Message } from 'element-ui'
import dayjs from 'dayjs'
export default {
  components: {
    Pagination,
    QueryForm,
    GlobalWindow,
  },
  data() {
    return {
      ids: [],
      isShowDetail: false,
      exLoading: false,
      loading: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      queryFormConfig: {
        formItems: [
          {
            filed: 'titile',
            type: 'input',
            label: '消息标题'
          },
          {
            filed: 'status',
            type: 'select',
            label: '启用状态',
            options: [
              { value: 0, label: '启用' },
              { value: 1, label: '禁用' },
            ]
          },
          {
            filed: 'objCode',
            type: 'input',
            label: '消息编码'
          }
        ],
        online: true
      },
    }
  },
  created() {
    this.getList()
  },
  methods: {
    handleSelectionChange(val) {
      this.ids = val.map(i => i.id)
      console.log('ids', this.ids)
    },
    batchStatus(status) {
      const { ids } = this
      if (ids.length == 0) return Message.error('请先选择要更改的短信通知')
      this.$confirm(`确定${status == 0 ? '启用' : '禁用'}选中的所有短信通知吗?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        H5StatussUpdate({
          ids: ids.join(','),
          status
        }).then(res => {
          Message.success('批量更新成功')
          this.getList()
        }, () => {
          this.getList()
        })
      })
    },
    changeStatus(row) {
      console.log('row', row)
      H5StatusUpdate({
        ...row
      }).then(res => {
        Message.success('状态更新成功')
      }, () => {
        this.getList()
      })
    },
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      getH5List({
        model: {
          ...filters,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
          item.taskOrigin = 'WMS获取'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    clear() {
      this.pagination.page = 1
      this.filters = {}
      this.getList()
    },
    handleSizeChange(capacity) {
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style lang="scss" scoped>
.param_title {
  font-size: 18px;
  font-weight: 600;
  color: #000000;
  margin-bottom: 15px;
}
</style>
h5/App.vue
@@ -29,7 +29,18 @@
  max-width: 800rpx;
  overflow-y: auto;
}
.empty_wrap{
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    color: #666666;
    min-height: 600rpx;
    image{
        width: 300rpx;
        height: 300rpx;
    }
}
.doumee-container .ivu-tabs-nav {
  width: 100%;
}
h5/manifest.json
@@ -41,9 +41,45 @@
                ]
            },
            /* ios打包配置 */
            "ios" : {},
            "ios" : {
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {}
            "sdkConfigs" : {
                "ad" : {}
            },
            "icons" : {
                "android" : {
                    "hdpi" : "",
                    "xhdpi" : "",
                    "xxhdpi" : "",
                    "xxxhdpi" : ""
                },
                "ios" : {
                    "appstore" : "",
                    "ipad" : {
                        "app" : "",
                        "app@2x" : "",
                        "notification" : "",
                        "notification@2x" : "",
                        "proapp@2x" : "",
                        "settings" : "",
                        "settings@2x" : "",
                        "spotlight" : "",
                        "spotlight@2x" : ""
                    },
                    "iphone" : {
                        "app@2x" : "",
                        "app@3x" : "",
                        "notification@2x" : "",
                        "notification@3x" : "",
                        "settings@2x" : "",
                        "settings@3x" : "",
                        "spotlight@2x" : "",
                        "spotlight@3x" : ""
                    }
                }
            }
        }
    },
    /* å¿«åº”用特有相关 */
h5/pages/staff/index.vue
@@ -20,7 +20,15 @@
    </view>
    <view class="title_wrap"><view class="name">业务办理</view></view>
    <view class="container1">
      <view class="left">
            <view class="list">
                <block v-for="item in list1" :key="item.name">
                    <view v-if="checkAuth(item.auth)" class="item" @click="jump(item.url)">
                        <image :src="item.img" class="icon" />
                        <view class="name">{{item.name}}</view>
                    </view>
                </block>
            </view>
<!--      <view class="left">
        <view class="img_wrap img1" @click="jump('/pages/staff/visitorReport')">
          <image src="@/static/staff/ic_fangkebaobei.png" class="img"></image>
          <view class="h1">访客报备</view>
@@ -54,12 +62,19 @@
          <view class="h1">修改密码</view>
          <view class="h2">CHANGE PASSWORD</view>
        </view>
      </view>
      </view> -->
    </view>
    <!--  -->
    <view class="title_wrap"><view class="name">业务查询</view></view>
    <view class="container2">
      <view class="img_wrap" @click="jump('/pages/staff/task/index')">
            <view class="list">
                <view class="item" @click="jump(item.url)" v-for="item in list2" :key="item.name">
                    <image :src="item.img" class="icon" />
                    <view class="name">{{item.name}}</view>
                </view>
            </view>
<!--      <view class="img_wrap" @click="jump('/pages/staff/task/index')">
        <image class="img" src="@/static/staff/ic_renwuzhongxin.png"></image>
        <view class="h1">任务中心</view>
        <view class="h2">TASK CENTER</view>
@@ -81,7 +96,7 @@
        <image class="img" src="@/static/staff/ic_huiyishiguanli.png"></image>
        <view class="h1">会议室管理</view>
        <view class="h2">MANAGE MEETING ROOMS</view>
      </view>
      </view> -->
    </view>
    <view class="copyright">
      <image src="@/static/logo_s@2x.png" mode="widthFix" />
@@ -95,8 +110,23 @@
export default {
  data() {
    return {
      userInfo: uni.getStorageSync('userInfo'),
      taskInfo: 0
      userInfo: uni.getStorageSync('userInfo') || {permissions: []},
      taskInfo: 0,
            list1: [
                { name: '访客报备', url: '/pages/staff/visitorReport', img: require('@/static/home/ic_fangkebaobei@3x.png'),auth: 'weixin:menu:visitcar' },
                { name: '隐患随手拍', url: '/pages/staff/snapshot', img: require('@/static/home/ic_yinhuansuishoupai@3x.png'),auth: 'weixin:menu:hiddendanger' },
                { name: '用车申请', url: '/pages/staff/vehicle/index', img: require('@/static/home/ic_yongcheshenqing@3x.png'),auth: 'weixin:menu:usecar' },
                { name: '预约会议室', url: '/pages/staff/meetingSub', img: require('@/static/home/ic_yuyuehuiyishi@3x.png'),auth: 'weixin:menu:meeting' },
                { name: '修改密码', url: '/pages/changePassword/changePassword', img: require('@/static/home/ic_xiugaimima@3x.png'),auth: 'weixin:menu:password' },
                { name: '员工考勤', url: '', img: require('@/static/home/ic_kaoqin@3x.png'),auth: 'weixin:menu:attendance' },
            ],
            list2: [
                { name: '任务中心', url: '/pages/staff/task/index', img: require('@/static/home/ic_renwuzhongxin@3x.png'),auth: 'weixin:menu:taskcenter' },
                { name: '我的会议日历', url: '/pages/staff/meetingCalendar', img: require('@/static/home/ic_wodehuiyi@3x.png'),auth: 'weixin:menu:meetingcalendar' },
                { name: '派车记录', url: '/pages/staff/vehicle/sendACar', img: require('@/static/home/ic_paichejilu@3x.png'),auth: 'weixin:menu:usecarrecord' },
                { name: '会议室管理', url: '/pages/staff/meetingManager', img: require('@/static/home/ic_huiyishiguanli@3x.png'),auth: 'weixin:menu:meetingmanage' }
            ],
    }
  },
  onLoad() {
@@ -152,12 +182,17 @@
      console.log('----');
      this.getTaskInfo()
    })
        console.log('aaa', this.userInfo.permissions.indexOf('system:user:create'));
  },
  methods: {
    jump(path) {
      uni.navigateTo({
        url: path
      })
    },
        checkAuth(str) {
            const permissions = this.userInfo.permissions
            return permissions.indexOf(str) > -1
    },
    loginOut() {
      this.$store.commit('empty')
@@ -203,6 +238,25 @@
.main_app {
  padding-top: 12rpx;
}
.list{
    display: flex;
    width: 100%;
    flex-wrap: wrap;
    .item{
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        width: 25%;
        margin-bottom: 40rpx;
        font-size: 26rpx;
        image{
            width: 88rpx;
            height: 88rpx;
            margin-bottom: 20rpx;
        }
    }
}
.banner_wrap {
  padding: 54rpx 44rpx;
  color: #fff;
@@ -227,107 +281,22 @@
.container1 {
  display: flex;
  flex-wrap: wrap;
  view {
    width: 336rpx;
  }
  .left {
    margin-right: 18rpx;
  }
  .img_wrap {
    position: relative;
    padding: 24rpx 0rpx 0 28rpx;
    border-radius: 8rpx;
    overflow: hidden;
    .h1 {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      line-height: 48rpx;
      margin-bottom: 4rpx;
    }
    .h2 {
      font-size: 22rpx;
      color: #7b9da1;
      line-height: 34rpx;
    }
    .img {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      z-index: -1;
    }
  }
  .img1 {
    width: 336rpx;
    height: 296rpx;
    margin-bottom: 16rpx;
  }
  .img2 {
    width: 336rpx;
    height: 140rpx;
    margin-bottom: 16rpx;
  }
    padding: 10rpx 0 10rpx;
}
.container2 {
  display: flex;
  flex-wrap: wrap;
  .img_wrap {
    width: 336rpx;
    height: 140rpx;
    margin-bottom: 16rpx;
    position: relative;
    border-radius: 8rpx;
    overflow: hidden;
    padding: 24rpx 0rpx 0 28rpx;
    &:nth-of-type(2n) {
      margin-left: 18rpx;
    }
    .task_num {
      position: absolute;
      left: 168rpx;
      top: 26rpx;
      width: 52rpx;
      height: 52rpx;
      border-radius: 50%;
      /* border: 1px solid; */
      background-color: #fff;
      color: #db534c;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 24rpx;
    }
    .h1 {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      line-height: 48rpx;
      margin-bottom: 4rpx;
    }
    .h2 {
      font-size: 22rpx;
      color: #7b9da1;
      line-height: 34rpx;
    }
    .img {
      width: 100%;
      height: 100%;
      position: absolute;
      top: 0;
      left: 0;
      z-index: -1;
    }
  }
}
.copyright {
  display: flex;
  align-items: center;
  justify-content: center;
  margin-top: 44rpx;
  font-size: 24rpx;
  color: #666666;
    position: fixed;
    width: 100%;
    left: 0;
    bottom: 88rpx;
  image {
    width: 40rpx;
    height: 40rpx;
h5/pages/staff/meetingSel.vue
@@ -22,7 +22,10 @@
                    mode="widthFix" class="checked"></image>
                <text></text>
            </view>
            <view class="empty"></view>
            <view v-if="memberList.length == 0" class="empty">
                <image src="@/static/empty.png" mode=""></image>
                <text>暂无数据</text>
            </view>
        </view>
        <!--  -->
        <view class="sub_wrap">
h5/pages/staff/meetingSubOrder.vue
@@ -80,7 +80,7 @@
          />
        </view>
      </view>
      <view class="item">
      <view class="item" v-if="info.projectList && info.projectList.length > 0">
        <view class="name">选择服务项</view>
        <view class="line">
          <view class="label">
h5/pages/staff/memberSel.vue
@@ -35,7 +35,10 @@
          <text></text>
        </view>
      </checkbox-group>
      <view class="empty"></view>
      <view v-if="memberList.length == 0" class="empty_wrap">
          <image src="../../static/empty.png"></image>
          <text>暂无数据</text>
      </view>
    </view>
    <!--  -->
    <!-- <view class="sub_wrap">
h5/pages/staff/task/driver.vue
@@ -70,6 +70,7 @@
                  <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" />
                  <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img"
                      src="@/static/staff/ic_shenpiren@2x.png" />
                        <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image>
                  <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span>
                  <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png"
                      mode="widthFix" />
h5/pages/staff/task/index.vue
@@ -242,6 +242,7 @@
      },
      headData: {},
      dataList: [],
            total: 0,
      cateList: [
        { name: '访客申请', id: 0 },
        { name: '访客报备', id: 1 },
@@ -258,9 +259,12 @@
  //   this.getList()
  // },
  onReachBottom() {
    // this.pagination.page = 0
    // this.dataList = []
        const { total,  dataList} = this
    if(dataList.length < total){
    this.getList()
        } else {
            this.showToast('暂无更多数据')
        }
  },
  onBackPress(options) {
    setTimeout(()=>{
@@ -316,6 +320,7 @@
        }
      }).then(res => {
        this.dataList = [...this.dataList, ...res.data.records]
                this.total = res.data.total
        this.dataList.forEach(i => {
          if (i.param1) {
            i.param1 = JSON.parse(i.param1)
h5/pages/staff/task/visitorApprove.vue
@@ -69,6 +69,7 @@
                        <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" />
                        <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img"
                            src="@/static/staff/ic_shenpiren@2x.png" />
                        <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image>
                        <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span>
                        <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png"
                            mode="widthFix" />
h5/pages/staff/task/visitorReport.vue
@@ -63,6 +63,7 @@
            <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" />
            <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img"
              src="@/static/staff/ic_shenpiren@2x.png" />
                        <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image>
            <span v-else class="img_name">{{ item.memberName && item.memberName.slice(0, 1) }}</span>
            <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix" />
h5/pages/staff/vehicle/applePeo.vue
@@ -15,7 +15,7 @@
      />
    </view>
    <view class="member_list">
      <view v-for="(item, index) in memberList" :key="item.id" class="line">
      <view @click="changeMem(item, index)" v-for="(item, index) in memberList" :key="item.id" class="line">
        <image
          v-if="item.faceImgFull"
          :src="item.faceImgFull"
@@ -31,14 +31,12 @@
          <view class="depart">{{ item.companyName }}</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"
h5/pages/staff/vehicle/sendACar.vue
@@ -96,7 +96,7 @@
      minDate: '',
      pagination: {
        page: 0,
        capacity: 10
        capacity: 6
      },
      total: 0,
      dataList: [],
@@ -109,8 +109,11 @@
    this.initData()
  },
  onReachBottom() {
    if (this.total > 10) {
        console.log('onReachBottom');
    if (this.total > this.dataList.length) {
      this.getList()
    }else {
            this.showToast('暂无更多数据')
    }
  },
  methods: {
@@ -125,11 +128,7 @@
        ...pagination,
        model: { ...param }
      }).then(res => {
        if (pagination.page === 1) {
          this.dataList = res.data.records
        } else {
          this.dataList = [...list, ...res.data.records]
        }
        this.dataList = [...this.dataList, ...res.data.records]
        this.total = res.data.total
      })
    },
@@ -167,7 +166,7 @@
    },
    initData() {
      getCarsList({
        type: 1
        type: 0
      }).then(res => {
        this.carsList = [res.data]
      })
h5/pages/staff/vehicle/sendACarDetail.vue
@@ -1,32 +1,29 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">{{ info.memberName }}的用车申请</view>
      <view class="placeholder9">{{ info.companyName }}</view>
          <view class="name">{{ info.createMemberName }}提交的用车申请</view>
            <view
              class="desc"
              :class="{
                gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '4',
              gray: info.status == '2' || info.status == '3' || info.status == '4',
              }"
              >{{ infoStatus }}</view
            >
      <view class="status">
        <text class="loading" :class="{
                    grr: info.status == 1 || info.status == 2 || info.status == 4,
                    error: info.status == 3
                }" v-if="info.status == '0'">{{statusMap[info.status]}}</text>
      </view>
          <view v-if="info.status == '0' || info.status == '1'" class="status">{{
            statusMap[info.status]
          }}</view>
          <image v-if="info.status == '2'" src="@/static/ic_passed@2x.png" mode="widthFix" class="status_img"></image>
          <image v-if="info.status == '3' || info.status == '6'" src="@/static/ic_refused@2x.png" mode="widthFix"
            class="status_img"></image>
    </view>
    <!--  -->
    <view class="emyty"></view>
    <view class="module_list">
      <view class="item">
        <view class="label">预计用车时段</view>
        <view class="value" v-if="info.startTime"
          >{{ info.startTime.slice(0, 16) }}至{{
                <view class="value" v-if="info.startTime">{{ info.startTime.slice(0, 16) }}至{{
            info.endTime.slice(0, 16)
          }}</view
        >
          }}</view>
      </view>
      <view class="item">
        <view class="label">预计出发时间</view>
@@ -38,9 +35,7 @@
      </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>
@@ -58,42 +53,20 @@
    <!-- æµç¨‹ -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <view
        class="list"
        v-if="
            <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="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id">
          <view class="separate"></view>
          <view class="avatar">
              <image
                  v-if="item.type == 1"
                class="img"
                src="@/static/staff/ic_chaosong@2x.png"
              />
            <image
                v-else-if="item.approveType == 1 || item.approveType == 0"
              class="img"
              src="@/static/staff/ic_shenpiren@2x.png"
            />
                        <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" />
                        <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img"
                            src="@/static/staff/ic_shenpiren@2x.png" />
                        <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image>
              <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span>
            <image
                v-if="item.status == 2"
              class="status"
              src="@/static/staff/liucheng_success@2x.png"
              mode="widthFix"
            />
            <image
                v-if="item.status == 3"
              class="status"
              src="@/static/staff/liucheng_fail@2x.png"
              mode="widthFix"
            />
                        <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png"
                            mode="widthFix" />
                        <image v-if="item.status == 3" class="status" src="@/static/staff/liucheng_fail@2x.png" mode="widthFix" />
          </view>
          <view class="content">
            <view class="head">
@@ -101,31 +74,18 @@
              <view class="time">{{ item.checkDate }}</view>
            </view>
            <view class="name_wrap">
              <text
                >{{ item.memberName
                }}<text class="status" v-if="item.statusInfo"
                  >({{ item.statusInfo }})</text
                ></text
              >
                            <text>{{ item.memberName
                      }}<text :class="{ status: item.statusInfo == '处理中' || item.status == '1'  }"
                                    v-if="item.statusInfo">({{ item.statusInfo }})</text></text>
            </view>
            <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
                  class="child_img"
                  :src="
                    child.faceImg
                      ? child.faceImg
                      : require('@/static/meeting/common/default_user@2x.png')
                  "
                />
                        <view v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="children">
                            <view class="child" v-for="child in item.approveList" :key="child.id">
                                <image v-if="child.faceImg" class="child_img" :src="child.faceImg" />
                                <view v-else class="child_name">{{ child.memberName && child.memberName.slice(0,1) }}</view>
                <view>{{ child.memberName }}</view>
              </view>
            </view>
@@ -134,14 +94,11 @@
      </view>
    </view>
    <view class="emyty"></view>
    <view
      class="main_footer"
      v-if="
        <view class="main_footer" v-if="
        info.approveDateVO != null &&
        info.approveDateVO.canBeApproved != null &&
        info.approveDateVO.canBeApproved == 1
      "
    >
      ">
      <template v-if="appr == '1'">
        <view class="btn" @click="handleSub(3)">拒绝</view>
        <view class="btn agree" @click="handleSub(2)">同意</view>
@@ -150,34 +107,18 @@
    </view>
    <!-- æ’¤é”€ -->
    <u-popup
      :show="isShowBack"
      :round="10"
      :safeAreaInsetBottom="true"
      mode="bottom"
      @close="isShowBack = false"
    >
        <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"
        />
                <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"
      :round="10"
      :safeAreaInsetBottom="true"
      mode="bottom"
      @close="showApprModal = false"
    >
        <u-popup :show="showApprModal" :round="10" :safeAreaInsetBottom="true" mode="bottom" @close="showApprModal = false">
      <view class="appr_modal">
        <view class="title">{{ param.status == 2 ? "同意" : "拒绝" }}</view>
        <view v-if="param.status == 2" class="line" @click="isShowDrive = true">
@@ -185,13 +126,9 @@
          <text v-else class="placeholder9">派车司机</text>
          <u-icon class="ml12" name="arrow-right" color="#999999" />
        </view>
        <textarea
          v-model="param.checkInfo"
          :placeholder="
                <textarea v-model="param.checkInfo" :placeholder="
            param.status == 2 ? '同意说明,非必填' : '拒绝说明,必填'
          "
          placeholder-class="placeholder9"
        />
          " placeholder-class="placeholder9" />
        <view class="main_footer">
          <view class="btn" @click="showApprModal = false">取消</view>
          <view class="btn agree" @click="onSubmit">提交</view>
@@ -199,20 +136,18 @@
      </view>
    </u-popup>
    <!-- å¸æœº -->
    <u-picker
      keyName="name"
      :show="isShowDrive"
      @close="isShowDrive = false"
      :closeOnClickOverlay="true"
      :columns="driveList"
      @confirm="seletedDrive"
      @cancel="isShowDrive = false"
    ></u-picker>
        <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, carUseBookAppr, driveListPost, carUseBookBack } from '@/api'
    import {
        carUseBookDetail,
        carUseBookAppr,
        driveListPost,
        carUseBookBack
    } from '@/api'
export default {
  data() {
    return {
@@ -246,9 +181,25 @@
  },
  methods: {
    getDetail() {
      const { id } = this
                const {
                    id
                } = this
      carUseBookDetail(id).then(res => {
        this.info = { ...res.data }
                    this.info = {
                        ...res.data
                    }
                    if (this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0) {
                        this.info.approveDateVO.approveList.forEach(item => {
                            if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
                                item.title = item.approveList[0].title
                                item.faceImg = item.approveList[0].faceImg
                                item.memberName = item.approveList[0].memberName
                                item.statusInfo = item.approveList[0].statusInfo
                                item.status = item.approveList[0].status
                                item.approveList = []
                            }
                        })
                    }
      })
    },
    onSubBack() {
@@ -270,7 +221,10 @@
      })
    },
    onSubmit() {
      const { param, info } = this
                const {
                    param,
                    info
                } = this
      carUseBookAppr({
        status: param.status,
        objType: info.type == 1 ? 4 : 3,
@@ -342,6 +296,7 @@
        display: flex;
        margin-bottom: 48rpx;
        position: relative;
        .separate {
          position: absolute;
          width: 4rpx;
@@ -351,6 +306,7 @@
          transform: translate(-50%, 0);
          top: 80rpx;
        }
        .avatar {
          width: 80rpx;
          height: 80rpx;
@@ -359,15 +315,18 @@
                  display: flex;
                  align-items: center;
                  justify-content: center;
          .img {
            width: 80rpx;
            height: 80rpx;
            border-radius: 50%;
          }
                  .img_name{
                      font-size: 32rpx;
                      color: #FFFFFF;
                  }
          .status {
            width: 28rpx;
            height: 28rpx;
@@ -404,10 +363,12 @@
              color: $uni-color-primary;
            }
          }
          .children {
            display: flex;
            flex-wrap: wrap;
            margin-top: 12rpx;
            .child {
              display: flex;
              flex-direction: column;
@@ -416,12 +377,14 @@
              margin-right: 12rpx;
                          font-size: 26rpx;
                          color: #777777;
              .child_img {
                width: 48rpx;
                height: 48rpx;
                border-radius: 50%;
                              margin-bottom: 2rpx;
              }
                          .child_name{
                              margin-bottom: 2rpx;
                              width: 48rpx;
@@ -447,26 +410,31 @@
            line-height: 36rpx;
          }
        }
        .carbon {
          display: flex;
          width: 590rpx;
          overflow-x: auto;
          margin-top: 12rpx;
          .carbon_item {
            text-align: center;
            flex-shrink: 0;
            width: 100rpx;
            image {
              width: 60rpx;
              height: 60rpx;
              margin: 0 auto;
            }
            view {
              font-size: 26rpx;
              color: #777777;
            }
          }
        }
        &:nth-last-child(1) {
          .separate {
            height: 0;
@@ -524,15 +492,15 @@
    .name {
      font-weight: 600;
      font-size: 32rpx;
      margin-bottom: 16rpx;
      margin-bottom: 20rpx;
      color: #222222;
    }
    .desc {
      font-size: 26rpx;
      color: #ed4545;
            margin-top: 16rpx;
    }
    .gray {
      color: #999999;
    }
@@ -548,8 +516,14 @@
      background-color: #e9edff;
      color: $uni-color-primary;
    }
  }
    .status_img {
      position: absolute;
      right: 0rpx;
      top: 20rpx;
      width: 120rpx;
    }
  }
  .main_footer {
    padding-bottom: 64rpx;
    display: flex;
@@ -576,6 +550,7 @@
  .appr_modal {
    padding: 36rpx 30rpx 0;
    .line {
      height: 90rpx;
      display: flex;
@@ -584,6 +559,7 @@
      border-bottom: 1rpx solid #e4e4e4;
      margin-bottom: 20rpx;
    }
    .title {
      font-weight: 600;
      font-size: 32rpx;
h5/pages/staff/vehicle/shinei.vue
@@ -226,7 +226,7 @@
    },
    initData() {
      getCarsList({
        type: 1
        type: 0
      }).then(res => {
        this.carsList = [res.data]
      })
h5/pages/staff/vehicle/shiwai.vue
@@ -83,10 +83,20 @@
      @confirm="seletedCar"
      @cancel="isShowCar = false"
    ></u-picker>
    <u-datetime-picker
   <!-- <u-datetime-picker
      mode="datetime"
      :show="isShowDate"
      :filter="timeFilter"
      title="开始时间"
      :minDate="minDate"
      @close="isShowDate = false"
      :closeOnClickOverlay="true"
      @confirm="seletedDate"
      @cancel="isShowDate = false"
    /> -->
        <u-datetime-picker
           mode="datetime"
           :show="isShowDate"
      title="开始时间"
      :minDate="minDate"
      @close="isShowDate = false"
@@ -97,7 +107,6 @@
    <u-datetime-picker
      mode="datetime"
      :show="isShowEndDate"
      :filter="timeFilter"
      title="结束时间"
      :minDate="new Date(param.startTime || null).getTime()"
      @close="endtimeClose"
@@ -204,7 +213,7 @@
    },
    initData() {
      getCarsList({
        type: 1
        type: 0
      }).then(res => {
        this.carsList = [res.data]
      })
h5_meeting/unpackage/release/apk/»áÒéÊÒ.apk
Binary files differ
pda/unpackage/release/apk/pda.apk
Binary files differ