jiangping
2024-10-18 dfba7e1ef745a0e1f03bc596855c350067b8bbd2
Merge remote-tracking branch 'origin/master'
已添加38个文件
已修改41个文件
3867 ■■■■■ 文件已修改
admin/src/api/system/sms.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPlatformApproveTemplWindow.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalAlertWindow.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/operation/OperCarUseBookParamWindow.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/role/OperaSystemRoleDataWindow.vue 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/role/PermissionConfigWindow.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalConfiguration.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalReport.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 91 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/meeting/components/OperaBookingsWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprConfig.vue 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/system/publicMsg.vue 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/dangetDetail.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/driverDetail.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visReportDetail.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visSubDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/App.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/manifest.json 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/index.vue 186 ●●●● 补丁 | 查看 | 原始文档 | 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 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorApprove.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorReport.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/applePeo.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACar.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/sendACarDetail.vue 1144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shinei.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/vehicle/shiwai.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_fangkebaobei@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_huiyishiguanli@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_kaoqin@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_paichejilu@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_renwuzhongxin@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_wodehuiyi@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_xiugaimima@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_yinhuansuishoupai@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_yongcheshenqing@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5/static/home/ic_yuyuehuiyishi@3x.png 补丁 | 查看 | 原始文档 | blame | 历史
h5_meeting/unpackage/release/apk/会议室.apk 补丁 | 查看 | 原始文档 | blame | 历史
pda/api/index.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/manifest.json 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/SubDetail.vue 466 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/center.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/queueup.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/ic_passed@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/ic_refused@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/staff/ic_chaosong@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/staff/ic_shenpiren@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/staff/liucheng_fail@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/static/staff/liucheng_success@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/release/apk/__UNI__8789FB4__20241018164933.apk 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/release/apk/pda.apk 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/1024x1024.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/120x120.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/144x144.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/152x152.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/167x167.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/180x180.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/192x192.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/20x20.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/29x29.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/40x40.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/58x58.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/60x60.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/72x72.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/76x76.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/80x80.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/87x87.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/96x96.png 补丁 | 查看 | 原始文档 | 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/business/OperaCarUseBookWindow.vue
@@ -1,18 +1,14 @@
<template>
  <GlobalWindow
      :title="title"
      :visible.sync="visible"
      @confirm="confirm"
  >
  <GlobalWindow :title="title" :visible.sync="visible" @confirm="confirm">
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <div class="left">
            <div class="h1">公务车申请</div>
            <div class="time">提交时间:{{model.createDate}}</div>
            <div class="time">提交时间:{{ model.createDate }}</div>
          </div>
          <span class="right"  v-if="model.status === 0">申请中</span>
          <span class="right"  v-if="model.status === 1">审批中</span>
          <span class="right" v-if="model.status === 0">申请中</span>
          <span class="right" v-if="model.status === 1">审批中</span>
          <span class="right" style="background:#53b76f " v-if="model.status === 2">审批通过</span>
          <span class="right" style="background:#dc362e " v-if="model.status === 3">审批不通过</span>
          <span class="right" style="background:#B2B2B2; " v-if="model.status === 4">已撤销</span>
@@ -22,86 +18,98 @@
          <div class="list">
            <div class="item" style="width: 100%">
              <div class="label">申请人</div>
              <div class="value">{{model.memberName || ''}} {{model.memberPhone || ''}} ({{model.companyName || ''}})</div>
              <div class="value">{{ model.memberName || '' }} {{ model.memberPhone || '' }} ({{ model.companyName || '' }})
              </div>
            </div>
            <div class="item">
              <div class="label">申请车辆</div>
              <div class="value">{{model.carCode || ''}}</div>
              <div class="value">{{ model.carCode || '' }}</div>
            </div>
            <div class="item">
              <div class="label">司机信息</div>
              <div class="value" v-if="model.driverId !=null">{{model.driverName || ''}} {{model.driverPhone || ''}}</div>
              <div class="value" v-if="model.driverId ==null">未指派</div>
              <div class="value" v-if="model.driverId != null">{{ model.driverName || '' }} {{ model.driverPhone || '' }}
              </div>
              <div class="value" v-if="model.driverId == null">未指派</div>
            </div>
            <div class="item"  >
            <div class="label">用车事由</div>
            <div class="value">{{model.content}}</div>
          </div>
            <div class="item">
              <div class="label">用车事由</div>
              <div class="value">{{ model.content }}</div>
            </div>
            <div class="item">
              <div class="label">乘车人员</div>
              <div class="value">{{model.memberNames || ''}}</div>
              <div class="value">{{ model.memberNames || '' }}</div>
            </div>
            <div class="item">
              <div class="label">目的地类别</div>
              <div class="value status-green" v-if="model.type == 0">【市内用车】</div>
              <div class="value status-red"   v-if="model.type == 1">【市外用车】</div>
              <div class="value status-red" v-if="model.type == 1">【市外用车】</div>
            </div>
            <div class="item">
              <div class="label">目的地</div>
              <div class="value">{{model.addr || ''}}</div>
              <div class="value">{{ model.addr || '' }}</div>
            </div>
            <div class="item">
              <div class="label">预计出发时间</div>
              <div class="value">{{model.planUseDate || ''}}</div>
              <div class="value">{{ model.planUseDate || '' }}</div>
            </div>
            <div class="item">
              <div class="label">用车时段</div>
              <div class="value">始:{{model.startTime || ''}}<br>æ­¢:{{model.endTime || ''}}</div>
              <div class="value">始:{{ model.startTime || '' }}<br>æ­¢:{{ model.endTime || '' }}</div>
            </div>
          </div>
        </div>
      </div>
      <div class="side">
        <div class="side_title">审批流程</div>
        <div class="list"  v-if="model.approveDateVO !=null && model.approveDateVO.approveList !=null">
          <div class="item" v-for="(item,index) in model.approveDateVO.approveList" :key="item.id">
            <div class="separate" v-if=" (index < model.approveDateVO.approveList.length-1)"></div>
        <div class="list" v-if="
          model.approveDateVO != null && model.approveDateVO.approveList != null
        ">
          <div class="item" v-for="(item, index) in model.approveDateVO.approveList" :key="item.id">
            <div class="separate" v-if="index < model.approveDateVO.approveList.length - 1"></div>
            <div class="info">
              <img src="@/assets/icons/ic_tongguo.png"   class="iconnew" v-if="( item.status ==2)"/>
              <img src="@/assets/icons/ic_dangqian.png"   class="iconnew"  v-if="( item.status==1)"/>
              <img src="@/assets/icons/ic_jujue.png"  class="iconnew"  v-if="( item.status==3)"/>
              <img src="@/assets/icons/ic_grey.png"  class="iconnew" v-if=" (item.status==null || item.status==0 )"/>
              <div style="display: inline" v-if="item.approveType !=1">
                <img v-if="item.faceImg!=null && item.faceImg !=''" :src="item.faceImg" class="avatar" alt="" />
                <img v-if="item.faceImg ==null ||item.faceImg ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
              <img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
              <img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
              <img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
              <div style="display: inline" v-if="item.approveType != 1">
                <img v-if="item.faceImg != null && item.faceImg != ''" :src="item.faceImg" class="avatar" alt="" />
                <img v-if="item.faceImg == null || item.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
                  alt="" />
              </div>
              <div style="display: inline" v-if="item.approveType  == 1">
                <img  v-if="item.type !=1"  src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
                <img v-if="item.type == 1"  src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              <div style="display: inline" v-if="item.approveType == 1">
                <img v-if="item.type != 1" src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
                <img v-if="item.type == 1" src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              </div>
              <div class="content">
                <div class="line">
                  <div class="name">{{ item.title}}</div>
                  <div class="name">{{ item.title }}</div>
                  <div class="time">{{ item.checkDate }}</div>
                </div>
                <div class="line">
                  <div class="company">
                    {{ item.memberName }}
                    <div style="display: inline" v-if="item.statusInfo!=null && item.statusInfo!=''">
                       ï¼ˆ<span class="status-green">{{item.statusInfo ||''}}</span>)
                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                      ï¼ˆ<span :class="{ padding: item.statusInfo == '处理中' || item.status == '1' }">{{
                        item.statusInfo || ""
                      }}</span>)
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div v-if="item.approveType != 1 && item.checkInfo !=null && item.checkInfo !=''" class="remark">
              {{ item.checkInfo || '' }}
            <div v-if="
              item.approveType != 1 &&
              item.checkInfo != null &&
              item.checkInfo != ''
            " class="remark">
              {{ item.checkInfo || "" }}
            </div>
            <div v-if="item.approveType == 1 "  class="childList">
            <div v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="childList">
              <div class="m_content company" v-for="item1 in item.approveList" :key="item1.id">
                <img v-if="item1.faceImg!=null && item1.faceImg !=''" :src="item1.faceImg" class="avatar" alt="" />
                <img v-if="item1.faceImg ==null ||item1.faceImg ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
                <span > {{item1.memberName}}</span>
                <img v-if="item1.faceImg != null && item1.faceImg != ''" :src="item1.faceImg" class="avatar" alt="" />
                <img v-if="item1.faceImg == null || item1.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
                  alt="" />
                <span> {{ item1.memberName }}</span>
              </div>
            </div>
          </div>
@@ -109,38 +117,27 @@
      </div>
    </div>
    <!--  -->
    <template   v-slot:footer>
      <el-button @click="agreeOpen"  type="primary"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  class="status-red">同意</el-button>
      <el-button @click="jectOpen"  type="danger"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  >拒绝</el-button>
      <el-button @click="visible=false">返回</el-button>
    <template v-slot:footer>
      <el-button @click="agreeOpen" type="primary"
        v-if="model.approveDateVO != null && model.approveDateVO.canBeApproved != null && model.approveDateVO.canBeApproved == 1"
        class="status-red">同意</el-button>
      <el-button @click="jectOpen" type="danger"
        v-if="model.approveDateVO != null && model.approveDateVO.canBeApproved != null && model.approveDateVO.canBeApproved == 1">拒绝</el-button>
      <el-button @click="visible = false">返回</el-button>
    </template>
    <el-dialog
        append-to-body
        title="同意申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isShowProblem"
        width="480px"
    >
      <el-form :model="dealForm" :rules="rules" ref="dealForm" >
    <el-dialog append-to-body title="同意申请" style="text-align: center" class="dialogCl" :visible.sync="isShowProblem"
      width="480px">
      <el-form :model="dealForm" :rules="rules" ref="dealForm">
        <!-- <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam === 1"> -->
        <el-form-item label="派车司机" prop="driverId" v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 1">
          <el-select v-model="dealForm.driverId" style="width: 300px"  filterable clearable placeholder="请选择派遣司机">
            <el-option
                v-for="item in memberList"
                :key="item.id"
                :label="item.name+'-'+item.phone"
                :value="item.id">
        <el-form-item label="派车司机" prop="driverId"
          v-if="model.approveDateVO != null && model.approveDateVO.driverParam == 1">
          <el-select v-model="dealForm.driverId" style="width: 300px" filterable clearable placeholder="请选择派遣司机">
            <el-option v-for="item in memberList" :key="item.id" :label="item.name + '-' + item.phone" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="同意说明">
          <el-input
              type="textarea"
              placeholder="请填写说明"
              :rows="4"
              v-model="dealForm.checkInfo"
          />
          <el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="dealForm.checkInfo" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
@@ -148,26 +145,15 @@
        <el-button type="primary" :loading="dealing" @click="dealDo">确定</el-button>
      </span>
    </el-dialog>
    <el-dialog
        append-to-body
        title="拒绝申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isBackProblem"
        width="600px"
    >
      <el-form :model="backForm"  ref="backForm" label-width="100px">
    <el-dialog append-to-body title="拒绝申请" style="text-align: center" class="dialogCl" :visible.sync="isBackProblem"
      width="600px">
      <el-form :model="backForm" ref="backForm" label-width="100px">
        <el-form-item label="拒绝说明">
          <el-input
              type="textarea"
              placeholder="请填写说明"
              :rows="4"
              v-model="backForm.checkInfo"
          />
          <el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="backForm.checkInfo" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isBackProblem= false">取消</el-button>
        <el-button @click="isBackProblem = false">取消</el-button>
        <el-button type="primary" :loading="dealing" @click="backDo">确定</el-button>
      </span>
    </el-dialog>
@@ -184,12 +170,12 @@
  name: 'OperaCarUseBookWindow',
  components: { GlobalWindow },
  extends: BaseOpera,
  data () {
  data() {
    return {
      title: '公务车申请',
      visible: false,
      dataId: null,
      model: { },
      model: {},
      dealing: false,
      isShowProblem: false,
      isBackProblem: false,
@@ -209,14 +195,14 @@
  computed: {
    ...mapState(['userInfo'])
  },
  created () {
  created() {
    this.config({
      api: '/business/carUseBook',
      'field.id': 'id'
    })
  },
  methods: {
    dealDo () {
    dealDo() {
      this.$refs.dealForm.validate((valid) => {
        if (!valid) {
          return
@@ -242,18 +228,18 @@
          })
      })
    },
    agreeOpen () {
    agreeOpen() {
      this.isShowProblem = true
      this.$set(this.dealForm, 'checkInfo', '')
      this.loadMemberList()
    },
    jectOpen () {
    jectOpen() {
      this.isBackProblem = true
      this.backForm = {
        checkInfo: null
      }
    },
    backDo () {
    backDo() {
      this.$refs.backForm.validate((valid) => {
        if (!valid) {
          return
@@ -275,7 +261,7 @@
          })
      })
    },
    open (title, target) {
    open(title, target) {
      this.title = title
      this.visible = true
      this.model = {}
@@ -292,14 +278,26 @@
        this.getDetail()
      })
    },
    getDetail () {
    getDetail() {
      this.api.detail(this.dataId)
        .then(res => {
          this.model = res
          if (this.model.approveDateVO && this.model.approveDateVO.approveList.length > 0) {
            this.model.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 = []
              }
            })
          }
          this.dealForm.driveId = res.driveId
        })
    },
    loadMemberList () {
    loadMemberList() {
      driveList({}).then(res => {
        this.memberList = res
      })
@@ -309,6 +307,8 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.upload_box {
  width: 84px;
  height: 84px;
@@ -320,14 +320,17 @@
  align-items: center;
  color: #999999;
  border: 1px solid #e4e4e4;
  .icon {
    font-size: 24px;
  }
  .text {
    font-size: 12px;
  }
}
.side_title{
.side_title {
  font-weight: 600;
  font-size: 18px;
  color: #111111;
@@ -335,9 +338,11 @@
  margin-left: 20px;
  margin-top: 20px;
}
.modal_wrap {
  display: flex;
  height: 100%;
  .modal_content {
    flex: 1;
    padding: 0px 30px;
@@ -352,6 +357,7 @@
      margin-bottom: 20px;
      margin-top: 30px;
    }
    .info {
      .list {
        display: flex;
@@ -361,6 +367,7 @@
          display: flex;
          width: 40%;
          margin-bottom: 20px;
          &:nth-of-type(2n) {
            width: 60%;
          }
@@ -410,20 +417,24 @@
        border-radius: 16px 0px 16px 0px;
      }
    }
    .table_info {
      .name_wrap {
        display: flex;
        align-items: center;
        .avatar {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          margin-right: 12px;
        }
        .content {
          .line {
            display: flex;
          }
          .tag {
            color: #b2cbf9;
            border: 1px solid #b2cbf9;
@@ -441,17 +452,20 @@
    width: 420px;
    background: #ffffff;
    border-left: 20px solid #f7f7f7;
    .list {
      .item {
        padding: 8px 0;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
          left: 31px;
          height: calc(100% - 36px);
          height: calc(100% - 30px);
          top: 49px;
        }
        .avatar {
          width: 40px;
          height: 40px;
@@ -459,75 +473,98 @@
          margin: 0 12px 0 16px;
          //border: 1px solid;
        }
        .childList{
        .childList {
          display: flex;
          flex-wrap: wrap;
          margin-left: 100px;
        }
        .company {
          font-size: 13px;
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
        .m_content{
        .m_content {
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          margin-bottom: 4px;
        }
        .info {
          display: flex;
          align-items: center;
          margin-left: 20px;
          .icon {
            position: relative;
            z-index: 11;
            color: #53b76f;
            font-size: 24px;
          }
          .icon1 {
            position: relative;
            z-index: 11;
            color: deepskyblue;
            font-size: 24px;
          }
          .icon2 {
            position: relative;
            z-index: 11;
            color: #dc362e;
            font-size: 24px;
          }
          .iconnew{
          .iconnew {
            width: 24px;
            height: 24px;
          }
          .icon3 {
            position: relative;
            z-index: 11;
            color:gray;
            color: gray;
            font-size: 24px;
          }
          .content {
            flex: 1;
            .line {
              display: flex;
              justify-content: space-between;
              align-content: center;
              margin-bottom: 6px;
              .status {
                color: #888888;
              }
              .padding {
                color: $primaryColor;
              }
              .name {
                font-weight: 600;
                font-size: 16px;
                color: #111111;
              }
              .time {
                color: #888888;
              }
            }
          }
        }
        .remark {
          background: #f7f7f7;
          border-radius: 4px;
@@ -535,7 +572,6 @@
          color: #666666;
          margin-left: 100px;
        }
      }
    }
  }
admin/src/components/business/OperaHiddenDangerWindow.vue
@@ -551,6 +551,7 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.side_title{
  font-weight: 600;
  font-size: 18px;
@@ -748,7 +749,7 @@
                font-size: 13px;
                color: #888888;
                .status {
                  color: #00ba67;
                  color: $primaryColor;
                }
              }
            }
admin/src/components/business/OperaPlatformApproveTemplWindow.vue
@@ -82,7 +82,7 @@
              <!-- æŠ„送人 -->
              <template v-if="apprList[activeIndex].type == '1'">
                <div class="config_data_item_reviewed_content">
                  <div v-for="(mem,memIndex) in apprList[activeIndex].objIds" :key="mem.id"
                  <div v-for="(mem, memIndex) in apprList[activeIndex].objIds" :key="mem.id"
                    class="config_data_item_reviewed_content_item">
                    <span>{{ mem.name }}</span>
                    <i @click="memDel(memIndex)" class="el-icon-close"></i>
@@ -163,7 +163,7 @@
            ">
              ä¼ä¸šç»„织架构
            </div>
            <div style="width: 100%; height: 100%; overflow-y: scroll">
            <div style="width: 100%; max-height: 560px; overflow-y: scroll">
              <Tree :list="companyTree" :defaultProps="{
                name: 'name',
                status: 'fsStatus',
@@ -172,7 +172,7 @@
              }" @callback="callback" />
            </div>
          </div>
          <el-transfer filterable  :titles="['未选', '已选']" openAll :props="{ label: 'name', key: 'keyTemp' }"
          <el-transfer filterable :titles="['未选', '已选']" openAll :props="{ label: 'name', key: 'keyTemp' }"
            filter-placeholder="搜索员工" v-model="searchForm.objIds" :data="memberList" class="transfer">
          </el-transfer>
        </div>
@@ -207,7 +207,7 @@
      activeType: '6',
      subLoading: false,
      apprList: [
        { remark: '审批人', active: false,approveType: 0, memberType: 1, type: '1', objIds: [] },
        { remark: '审批人', active: false, approveType: 0, memberType: 1, type: '1', objIds: [] },
        { remark: '抄送人', active: false, type: '1', objIds: [] }
      ],
      activeIndex: 0,
@@ -230,7 +230,7 @@
      this.getfindCompanyTreePage()
      this.apprList = [
        { remark: '审批人', active: false, type: '0', memberType: 1, objIds: [] },
        { remark: '抄送人', active: false,approveType: 0, type: '1', objIds: [] }
        { remark: '抄送人', active: false, approveType: 0, type: '1', objIds: [] }
      ]
      this.param = {}
      this.searchForm = {}
@@ -313,7 +313,7 @@
      this.activeIndex = 0
    },
    handleAddAppr() {
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人',approveType: 0, active: false, memberType: 1, type: 0, objIds: [] })
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人', approveType: 0, active: false, memberType: 1, type: 0, objIds: [] })
      // this.apprList.push({ remark: '审批人', active: false, type: '0' })
    },
    // èŽ·å–ç»„ç»‡æ ‘
@@ -338,11 +338,11 @@
          erpOrgId: '',
          hasFace: '',
          hkStatus: '',
          includeChild: false,
          includeChild: true,
          type: 2
        },
        page: 1,
        capacity: 30
        capacity: 300
      }).then(res => {
        this.memberList = res.records || []
        this.memberList.forEach(item => {
@@ -658,10 +658,12 @@
    display: flex;
    justify-content: center;
    align-items: center;
    ::v-deep .el-transfer-panel{
    ::v-deep .el-transfer-panel {
      flex: 1;
      height: 100%;
    }
    ::v-deep .el-transfer-panel__body {
      height: 500px;
    }
admin/src/components/common/CommonHeader.vue
@@ -19,61 +19,35 @@
        <el-dropdown v-if="isLogined" trigger="click">
          <span class="el-dropdown-link">
            <!-- <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> -->
            <img
              v-if="userInfo != null"
              style="width: 30px !important"
              src="@/assets/avatar/man.png"
              alt=""
            />{{ userInfo | displayName
            <img v-if="userInfo != null" style="width: 30px !important" src="@/assets/avatar/man.png" alt="" />{{
              userInfo | displayName
            }}<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item @click.native="changePwd"
              >修改密码</el-dropdown-item
            >
            <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>
            <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </div>
    </div>
    <!-- ä¿®æ”¹å¯†ç  -->
    <GlobalAlertWindow
      title="修改密码"
      :visible.sync="visible.changePwd"
      @confirm="confirmChangePwd"
      @close="visible.changePwd = false"
    >
      <el-form
        :model="changePwdData.form"
        ref="changePwdDataForm"
        :rules="changePwdData.rules"
      >
    <GlobalAlertWindow title="修改密码" :visible.sync="visible.changePwd"
      :showClose="!userInfo.needChangePwd || userInfo.needChangePwd == '1'"
      :showCancel="!userInfo.needChangePwd || userInfo.needChangePwd == '1'" @confirm="confirmChangePwd"
      @close="visible.changePwd = false">
      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
        <el-form-item label="原始密码" prop="oldPwd" required>
          <el-input
            v-model="changePwdData.form.oldPwd"
            type="password"
            placeholder="请输入原始密码"
            maxlength="30"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请输入原始密码" maxlength="30"
            show-password></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPwd" required>
          <el-input
            v-model="changePwdData.form.newPwd"
            type="password"
            placeholder="请输入新密码"
            maxlength="30"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码,密码需包含字母、数字及特殊字符中的至少两种" maxlength="20"
            show-password></el-input>
        </el-form-item>
        <!-- <div style="font-size: 12px;color:#999999">密码需包含字母、数字及特殊字符中的至少两种</div> -->
        <el-form-item label="确认新密码" prop="confirmPwd" required>
          <el-input
            v-model="changePwdData.form.confirmPwd"
            type="password"
            placeholder="请再次输入新密码"
            maxlength="30"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="请再次输入新密码" maxlength="20"
            show-password></el-input>
        </el-form-item>
      </el-form>
    </GlobalAlertWindow>
@@ -119,7 +93,8 @@
            { required: true, message: '请输入原始密码' }
          ],
          newPwd: [
            { required: true, message: '请输入新密码' }
            { required: true, message: '请输入密码', trigger: 'blur' },
            { validator: this.validatePassword, trigger: 'blur' },
          ],
          confirmPwd: [
            { required: true, message: '请再次输入新密码' }
@@ -133,6 +108,13 @@
    // title () {
    //   return this.$route.meta.title
    // }
  },
  mounted() {
    // console.log('userInfo',this.userInfo);
    if (!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0') {
      // this.visible.changePwd = true
    }
  },
  filters: {
    // å±•示名称
@@ -155,9 +137,29 @@
        this.$refs.changePwdDataForm.resetFields()
      })
    },
    getHeaderNav(type){
    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 => {
        window.open(res, "_blank");
        window.open(res, "_blank")
      })
    },
    // ç¡®å®šä¿®æ”¹å¯†ç 
@@ -185,7 +187,7 @@
            this.visible.changePwd = false
          })
          .catch(e => {
           //  this.$tip.apiFailed(e)
            //  this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking.changePwd = false
@@ -211,15 +213,18 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.common-header {
  background-color: #2080f7;
}
.list{
.list {
  flex: 1;
  display: flex;
  align-items: center;
  margin-left: 60px;
  .item{
  .item {
    margin-right: 40px;
    font-size: 16px;
    font-weight: 400;
@@ -229,16 +234,19 @@
    justify-content: flex-start;
    height: 40px;
    cursor: pointer;
    .linellae{
    .linellae {
      width: 64px;
      height: 2px;
      background: #FFFFFF;
    }
  }
  .active{
  .active {
    font-weight: 500;
  }
}
.header {
  overflow: hidden;
  // background: #fff;
@@ -259,9 +267,11 @@
    color: #fff;
    display: flex;
    align-items: center;
    .title{
    .title {
      width: 200px;
    }
    // display: inline;
    .title-en {
      font-size: 11px;
@@ -269,6 +279,7 @@
      color: rgb(202, 214, 238);
    }
  }
  .user {
    width: 212px;
    box-sizing: border-box;
@@ -277,10 +288,13 @@
    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;
    }
    img {
      width: 32px;
      position: relative;
@@ -289,9 +303,11 @@
    }
  }
}
// ä¸‹æ‹‰èœå•框
.el-dropdown-menu {
  width: 140px;
  .el-dropdown-menu__item:hover {
    background: #e3edfb;
    color: $primary-color;
admin/src/components/common/GlobalAlertWindow.vue
@@ -6,8 +6,10 @@
    :with-header="true"
    :width="width"
    :close-on-press-escape="false"
    :close-on-click-modal="false"
    :wrapper-closable="false"
    :append-to-body="true"
    :show-close="!showClose"
    @close="close"
  >
    <div slot="title" class="window__header">
@@ -19,7 +21,7 @@
    <div v-if="withFooter" class="window__footer">
      <slot name="footer">
        <el-button @click="confirm" :loading="confirmWorking" type="primary">确定</el-button>
        <el-button @click="close">取消</el-button>
        <el-button v-if="!showCancel" @click="close">取消</el-button>
      </slot>
    </div>
  </el-dialog>
@@ -33,6 +35,14 @@
      type: String,
      default: '50%'
    },
    showClose: {
      type: Boolean,
      default: false
    },
    showCancel: {
      type: Boolean,
      default: false
    },
    // æ˜¯å¦åŒ…含底部操作
    withFooter: {
      type: Boolean,
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">
@@ -587,32 +587,41 @@
    div {
      line-height: 28px;
    }
  }
  }
}
.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 {
      color: #fff;
      background: #cccccc;
    border-color: #bed6f9;
    background-color: #bed6f9;
    color: #fff;
    }
}
.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"
  >
    <p class="tip">正在为角色【 <em>{{role.name || '-'}}</em>】 é…ç½®æ•°æ®æƒé™</p>
  <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>
@@ -38,13 +22,13 @@
import GlobalWindow from '@/components/common/GlobalWindow'
import { createRoleDataPermission } from '@/api/system/role'
import { fetchList } from '@/api/business/company'
  // import the styles
// import the styles
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
  name: 'OperaSystemRoleWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
  data() {
    return {
      options: [
        { name: '全部', id: 0 },
@@ -71,11 +55,11 @@
        value: 'id',
        emitPath: false
      },
      role:{},
      role: {},
      departments: []
    }
  },
  created () {
  created() {
    this.config({
      api: '/system/role',
      'field.id': 'id'
@@ -84,18 +68,18 @@
  },
  methods: {
    // éƒ¨é—¨æ ‘状结构数据
    treeComList () {
    treeComList() {
      fetchList()
        .then(res => {
          // this.departments = this.tree([res])
          this.departments =this.newTree(res)
          this.departments = this.newTree(res)
        })
    },
    open (title, target,role) {
    open(title, target, role) {
      // console.log(title, target)
      this.title = title
      this.visible = true
      this.role=role
      this.role = role
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
@@ -109,33 +93,33 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        console.log(target);
        if (target.customData === undefined ||target.customData === null || target.customData === '') {
        console.log(target)
        if (target.customData === undefined || target.customData === null || target.customData === '') {
          this.form.customData = []
        } else {
          const customD  = this.form.customData.split(',')
          const customD = this.form.customData.split(',')
          this.form.customData = customD.map((item) => { return parseInt(item) })
        }
      })
    },
    newTree(tree) {
      if(tree ==null){
      if (tree == null) {
        return []
      }
      return tree.map(item => {
        let newItem = {...item}
        if(newItem){
          newItem.children=newItem.childList
        let newItem = { ...item }
        if (newItem) {
          newItem.children = newItem.childList
        }
        if (item.children && item.children.length == 0) {
          this.$delete( newItem, 'children' )
          this.$delete(newItem, 'children')
        } else {
          newItem.children = this.newTree(newItem.children)
        }
        return newItem
      });
      })
    },
    __confirmCreate () {
    __confirmCreate() {
      // console.log(JSON.stringify(this.form.customData));
      // return
      this.$refs.form.validate((valid) => {
@@ -164,7 +148,7 @@
          })
      })
    },
    __confirmEdit () {
    __confirmEdit() {
      // console.log(JSON.stringify(this.form.customData));
      // return
      this.$refs.form.validate((valid) => {
@@ -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"
  >
    <p class="tip" v-if="role != null">为角色 <em>{{role.name}}</em> é…ç½®æƒé™</p>
  <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>
@@ -31,7 +18,7 @@
export default {
  name: 'PermissionConfigWindow',
  components: { GlobalWindow },
  data () {
  data() {
    return {
      visible: false,
      isWorking: false,
@@ -47,7 +34,7 @@
    /**
     * @role è§’色对象
     */
    open (role) {
    open(role) {
      if (this.$refs.permissionTransfer) {
        this.$refs.permissionTransfer.clearQuery('left')
        this.$refs.permissionTransfer.clearQuery('right')
@@ -72,7 +59,7 @@
        })
    },
    // ç¡®è®¤é€‰æ‹©æƒé™
    confirm () {
    confirm() {
      this.isWorking = true
      createRolePermission({
        roleId: this.role.id,
@@ -91,7 +78,7 @@
        })
    },
    // æœç´¢æƒé™
    filterPermissions (query, item) {
    filterPermissions(query, item) {
      const lowerCaseQuery = query.toLowerCase()
      return item.code.toLowerCase().indexOf(lowerCaseQuery) > -1 || item.name.toLowerCase().indexOf(lowerCaseQuery) > -1
    }
@@ -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/business/approvalConfiguration.vue
@@ -20,45 +20,35 @@
              <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
            </div>
            <div v-for="(item, index) in apprList" :key="index">
              <div
                class="item yellow"
                :class="{
                  active: activeIndex == index,
                  blue: item.type == '1',
                }"
                @click="flowClick(index)"
              >
              <div class="item yellow" :class="{
                active: activeIndex == index,
                blue: item.type == '1',
              }" @click="flowClick(index)">
                <div class="head">{{ item.remark }}</div>
                <div class="content">
                  <!-- å®¡æ‰¹ -->
                  <template v-if="item.type == 0">
                    <template v-if="item.memberType == '0'">
                    <div>被访人</div>
                  </template>
                      <div>被访人</div>
                    </template>
                    <template v-if="item.memberType == '2'">
                      <div>部门主管</div>
                    </template>
                    <template v-if="item.memberType == '1'">
                      <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                        <span>{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else>请选择</div>
                      <i class="el-icon-arrow-right"></i>
@@ -67,19 +57,14 @@
                  <!-- æŠ„送 -->
                  <template v-if="item.type == 1">
                    <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                      </div>
                      <div v-else>请选择</div>
                    <i
                      v-if="item.memberType == '1'"
                      class="el-icon-arrow-right"
                    ></i>
                      <span>{{ item.objIds[0].name }}
                        {{ item.objIds[0].companyName }}</span>
                    </div>
                    <div v-else-if="item.objIds && item.objIds.length > 1">
                      <span>{{ item.objIds[0].name }} ç­‰</span>
                    </div>
                    <div v-else>请选择</div>
                    <i v-if="item.memberType == '1'" class="el-icon-arrow-right"></i>
                  </template>
                </div>
              </div>
@@ -88,11 +73,7 @@
                  <div class="line"></div>
                  <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
                </template>
                <i
                  v-if="apprList.length - 2 === index"
                  @click="handleAddAppr()"
                  class="el-icon-circle-plus add"
                ></i>
                <i v-if="apprList.length - 2 === index" @click="handleAddAppr()" class="el-icon-circle-plus add"></i>
              </div>
            </div>
          </div>
@@ -102,118 +83,74 @@
            <div class="config_data_item_label">选择该节点的审批人</div>
            <div class="df_ac mb10">
              <div>审批节点名称</div>
              <el-input
                class="w200 ml10"
                v-model="apprList[activeIndex].remark"
              ></el-input>
              <el-input class="w200 ml10" v-model="apprList[activeIndex].remark"></el-input>
            </div>
            <!-- æŠ„送人 -->
            <template v-if="apprList[activeIndex].type == '1'">
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="mem, memIndex in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="mem, memIndex in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i @click="memDel(memIndex)" class="el-icon-close"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </template>
            <el-radio-group
              v-if="apprList[activeIndex].type == '0'"
              v-model="apprList[activeIndex].memberType"
            >
            <el-radio-group v-if="apprList[activeIndex].type == '0'" v-model="apprList[activeIndex].memberType">
              <el-radio :label="0">被访人</el-radio>
              <el-radio :label="1">指定人员</el-radio>
              <el-radio :label="2">部门主管</el-radio>
            </el-radio-group>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 1"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 1">
              <div class="config_data_item_reviewed_label">
                <span>指定审核人</span>
                <span>不超过20人</span>
              </div>
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="mem,memIndex in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="mem, memIndex in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i class="el-icon-close" @click="memDel(memIndex)"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </div>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 2"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 2">
              <div class="config_data_item_reviewed_label">
                <span>部门主管</span>
              </div>
              <div class="config_data_item_reviewed_r">
                <span>被访人的</span>
                <el-select
                  v-model="apprList[activeIndex].objLevel"
                  placeholder="请选择"
                  style="margin: 0 20px 0 10px"
                >
                <el-select v-model="apprList[activeIndex].objLevel" placeholder="请选择" style="margin: 0 20px 0 10px">
                  <el-option label="直接主管" :value="0" />
                  <el-option label="二级主管" :value="1" />
                  <el-option label="三级主管" :value="2" />
                  <el-option label="四级主管" :value="4" />
                </el-select>
                <el-checkbox
                  v-model="apprList[activeIndex].noleaderOpt"
                  :true-label="1"
                  :false-label="0"
                  >找不到主管时,由上级主管代审核</el-checkbox
                >
                <el-checkbox v-model="apprList[activeIndex].noleaderOpt" :true-label="1"
                  :false-label="0">找不到主管时,由上级主管代审核</el-checkbox>
              </div>
            </div>
          </div>
          <div
            class="config_data_item"
            v-if="
              (apprList[activeIndex].memberType == 1 ||
                apprList[activeIndex].memberType == 2) &&
              apprList[activeIndex].type == '0'
            "
          >
          <div class="config_data_item" v-if="
            (apprList[activeIndex].memberType == 1 ||
              apprList[activeIndex].memberType == 2) &&
            apprList[activeIndex].type == '0'
          ">
            <div class="config_data_item_label">
              å®¡æ‰¹æ–¹å¼
              <span>审批人为多个时,采用的审批方式</span>
            </div>
            <el-radio-group
              v-model="apprList[activeIndex].approveType"
              style="display: flex; flex-direction: column"
            >
              <el-radio :label="0" style="margin-bottom: 20px"
                >或签(其中一名审批人同意或拒绝即可)</el-radio
              >
            <el-radio-group v-model="apprList[activeIndex].approveType" style="display: flex; flex-direction: column">
              <el-radio :label="0" style="margin-bottom: 20px">或签(其中一名审批人同意或拒绝即可)</el-radio>
              <el-radio :label="1">会签(所有审批人都同意才可通过)</el-radio>
            </el-radio-group>
          </div>
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
            >
            <el-button
              v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1"
              type="danger"
              plain
              @click="handleDel"
              >删除节点</el-button
            >
            <el-button @click="onSubmit" :loading="subLoading" style="background: #435ebe"
              type="primary">保存配置项</el-button>
            <el-button v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1" type="danger" plain
              @click="handleDel">删除节点</el-button>
          </div>
        </div>
      </div>
@@ -222,41 +159,27 @@
    <el-dialog title="选择员工" :visible.sync="isShowTransfer" width="1000px">
      <div class="staff_modal">
        <div class="left">
          <div
            style="
          <div style="
              width: 100%;
              height: 50px;
              background: rgba(242, 242, 242, 1);
              line-height: 50px;
              text-align: center;
              font-size: 14px;
            "
          >
            ">
            ä¼ä¸šç»„织架构
          </div>
          <div style="width: 100%; height: 100%; overflow-y: scroll">
            <Tree
              :list="companyTree"
              :defaultProps="{
                name: 'name',
                status: 'fsStatus',
                children: 'childList',
                id: 'id',
              }"
              @callback="callback"
            />
          <div style="width: 100%; max-height: 560px; overflow-y: scroll">
            <Tree :list="companyTree" :defaultProps="{
              name: 'name',
              status: 'fsStatus',
              children: 'childList',
              id: 'id',
            }" @callback="callback" />
          </div>
        </div>
        <el-transfer
          filterable
          :title="['未选', '已选']"
          openAll
          :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工"
          v-model="searchForm.objIds"
          :data="memberList"
          class="transfer"
        >
        <el-transfer filterable :title="['未选', '已选']" openAll :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工" v-model="searchForm.objIds" :data="memberList" class="transfer">
        </el-transfer>
      </div>
      <span slot="footer" class="dialog-footer">
@@ -280,7 +203,7 @@
    TableLayout,
    Tree
  },
  data () {
  data() {
    return {
      activeType: '0',
      subLoading: false,
@@ -297,12 +220,12 @@
      companyTree: []
    }
  },
  created () {
  created() {
    this.getfindCompanyTreePage()
    this.initDate()
  },
  methods: {
    handleClick () {
    handleClick() {
      this.apprList = []
      const arr = [
        { remark: '审批人', active: false, type: 0, objIds: [] },
@@ -311,12 +234,12 @@
      this.apprList = [...arr]
      this.initDate()
    },
    flowClick (i) {
    flowClick(i) {
      this.activeIndex = i
      this.apprList.forEach((item, index) => {
        if (i === index) {
          item.active = true
          console.log("====================",item.objIds)
          console.log("====================", item.objIds)
          if (item.objIds && item.objIds.length > 0) {
            const objIds = item.objIds.map(i => {
              return `${i.id}-${i.name}${i.companyName ? '-' + i.companyName : ''}`
@@ -330,7 +253,7 @@
        }
      })
    },
    initDate () {
    initDate() {
      const { activeType } = this
      approveTemplByType(activeType).then(res => {
        if (res && res.paramList) {
@@ -344,7 +267,7 @@
                  companyName: i.companyName
                }
              })
            }else{
            } else {
              item.objIds = []
            }
          })
@@ -356,7 +279,7 @@
        // console.log(res);
      })
    },
    onSubmit () {
    onSubmit() {
      const { apprList, activeType } = this
      const temp = JSON.parse(JSON.stringify(apprList))
      temp.forEach((item, index) => {
@@ -378,18 +301,18 @@
        this.subLoading = false
      })
    },
    handleDel () {
    handleDel() {
      const { activeIndex } = this
      this.apprList.splice(activeIndex, 1)
      this.activeIndex = 0
    },
    handleAddAppr () {
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人',approveType: 0, active: false, type: 0, objIds: [] })
    handleAddAppr() {
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人', approveType: 0, active: false, type: 0, objIds: [] })
      // this.apprList.push({ remark: '审批人', active: false, type: '0' })
    },
    // èŽ·å–ç»„ç»‡æ ‘
    getfindCompanyTreePage () {
    getfindCompanyTreePage() {
      fetchList()
        .then(res => {
          if (res && res.length > 0) {
@@ -401,7 +324,7 @@
          }
        })
    },
    getMemberList () {
    getMemberList() {
      memberListPost({
        model: {
          companyId: this.searchForm.companyId || '',
@@ -410,11 +333,11 @@
          erpOrgId: '',
          hasFace: '',
          hkStatus: '',
          includeChild: false,
          includeChild: true,
          type: 2
        },
        page: 1,
        capacity: 30
        capacity: 300
      }).then(res => {
        this.memberList = res.records || []
        this.memberList.forEach(item => {
@@ -423,13 +346,13 @@
        // console.log('defaultProps', res)
      })
    },
    callback (row) {
    callback(row) {
      console.log(row)
      this.$set(this.searchForm, 'companyId', row.id)
      this.$set(this.searchForm, 'erpOrgId', row.erpId)
      this.getMemberList()
    },
    TransferSub () {
    TransferSub() {
      const { activeIndex } = this
      if (this.searchForm.objIds && this.searchForm.objIds.length > 0) {
        if (this.searchForm.objIds.length > 20) return this.$message.warning('最多选择20人')
@@ -450,7 +373,7 @@
      this.isShowTransfer = false
      console.log(this.searchForm.objIds)
    },
    memDel (memIndex) {
    memDel(memIndex) {
      const { activeIndex } = this
      this.apprList.forEach((item, index) => {
        if (activeIndex === index) {
@@ -462,11 +385,11 @@
        }
      })
    },
    selStaff () {
    selStaff() {
      this.isShowTransfer = true
      this.getMemberList()
    },
    seleItem (i) {
    seleItem(i) {
      this.list.forEach((item, index) => {
        item.active = index === i
      })
@@ -484,6 +407,7 @@
  display: flex;
  align-items: center;
  justify-content: space-between;
  .config_list {
    width: 543px;
    height: 100%;
@@ -493,18 +417,21 @@
    box-sizing: border-box;
    border: 1px solid #eeeeee;
    background: #f7f7f7;
    .config_list_head {
      width: 100%;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      span {
        font-size: 18px;
        font-weight: 500;
        color: #222222;
      }
    }
    .config_content {
      width: 100%;
      height: calc(100% - 40px);
@@ -514,28 +441,35 @@
      display: flex;
      align-items: center;
      flex-direction: column;
      &::-webkit-scrollbar {
        width: 0;
      }
      .active {
        border: 2px solid #4456ac !important;
      }
      .yellow {
        background: #e89e42 !important;
      }
      .blue {
        background: #5094f3 !important;
      }
      .arrows {
        display: flex;
        flex-direction: column;
        align-items: center;
        position: relative;
        .line {
          width: 1px;
          height: 60px;
          background-color: #ccc;
        }
        .add {
          font-size: 40px;
          color: #2080f7;
@@ -544,10 +478,12 @@
          z-index: 999;
          top: 10px;
        }
        img {
          width: 12px;
        }
      }
      .item {
        width: 200px;
        cursor: pointer;
@@ -558,12 +494,14 @@
        position: relative;
        display: flex;
        flex-direction: column;
        .head {
          height: 32px;
          line-height: 32px;
          padding: 2px 12px;
          color: #fff;
        }
        .content {
          flex: 1;
          background-color: #fff;
@@ -572,32 +510,39 @@
          padding: 0 12px;
          justify-content: space-between;
        }
        &:last-child {
          margin: 0 !important;
        }
      }
    }
  }
  .config_data {
    flex: 1;
    height: 100%;
    margin-left: 20px;
    .config_data_submit {
      margin-top: 50px;
    }
    .config_data_item {
      width: 100%;
      display: flex;
      flex-direction: column;
      margin-bottom: 30px;
      &:last-child {
        margin: 0 !important;
      }
      .config_data_item_label {
        font-size: 16px;
        font-weight: 500;
        color: #222222;
        margin-bottom: 20px;
        span {
          font-size: 12px;
          font-weight: 400;
@@ -605,14 +550,17 @@
          margin-left: 10px;
        }
      }
      .config_data_item_reviewed {
        width: 100%;
        margin-top: 20px;
        .config_data_item_reviewed_r {
          margin-top: 10px;
          width: 100%;
          display: flex;
          align-items: center;
          span {
            flex-shrink: 0;
            font-size: 14px;
@@ -620,15 +568,18 @@
            color: #666666;
          }
        }
        .config_data_item_reviewed_label {
          display: flex;
          align-items: center;
          span {
            &:nth-child(1) {
              font-size: 14px;
              font-weight: 400;
              color: #222222;
            }
            &:nth-child(2) {
              font-size: 12px;
              font-weight: 400;
@@ -641,6 +592,7 @@
    }
  }
}
.config_data_item_reviewed_content {
  width: 400px;
  margin-top: 10px;
@@ -652,6 +604,7 @@
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  .add {
    font-size: 12px;
    font-weight: 400;
@@ -659,6 +612,7 @@
    cursor: pointer;
    margin-top: 3px;
  }
  .config_data_item_reviewed_content_item {
    padding: 3px 5px;
    background: #f4f7fc;
@@ -666,11 +620,13 @@
    box-sizing: border-box;
    margin-right: 10px;
    margin-bottom: 10px;
    span {
      font-size: 12px;
      font-weight: 400;
      color: #333333;
    }
    i {
      color: #949ba2;
      margin-left: 10px;
@@ -678,22 +634,27 @@
    }
  }
}
.staff_modal {
  display: flex;
  .left {
    width: 300px;
    margin-right: 20px;
  }
  .transfer {
    height: 600px;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    ::v-deep .el-transfer-panel{
    ::v-deep .el-transfer-panel {
      flex: 1;
      height: 100%;
    }
    ::v-deep .el-transfer-panel__body {
      height: 500px;
    }
admin/src/views/business/approvalReport.vue
@@ -9,52 +9,42 @@
          <div class="config_content">
            <div class="item">
              <div class="head">发起人</div>
              <div class="content">访客</div>
              <div class="content">被访人</div>
            </div>
            <div class="arrows">
              <div class="line"></div>
              <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
            </div>
            <div v-for="(item, index) in apprList" :key="index">
              <div
                class="item yellow"
                :class="{
                  active: activeIndex == index,
                  blue: item.type == '1',
                }"
                @click="flowClick(index)"
              >
              <div class="item yellow" :class="{
                active: activeIndex == index,
                blue: item.type == '1',
              }" @click="flowClick(index)">
                <div class="head">{{ item.remark }}</div>
                <div class="content">
                  <!-- å®¡æ‰¹ -->
                  <template v-if="item.type == 0">
                    <template v-if="item.memberType == '0'">
                    <div>被访人</div>
                  </template>
                      <div>被访人</div>
                    </template>
                    <template v-if="item.memberType == '2'">
                      <div>部门主管</div>
                    </template>
                    <template v-if="item.memberType == '1'">
                      <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                        <span>{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else>请选择</div>
                      <i class="el-icon-arrow-right"></i>
@@ -63,19 +53,14 @@
                  <!-- æŠ„送 -->
                  <template v-if="item.type == 1">
                    <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                      </div>
                      <div v-else>请选择</div>
                    <i
                      v-if="item.memberType == '1'"
                      class="el-icon-arrow-right"
                    ></i>
                      <span>{{ item.objIds[0].name }}
                        {{ item.objIds[0].companyName }}</span>
                    </div>
                    <div v-else-if="item.objIds && item.objIds.length > 1">
                      <span>{{ item.objIds[0].name }} ç­‰</span>
                    </div>
                    <div v-else>请选择</div>
                    <i v-if="item.memberType == '1'" class="el-icon-arrow-right"></i>
                  </template>
                </div>
              </div>
@@ -84,11 +69,7 @@
                  <div class="line"></div>
                  <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
                </template>
                <i
                  v-if="apprList.length - 2 === index"
                  @click="handleAddAppr()"
                  class="el-icon-circle-plus add"
                ></i>
                <i v-if="apprList.length - 2 === index" @click="handleAddAppr()" class="el-icon-circle-plus add"></i>
              </div>
            </div>
          </div>
@@ -98,118 +79,74 @@
            <div class="config_data_item_label">选择该节点的审批人</div>
            <div class="df_ac mb10">
              <div>审批节点名称</div>
              <el-input
                class="w200 ml10"
                v-model="apprList[activeIndex].remark"
              ></el-input>
              <el-input class="w200 ml10" v-model="apprList[activeIndex].remark"></el-input>
            </div>
            <!-- æŠ„送人 -->
            <template v-if="apprList[activeIndex].type == '1'">
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="mem,memIndex in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="mem, memIndex in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i @click="memDel(memIndex)" class="el-icon-close"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </template>
            <el-radio-group
              v-if="apprList[activeIndex].type == '0'"
              v-model="apprList[activeIndex].memberType"
            >
            <el-radio-group v-if="apprList[activeIndex].type == '0'" v-model="apprList[activeIndex].memberType">
              <el-radio :label="0">被访人</el-radio>
              <el-radio :label="1">指定人员</el-radio>
              <el-radio :label="2">部门主管</el-radio>
            </el-radio-group>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 1"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 1">
              <div class="config_data_item_reviewed_label">
                <span>指定审核人</span>
                <span>不超过20人</span>
              </div>
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="(mem, memIndex) in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="(mem, memIndex) in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i class="el-icon-close" @click="memDel(memIndex)"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </div>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 2"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 2">
              <div class="config_data_item_reviewed_label">
                <span>部门主管</span>
              </div>
              <div class="config_data_item_reviewed_r">
                <span>被访人的</span>
                <el-select
                  v-model="apprList[activeIndex].objLevel"
                  placeholder="请选择"
                  style="margin: 0 20px 0 10px"
                >
                <el-select v-model="apprList[activeIndex].objLevel" placeholder="请选择" style="margin: 0 20px 0 10px">
                  <el-option label="直接主管" :value="0" />
                  <el-option label="二级主管" :value="1" />
                  <el-option label="三级主管" :value="2" />
                  <el-option label="四级主管" :value="4" />
                </el-select>
                <el-checkbox
                  v-model="apprList[activeIndex].noleaderOpt"
                  :true-label="1"
                  :false-label="0"
                  >找不到主管时,由上级主管代审核</el-checkbox
                >
                <el-checkbox v-model="apprList[activeIndex].noleaderOpt" :true-label="1"
                  :false-label="0">找不到主管时,由上级主管代审核</el-checkbox>
              </div>
            </div>
          </div>
          <div
            class="config_data_item"
            v-if="
              (apprList[activeIndex].memberType == 1 ||
                apprList[activeIndex].memberType == 2) &&
              apprList[activeIndex].type == '0'
            "
          >
          <div class="config_data_item" v-if="
            (apprList[activeIndex].memberType == 1 ||
              apprList[activeIndex].memberType == 2) &&
            apprList[activeIndex].type == '0'
          ">
            <div class="config_data_item_label">
              å®¡æ‰¹æ–¹å¼
              <span>审批人为多个时,采用的审批方式</span>
            </div>
            <el-radio-group
              v-model="apprList[activeIndex].approveType"
              style="display: flex; flex-direction: column"
            >
              <el-radio :label="0" style="margin-bottom: 20px"
                >或签(其中一名审批人同意或拒绝即可)</el-radio
              >
            <el-radio-group v-model="apprList[activeIndex].approveType" style="display: flex; flex-direction: column">
              <el-radio :label="0" style="margin-bottom: 20px">或签(其中一名审批人同意或拒绝即可)</el-radio>
              <el-radio :label="1">会签(所有审批人都同意才可通过)</el-radio>
            </el-radio-group>
          </div>
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
            >
            <el-button
              v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1"
              type="danger"
              plain
              @click="handleDel"
              >删除节点</el-button
            >
            <el-button @click="onSubmit" :loading="subLoading" style="background: #435ebe"
              type="primary">保存配置项</el-button>
            <el-button v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1" type="danger" plain
              @click="handleDel">删除节点</el-button>
          </div>
        </div>
      </div>
@@ -218,41 +155,27 @@
    <el-dialog title="选择员工" :visible.sync="isShowTransfer" width="1000px">
      <div class="staff_modal">
        <div class="left">
          <div
            style="
          <div style="
              width: 100%;
              height: 50px;
              background: rgba(242, 242, 242, 1);
              line-height: 50px;
              text-align: center;
              font-size: 14px;
            "
          >
            ">
            ä¼ä¸šç»„织架构
          </div>
          <div style="width: 100%; height: 100%; overflow-y: scroll">
            <Tree
              :list="companyTree"
              :defaultProps="{
                name: 'name',
                status: 'fsStatus',
                children: 'childList',
                id: 'id',
              }"
              @callback="callback"
            />
          <div style="width: 100%; max-height: 560px; overflow-y: scroll">
            <Tree :list="companyTree" :defaultProps="{
              name: 'name',
              status: 'fsStatus',
              children: 'childList',
              id: 'id',
            }" @callback="callback" />
          </div>
        </div>
        <el-transfer
          filterable
          :title="['未选', '已选']"
          openAll
          :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工"
          v-model="searchForm.objIds"
          :data="memberList"
          class="transfer"
        >
        <el-transfer filterable :title="['未选', '已选']" openAll :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工" v-model="searchForm.objIds" :data="memberList" class="transfer">
        </el-transfer>
      </div>
      <span slot="footer" class="dialog-footer">
@@ -276,7 +199,7 @@
    TableLayout,
    Tree
  },
  data () {
  data() {
    return {
      activeType: '2',
      subLoading: false,
@@ -293,12 +216,12 @@
      companyTree: []
    }
  },
  created () {
  created() {
    this.getfindCompanyTreePage()
    this.initDate()
  },
  methods: {
    flowClick (i) {
    flowClick(i) {
      this.activeIndex = i
      this.apprList.forEach((item, index) => {
        if (i === index) {
@@ -316,7 +239,7 @@
        }
      })
    },
    initDate () {
    initDate() {
      const { activeType } = this
      approveTemplByType(activeType).then(res => {
        if (res && res.paramList) {
@@ -330,7 +253,7 @@
                  companyName: i.companyName
                }
              })
            }else{
            } else {
              item.objIds = []
            }
          })
@@ -342,7 +265,7 @@
        // console.log(res);
      })
    },
    onSubmit () {
    onSubmit() {
      const { apprList, activeType } = this
      const temp = JSON.parse(JSON.stringify(apprList))
      temp.forEach((item, index) => {
@@ -364,18 +287,18 @@
        this.subLoading = false
      })
    },
    handleDel () {
    handleDel() {
      const { activeIndex } = this
      this.apprList.splice(activeIndex, 1)
      this.activeIndex = 0
    },
    handleAddAppr () {
      this.apprList.splice(this.apprList.length - 2, 0, { remark: '审批人',approveType: 0, active: false, type: 0, objIds: [] })
    handleAddAppr() {
      this.apprList.splice(this.apprList.length - 2, 0, { remark: '审批人', approveType: 0, active: false, type: 0, objIds: [] })
      // this.apprList.push({ remark: '审批人', active: false, type: '0' })
    },
    // èŽ·å–ç»„ç»‡æ ‘
    getfindCompanyTreePage () {
    getfindCompanyTreePage() {
      fetchList()
        .then(res => {
          if (res && res.length > 0) {
@@ -387,7 +310,7 @@
          }
        })
    },
    getMemberList () {
    getMemberList() {
      memberListPost({
        model: {
          companyId: this.searchForm.companyId || '',
@@ -396,11 +319,11 @@
          erpOrgId: '',
          hasFace: '',
          hkStatus: '',
          includeChild: false,
          includeChild: true,
          type: 2
        },
        page: 1,
        capacity: 30
        capacity: 300
      }).then(res => {
        this.memberList = res.records || []
        this.memberList.forEach(item => {
@@ -409,13 +332,13 @@
        // console.log('defaultProps', res)
      })
    },
    callback (row) {
    callback(row) {
      console.log(row)
      this.$set(this.searchForm, 'companyId', row.id)
      this.$set(this.searchForm, 'erpOrgId', row.erpId)
      this.getMemberList()
    },
    TransferSub () {
    TransferSub() {
      const { activeIndex } = this
      if (this.searchForm.objIds && this.searchForm.objIds.length > 0) {
        if (this.searchForm.objIds.length > 20) return this.$message.warning('最多选择20人')
@@ -436,7 +359,7 @@
      this.isShowTransfer = false
      console.log(this.searchForm.objIds)
    },
    memDel (memIndex) {
    memDel(memIndex) {
      const { activeIndex } = this
      this.apprList.forEach((item, index) => {
        if (activeIndex === index) {
@@ -448,11 +371,11 @@
        }
      })
    },
    selStaff () {
    selStaff() {
      this.isShowTransfer = true
      this.getMemberList()
    },
    seleItem (i) {
    seleItem(i) {
      this.list.forEach((item, index) => {
        item.active = index === i
      })
@@ -470,6 +393,7 @@
  display: flex;
  align-items: center;
  justify-content: space-between;
  .config_list {
    width: 543px;
    height: 100%;
@@ -479,18 +403,21 @@
    box-sizing: border-box;
    border: 1px solid #eeeeee;
    background: #f7f7f7;
    .config_list_head {
      width: 100%;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      span {
        font-size: 18px;
        font-weight: 500;
        color: #222222;
      }
    }
    .config_content {
      width: 100%;
      height: calc(100% - 40px);
@@ -500,28 +427,35 @@
      display: flex;
      align-items: center;
      flex-direction: column;
      &::-webkit-scrollbar {
        width: 0;
      }
      .active {
        border: 2px solid #4456ac !important;
      }
      .yellow {
        background: #e89e42 !important;
      }
      .blue {
        background: #5094f3 !important;
      }
      .arrows {
        display: flex;
        flex-direction: column;
        align-items: center;
        position: relative;
        .line {
          width: 1px;
          height: 60px;
          background-color: #ccc;
        }
        .add {
          font-size: 40px;
          color: #2080f7;
@@ -530,10 +464,12 @@
          z-index: 999;
          top: 10px;
        }
        img {
          width: 12px;
        }
      }
      .item {
        width: 200px;
        cursor: pointer;
@@ -544,12 +480,14 @@
        position: relative;
        display: flex;
        flex-direction: column;
        .head {
          height: 32px;
          line-height: 32px;
          padding: 2px 12px;
          color: #fff;
        }
        .content {
          flex: 1;
          background-color: #fff;
@@ -558,32 +496,39 @@
          padding: 0 12px;
          justify-content: space-between;
        }
        &:last-child {
          margin: 0 !important;
        }
      }
    }
  }
  .config_data {
    flex: 1;
    height: 100%;
    margin-left: 20px;
    .config_data_submit {
      margin-top: 50px;
    }
    .config_data_item {
      width: 100%;
      display: flex;
      flex-direction: column;
      margin-bottom: 30px;
      &:last-child {
        margin: 0 !important;
      }
      .config_data_item_label {
        font-size: 16px;
        font-weight: 500;
        color: #222222;
        margin-bottom: 20px;
        span {
          font-size: 12px;
          font-weight: 400;
@@ -591,14 +536,17 @@
          margin-left: 10px;
        }
      }
      .config_data_item_reviewed {
        width: 100%;
        margin-top: 20px;
        .config_data_item_reviewed_r {
          margin-top: 10px;
          width: 100%;
          display: flex;
          align-items: center;
          span {
            flex-shrink: 0;
            font-size: 14px;
@@ -606,15 +554,18 @@
            color: #666666;
          }
        }
        .config_data_item_reviewed_label {
          display: flex;
          align-items: center;
          span {
            &:nth-child(1) {
              font-size: 14px;
              font-weight: 400;
              color: #222222;
            }
            &:nth-child(2) {
              font-size: 12px;
              font-weight: 400;
@@ -627,6 +578,7 @@
    }
  }
}
.config_data_item_reviewed_content {
  width: 400px;
  margin-top: 10px;
@@ -638,6 +590,7 @@
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  .add {
    font-size: 12px;
    font-weight: 400;
@@ -645,6 +598,7 @@
    cursor: pointer;
    margin-top: 3px;
  }
  .config_data_item_reviewed_content_item {
    padding: 3px 5px;
    background: #f4f7fc;
@@ -652,11 +606,13 @@
    box-sizing: border-box;
    margin-right: 10px;
    margin-bottom: 10px;
    span {
      font-size: 12px;
      font-weight: 400;
      color: #333333;
    }
    i {
      color: #949ba2;
      margin-left: 10px;
@@ -664,22 +620,27 @@
    }
  }
}
.staff_modal {
  display: flex;
  .left {
    width: 300px;
    margin-right: 20px;
  }
  .transfer {
    height: 600px;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    ::v-deep .el-transfer-panel{
    ::v-deep .el-transfer-panel {
      flex: 1;
      height: 100%;
    }
    ::v-deep .el-transfer-panel__body {
      height: 500px;
    }
admin/src/views/login.vue
@@ -6,39 +6,55 @@
        <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 class="df_ac">
          <div class="label">帐号</div>
          <div class="line">
            <el-input v-model="username" placeholder="请输入帐号" maxlength="50" v-trim />
          </div>
        </div>
        <div class="df_ac">
          <div class="label">密码</div>
          <div class="line">
            <el-input v-model="password" placeholder="请输入密码" type="password" maxlength="30" show-password />
        <template v-if="activeTab == '0'">
          <div class="df_ac">
            <div class="label">帐号</div>
            <div class="line">
              <el-input v-model="username" placeholder="请输入帐号" maxlength="50" v-trim />
            </div>
          </div>
        </div>
          <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" />
              <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha">
              <span v-else><i class="el-icon-loading"></i></span>
            </div>
          </div>
        </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>
        <div class="df_ac">
          <div class="label">验证码</div>
          <div class="line">
            <el-input v-model="captcha.value" placeholder="请输入验证码" maxlength="4" @keypress.enter.native="login" />
            <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha">
            <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>
        <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: '0',
      // éªŒè¯ç 
      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/operation/serviceCar/apprConfig.vue
@@ -20,14 +20,10 @@
              <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
            </div>
            <div v-for="(item, index) in apprList" :key="index">
              <div
                class="item yellow"
                :class="{
                  active: activeIndex == index,
                  blue: item.type == '1',
                }"
                @click="flowClick(index)"
              >
              <div class="item yellow" :class="{
                active: activeIndex == index,
                blue: item.type == '1',
              }" @click="flowClick(index)">
                <div class="head">{{ item.remark }}</div>
                <div class="content">
                  <!-- å®¡æ‰¹ -->
@@ -37,25 +33,19 @@
                    </template>
                    <template v-if="item.memberType == '1'">
                      <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                        <span>{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                        <span v-if="item.approveType == 0 && item.type == '0'">
                          æˆ–ç­¾</span
                        >
                          æˆ–ç­¾</span>
                        <span v-if="item.approveType == 1 && item.type == '0'">
                          ä¼šç­¾</span
                        >
                          ä¼šç­¾</span>
                      </div>
                      <div v-else>请选择</div>
                      <i class="el-icon-arrow-right"></i>
@@ -64,19 +54,14 @@
                  <!-- æŠ„送 -->
                  <template v-if="item.type == 1">
                    <div v-if="item.objIds && item.objIds.length === 1">
                        <span
                          >{{ item.objIds[0].name }}
                          {{ item.objIds[0].companyName }}</span
                        >
                      </div>
                      <div v-else-if="item.objIds && item.objIds.length > 1">
                        <span>{{ item.objIds[0].name }} ç­‰</span>
                      </div>
                      <div v-else>请选择</div>
                    <i
                      v-if="item.memberType == '1'"
                      class="el-icon-arrow-right"
                    ></i>
                      <span>{{ item.objIds[0].name }}
                        {{ item.objIds[0].companyName }}</span>
                    </div>
                    <div v-else-if="item.objIds && item.objIds.length > 1">
                      <span>{{ item.objIds[0].name }} ç­‰</span>
                    </div>
                    <div v-else>请选择</div>
                    <i v-if="item.memberType == '1'" class="el-icon-arrow-right"></i>
                  </template>
                </div>
              </div>
@@ -85,11 +70,7 @@
                  <div class="line"></div>
                  <img src="@/assets/images/peizhi_ar@2x.png" alt="" />
                </template>
                <i
                  v-if="apprList.length - 2 === index"
                  @click="handleAddAppr()"
                  class="el-icon-circle-plus add"
                ></i>
                <i v-if="apprList.length - 2 === index" @click="handleAddAppr()" class="el-icon-circle-plus add"></i>
              </div>
            </div>
          </div>
@@ -99,127 +80,79 @@
            <div class="config_data_item_label">选择该节点的审批人</div>
            <div class="df_ac mb10">
              <div>审批节点名称</div>
              <el-input
                class="w200 ml10"
                v-model="apprList[activeIndex].remark"
              ></el-input>
              <el-input class="w200 ml10" v-model="apprList[activeIndex].remark"></el-input>
            </div>
            <!-- æŠ„送人 -->
            <template v-if="apprList[activeIndex].type == '1'">
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="mem, memIndex in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="mem, memIndex in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i @click="memDel(memIndex)" class="el-icon-close"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </template>
            <el-radio-group
              v-if="apprList[activeIndex].type == '0'"
              v-model="apprList[activeIndex].memberType"
            >
            <el-radio-group v-if="apprList[activeIndex].type == '0'" v-model="apprList[activeIndex].memberType">
              <!-- <el-radio :label="0">被访人</el-radio> -->
              <el-radio :label="1">指定人员</el-radio>
              <el-radio :label="2">部门主管</el-radio>
            </el-radio-group>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 1"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 1">
              <div class="config_data_item_reviewed_label">
                <span>指定审核人</span>
                <span>不超过20人</span>
              </div>
              <div class="config_data_item_reviewed_content">
                <div
                  v-for="(mem, memIndex) in apprList[activeIndex].objIds"
                  :key="mem.id"
                  class="config_data_item_reviewed_content_item"
                >
                <div v-for="(mem, memIndex) in apprList[activeIndex].objIds" :key="mem.id"
                  class="config_data_item_reviewed_content_item">
                  <span>{{ mem.name }}</span>
                  <i class="el-icon-close" @click="memDel(memIndex)"></i>
                </div>
                <span class="add" @click="selStaff">+添加</span>
              </div>
            </div>
            <div
              class="config_data_item_reviewed"
              v-if="apprList[activeIndex].memberType == 2"
            >
            <div class="config_data_item_reviewed" v-if="apprList[activeIndex].memberType == 2">
              <div class="config_data_item_reviewed_label">
                <span>部门主管</span>
              </div>
              <div class="config_data_item_reviewed_r">
                <span>申请人的</span>
                <el-select
                  v-model="apprList[activeIndex].objLevel"
                  placeholder="请选择"
                  style="margin: 0 20px 0 10px"
                >
                <el-select v-model="apprList[activeIndex].objLevel" placeholder="请选择" style="margin: 0 20px 0 10px">
                  <el-option label="直接主管" :value="0" />
                  <el-option label="二级主管" :value="1" />
                  <el-option label="三级主管" :value="2" />
                  <el-option label="四级主管" :value="4" />
                </el-select>
                <el-checkbox
                  v-model="apprList[activeIndex].noleaderOpt"
                  :true-label="1"
                  :false-label="0"
                  >找不到主管时,由上级主管代审核</el-checkbox
                >
                <el-checkbox v-model="apprList[activeIndex].noleaderOpt" :true-label="1"
                  :false-label="0">找不到主管时,由上级主管代审核</el-checkbox>
              </div>
            </div>
          </div>
          <div
            class="config_data_item"
            v-if="
              (apprList[activeIndex].memberType == 1 ||
                apprList[activeIndex].memberType == 2) &&
              apprList[activeIndex].type == '0'
            "
          >
          <div class="config_data_item" v-if="
            (apprList[activeIndex].memberType == 1 ||
              apprList[activeIndex].memberType == 2) &&
            apprList[activeIndex].type == '0'
          ">
            <div class="config_data_item_label">
              å®¡æ‰¹æ–¹å¼
              <span>审批人为多个时,采用的审批方式</span>
            </div>
            <el-radio-group
              v-model="apprList[activeIndex].approveType"
              style="display: flex; flex-direction: column"
            >
              <el-radio :label="0" style="margin-bottom: 20px"
                >或签(其中一名审批人同意或拒绝即可)</el-radio
              >
            <el-radio-group v-model="apprList[activeIndex].approveType" style="display: flex; flex-direction: column">
              <el-radio :label="0" style="margin-bottom: 20px">或签(其中一名审批人同意或拒绝即可)</el-radio>
              <el-radio :label="1">会签(所有审批人都同意才可通过)</el-radio>
            </el-radio-group>
          </div>
          <div v-if="apprList[activeIndex].type == '0'" class="df_ac mb10">
            <div>允许修改"驾驶员"</div>
            <el-switch
              class="ml10"
              :active-value="1"
              :inactive-value="0"
              v-model="apprList[activeIndex].driverParam"
            ></el-switch>
            <el-switch class="ml10" :active-value="1" :inactive-value="0"
              v-model="apprList[activeIndex].driverParam"></el-switch>
          </div>
          <div class="config_data_submit">
            <el-button
              @click="onSubmit"
              :loading="subLoading"
              style="background: #435ebe"
              type="primary"
              >保存配置项</el-button
            >
            <el-button
              v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1"
              type="danger"
              plain
              @click="handleDel"
              >删除节点</el-button
            >
            <el-button @click="onSubmit" :loading="subLoading" style="background: #435ebe"
              type="primary">保存配置项</el-button>
            <el-button v-if="activeIndex !== 0 && activeIndex !== apprList.length - 1" type="danger" plain
              @click="handleDel">删除节点</el-button>
          </div>
        </div>
      </div>
@@ -228,41 +161,27 @@
    <el-dialog title="选择员工" :visible.sync="isShowTransfer" width="1000px">
      <div class="staff_modal">
        <div class="left">
          <div
            style="
          <div style="
              width: 100%;
              height: 50px;
              background: rgba(242, 242, 242, 1);
              line-height: 50px;
              text-align: center;
              font-size: 14px;
            "
          >
            ">
            ä¼ä¸šç»„织架构
          </div>
          <div style="width: 100%; height: 100%; overflow-y: scroll">
            <Tree
              :list="companyTree"
              :defaultProps="{
                name: 'name',
                status: 'fsStatus',
                children: 'childList',
                id: 'id',
              }"
              @callback="callback"
            />
          <div style="width: 100%; max-height: 560px; overflow-y: scroll">
            <Tree :list="companyTree" :defaultProps="{
              name: 'name',
              status: 'fsStatus',
              children: 'childList',
              id: 'id',
            }" @callback="callback" />
          </div>
        </div>
        <el-transfer
          filterable
          :title="['未选', '已选']"
          openAll
          :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工"
          v-model="searchForm.objIds"
          :data="memberList"
          class="transfer"
        >
        <el-transfer filterable :title="['未选', '已选']" openAll :props="{ label: 'name', key: 'keyTemp' }"
          filter-placeholder="搜索员工" v-model="searchForm.objIds" :data="memberList" class="transfer">
        </el-transfer>
      </div>
      <span slot="footer" class="dialog-footer">
@@ -286,7 +205,7 @@
    TableLayout,
    Tree
  },
  data () {
  data() {
    return {
      activeType: '3',
      subLoading: false,
@@ -303,12 +222,12 @@
      companyTree: []
    }
  },
  created () {
  created() {
    this.getfindCompanyTreePage()
    this.initDate()
  },
  methods: {
    handleClick () {
    handleClick() {
      this.apprList = []
      const arr = [
        { remark: '审批人', active: false, type: 0, objIds: [] },
@@ -317,7 +236,7 @@
      this.apprList = [...arr]
      this.initDate()
    },
    flowClick (i) {
    flowClick(i) {
      this.activeIndex = i
      this.apprList.forEach((item, index) => {
        if (i === index) {
@@ -335,7 +254,7 @@
        }
      })
    },
    initDate () {
    initDate() {
      const { activeType } = this
      approveTemplByType(activeType).then(res => {
        if (res && res.paramList) {
@@ -349,7 +268,7 @@
                  companyName: i.companyName
                }
              })
            }else{
            } else {
              item.objIds = []
            }
          })
@@ -361,7 +280,7 @@
        // console.log(res);
      })
    },
    onSubmit () {
    onSubmit() {
      const { apprList, activeType } = this
      const temp = JSON.parse(JSON.stringify(apprList))
      temp.forEach((item, index) => {
@@ -383,18 +302,18 @@
        this.subLoading = false
      })
    },
    handleDel () {
    handleDel() {
      const { activeIndex } = this
      this.apprList.splice(activeIndex, 1)
      this.activeIndex = 0
    },
    handleAddAppr () {
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人',approveType: 0, active: false, type: 0, objIds: [] })
    handleAddAppr() {
      this.apprList.splice(this.apprList.length - 1, 0, { remark: '审批人', approveType: 0, active: false, type: 0, objIds: [] })
      // this.apprList.push({ remark: '审批人', active: false, type: '0' })
    },
    // èŽ·å–ç»„ç»‡æ ‘
    getfindCompanyTreePage () {
    getfindCompanyTreePage() {
      fetchList()
        .then(res => {
          if (res && res.length > 0) {
@@ -406,7 +325,7 @@
          }
        })
    },
    getMemberList () {
    getMemberList() {
      memberListPost({
        model: {
          companyId: this.searchForm.companyId || '',
@@ -415,11 +334,11 @@
          erpOrgId: '',
          hasFace: '',
          hkStatus: '',
          includeChild: false,
          includeChild: true,
          type: 2
        },
        page: 1,
        capacity: 30
        capacity: 300
      }).then(res => {
        this.memberList = res.records || []
        this.memberList.forEach(item => {
@@ -428,13 +347,13 @@
        // console.log('defaultProps', res)
      })
    },
    callback (row) {
    callback(row) {
      console.log(row)
      this.$set(this.searchForm, 'companyId', row.id)
      this.$set(this.searchForm, 'erpOrgId', row.erpId)
      this.getMemberList()
    },
    TransferSub () {
    TransferSub() {
      const { activeIndex } = this
      if (this.searchForm.objIds && this.searchForm.objIds.length > 0) {
        if (this.searchForm.objIds.length > 20) return this.$message.warning('最多选择20人')
@@ -455,7 +374,7 @@
      this.isShowTransfer = false
      console.log(this.searchForm.objIds)
    },
    memDel (memIndex) {
    memDel(memIndex) {
      const { activeIndex } = this
      this.apprList.forEach((item, index) => {
        if (activeIndex === index) {
@@ -467,11 +386,11 @@
        }
      })
    },
    selStaff () {
    selStaff() {
      this.isShowTransfer = true
      this.getMemberList()
    },
    seleItem (i) {
    seleItem(i) {
      this.list.forEach((item, index) => {
        item.active = index === i
      })
@@ -489,6 +408,7 @@
  display: flex;
  align-items: center;
  justify-content: space-between;
  .config_list {
    width: 543px;
    height: 100%;
@@ -498,18 +418,21 @@
    box-sizing: border-box;
    border: 1px solid #eeeeee;
    background: #f7f7f7;
    .config_list_head {
      width: 100%;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      span {
        font-size: 18px;
        font-weight: 500;
        color: #222222;
      }
    }
    .config_content {
      width: 100%;
      height: calc(100% - 40px);
@@ -519,28 +442,35 @@
      display: flex;
      align-items: center;
      flex-direction: column;
      &::-webkit-scrollbar {
        width: 0;
      }
      .active {
        border: 2px solid #4456ac !important;
      }
      .yellow {
        background: #e89e42 !important;
      }
      .blue {
        background: #5094f3 !important;
      }
      .arrows {
        display: flex;
        flex-direction: column;
        align-items: center;
        position: relative;
        .line {
          width: 1px;
          height: 60px;
          background-color: #ccc;
        }
        .add {
          font-size: 40px;
          color: #2080f7;
@@ -549,10 +479,12 @@
          z-index: 999;
          top: 10px;
        }
        img {
          width: 12px;
        }
      }
      .item {
        width: 200px;
        cursor: pointer;
@@ -563,12 +495,14 @@
        position: relative;
        display: flex;
        flex-direction: column;
        .head {
          height: 32px;
          line-height: 32px;
          padding: 2px 12px;
          color: #fff;
        }
        .content {
          flex: 1;
          background-color: #fff;
@@ -577,32 +511,39 @@
          padding: 0 12px;
          justify-content: space-between;
        }
        &:last-child {
          margin: 0 !important;
        }
      }
    }
  }
  .config_data {
    flex: 1;
    height: 100%;
    margin-left: 20px;
    .config_data_submit {
      margin-top: 50px;
    }
    .config_data_item {
      width: 100%;
      display: flex;
      flex-direction: column;
      margin-bottom: 30px;
      &:last-child {
        margin: 0 !important;
      }
      .config_data_item_label {
        font-size: 16px;
        font-weight: 500;
        color: #222222;
        margin-bottom: 20px;
        span {
          font-size: 12px;
          font-weight: 400;
@@ -610,14 +551,17 @@
          margin-left: 10px;
        }
      }
      .config_data_item_reviewed {
        width: 100%;
        margin-top: 20px;
        .config_data_item_reviewed_r {
          margin-top: 10px;
          width: 100%;
          display: flex;
          align-items: center;
          span {
            flex-shrink: 0;
            font-size: 14px;
@@ -625,15 +569,18 @@
            color: #666666;
          }
        }
        .config_data_item_reviewed_label {
          display: flex;
          align-items: center;
          span {
            &:nth-child(1) {
              font-size: 14px;
              font-weight: 400;
              color: #222222;
            }
            &:nth-child(2) {
              font-size: 12px;
              font-weight: 400;
@@ -646,6 +593,7 @@
    }
  }
}
.config_data_item_reviewed_content {
  width: 400px;
  margin-top: 10px;
@@ -657,6 +605,7 @@
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  .add {
    font-size: 12px;
    font-weight: 400;
@@ -664,6 +613,7 @@
    cursor: pointer;
    margin-top: 3px;
  }
  .config_data_item_reviewed_content_item {
    padding: 3px 5px;
    background: #f4f7fc;
@@ -671,11 +621,13 @@
    box-sizing: border-box;
    margin-right: 10px;
    margin-bottom: 10px;
    span {
      font-size: 12px;
      font-weight: 400;
      color: #333333;
    }
    i {
      color: #949ba2;
      margin-left: 10px;
@@ -683,22 +635,27 @@
    }
  }
}
.staff_modal {
  display: flex;
  .left {
    width: 300px;
    margin-right: 20px;
  }
  .transfer {
    height: 600px;
    width: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    ::v-deep .el-transfer-panel{
    ::v-deep .el-transfer-panel {
      flex: 1;
      height: 100%;
    }
    ::v-deep .el-transfer-panel__body {
      height: 500px;
    }
admin/src/views/platform/index.vue
@@ -62,27 +62,27 @@
              </div>
            </div>
            <div class="line">
              <div v-if="task.billCode" class="ite">
              <div v-if="task.billCode" style="width: 40%;" class="ite">
                <span>运输单号:</span>
                <span>{{ task.billCode }}</span>
              </div>
              <div v-else class="ite">
              <div v-else class="ite" style="width: 40%;">
                <span>合同单号:</span>
                <span>{{ task.contractNum }}</span>
              </div>
              <div class="ite siji">
              <div class="ite jiashi">
                <span>驾驶员:</span>
                <span>{{ task.driverName }}</span>
                <span>{{ task.driverName }} {{ task.drivierPhone }}</span>
              </div>
              <div class="ite phone">
              <!-- <div class="ite phone">
                <span>手机号:</span>
                <span>{{ task.drivierPhone }}</span>
              </div>
              <div class="ite">
              </div> -->
              <div class="ite" style="width: 40%">
                <span>总运输量:</span>
                <span>{{ task.totalNum }}万支</span>
              </div>
              <div v-if="task.billCode" class="ite" style="width: 66.6%">
              <div v-if="task.billCode" class="ite" style="width: 60%">
                <span>运输公司:</span>
                <span>{{ task.carrierName }}</span>
              </div>
@@ -497,12 +497,12 @@
          margin-bottom: 6px;
          .ite {
            width: 33.3%;
            width: 50%;
            margin-top: 8px;
          }
          .siji {
            width: 29%;
          .jiashi {
            width: 60%;
          }
          .phone {
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>
admin/src/views/task/dangetDetail.vue
@@ -601,6 +601,7 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.upload_wrap {
  display: flex;
  flex-wrap: wrap;
@@ -800,7 +801,7 @@
          font-size: 13px;
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
        .m_content {
admin/src/views/task/driverDetail.vue
@@ -3,15 +3,19 @@
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png"
            alt="">
          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg"
            src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.status == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
          <div class="left">
            <div class="h1">物流车预约</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
          </div>
          <div class="right" :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{ statusMap[info.status] }}</div>
          <div class="right"
            :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{
              statusMap[info.status] }}</div>
        </div>
        <div class="info">
          <div class="title">物流车预约信息</div>
@@ -43,7 +47,8 @@
            <div class="item">
              <div class="label">准运证照片</div>
              <div v-if="info.transportImg" class="value">
                <el-image  style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]" :src="info.prefixUrl + info.transportImg" alt="" />
                <el-image style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]"
                  :src="info.prefixUrl + info.transportImg" alt="" />
              </div>
            </div>
          </div>
@@ -210,7 +215,7 @@
        }
      })
    },
    close(){
    close() {
      this.isShowModal = false
      this.$emit('close')
    },
@@ -275,6 +280,7 @@
    border-radius: 8px;
    overflow: hidden;
    height: 100%;
    .title {
      font-weight: 600;
      font-size: 18px;
@@ -317,7 +323,8 @@
      margin: 0 -30px;
      border-radius: 8px 8px 0 0;
      position: relative;
      .head_bg{
      .head_bg {
        position: absolute;
        width: 100%;
        height: 100%;
@@ -325,6 +332,7 @@
        top: 0;
        z-index: 9;
      }
      .h1 {
        font-weight: 600;
        font-size: 22px;
@@ -349,10 +357,12 @@
        position: relative;
        z-index: 99;
      }
      .scs{
      .scs {
        background-color: #00BA67;
      }
      .msg{
      .msg {
        background-color: #ED4545;
      }
    }
@@ -398,6 +408,7 @@
        display: flex;
        margin-bottom: 24px;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
@@ -405,15 +416,18 @@
          height: calc(100% - 2px);
          top: 42px;
        }
        .info{
        .info {
          padding-top: 10px;
          margin-left: 20px;
          margin-right: 16px;
          .iconnew {
            width: 24px;
            height: 24px;
          }
        }
        .avatar_wrap {
          width: 40px;
          height: 40px;
@@ -460,7 +474,7 @@
            color: #777777;
            .status {
              color: $primary-color;
              color: $primaryColor;
            }
          }
@@ -480,6 +494,7 @@
          width: 100%;
          overflow-x: auto;
          margin-top: 12px;
          .carbon_item {
            text-align: center;
            flex-shrink: 0;
admin/src/views/task/index.vue
@@ -165,12 +165,12 @@
      },
      pagination: {
        capacity: 10,
        page: 1
        page: 1,
        total: 0,
      },
      loading: false,
      dataList: [],
      headData: {},
      total: 0,
      cateList: [
        { name: '访客申请', id: 0 },
@@ -268,6 +268,7 @@
      }).then(res => {
        console.log('res', res)
        this.dataList = res.records || []
        this.pagination.total = res.total || 0
        this.dataList.forEach(i => {
          i.param1 = JSON.parse(i.param1)
        })
admin/src/views/task/visReportDetail.vue
@@ -3,19 +3,17 @@
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <img v-if="info.businessStatus == '3'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png"
          <img v-if="info.businessStatus == '3'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
          <img v-else-if="info.businessStatus == '2'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.businessStatus == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png"
            alt="">
          <img v-else-if="info.businessStatus == '2'" class="head_bg"
            src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.businessStatus == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
          <div class="left">
            <div class="h1">{{ cateList[type] }}</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
          </div>
          <div class="right"
            :class="{ scs: info.businessStatus == '2', msg: info.businessStatus == '3' }">{{
              statusMap[info.businessStatus] }}</div>
          <div class="right" :class="{ scs: info.businessStatus == '2', msg: info.businessStatus == '3' }">{{
            statusMap[info.businessStatus] }}</div>
        </div>
        <div class="info">
          <div class="title">访客报备信息</div>
@@ -83,7 +81,7 @@
                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                      ï¼ˆ<span :class="{ padding: item.statusInfo == '处理中' || item.status == '1' }">{{
                        item.statusInfo || ""
                        }}</span>)
                      }}</span>)
                    </div>
                  </div>
                </div>
@@ -96,7 +94,7 @@
            " class="remark">
              {{ item.checkInfo || "" }}
            </div>
            <div v-if="item.approveType == 1" class="childList">
            <div v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="childList">
              <div class="m_content company" v-for="item1 in item.approveList" :key="item1.id">
                <img v-if="item1.faceImg != null && item1.faceImg != ''" :src="item1.faceImg" class="avatar" alt="" />
                <img v-if="item1.faceImg == null || item1.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
@@ -238,7 +236,7 @@
          })
      })
    },
    close(){
    close() {
      this.isShowModal = false
      this.$emit('close')
    },
@@ -246,6 +244,18 @@
      const { id } = this
      getVisitedReDetail({ id }).then(res => {
        this.info = res
        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 = []
            }
          })
        }
      })
    },
    handleAppr(val) {
@@ -463,7 +473,7 @@
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
admin/src/views/task/visSubDetail.vue
@@ -516,7 +516,7 @@
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
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
@@ -18,9 +18,17 @@
        mode="widthFix"
      ></image>
    </view>
    <view class="title_wrap"><view class="name">业务办理</view></view>
    <view v-if="list1.filter(i => checkAuth(i.auth)).length > 0" 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,22 @@
          <view class="h1">修改密码</view>
          <view class="h2">CHANGE PASSWORD</view>
        </view>
      </view>
      </view> -->
    </view>
    <!--  -->
    <view class="title_wrap"><view class="name">业务查询</view></view>
    <view v-if="list2.filter(i => checkAuth(i.auth)).length > 0" class="title_wrap"><view class="name">业务查询</view></view>
    <view class="container2">
      <view class="img_wrap" @click="jump('/pages/staff/task/index')">
            <view class="list">
                <block v-for="item in list2" :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 v-if="item.name == '任务中心' && taskInfo" class="task_num">{{ taskInfo }}</view>
                    </view>
                </block>
            </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 +99,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 +113,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,6 +185,7 @@
      console.log('----');
      this.getTaskInfo()
    })
        console.log('aaa', this.userInfo.permissions.indexOf('system:user:create'));
  },
  methods: {
    jump(path) {
@@ -159,6 +193,10 @@
        url: path
      })
    },
        checkAuth(str) {
            const permissions = this.userInfo.permissions
            return permissions.indexOf(str) > -1
        },
    loginOut() {
      this.$store.commit('empty')
      logoutPost()
@@ -171,6 +209,9 @@
        isDetail: '1'
      }).then(res => {
        this.taskInfo = res.data.noticeWaitNum + res.data.noticeCopyNum
                if(this.taskInfo && this.taskInfo > 99){
                    this.taskInfo = 99
                }
      })
    },
  }
@@ -203,6 +244,40 @@
.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;
        position: relative;
        image{
            width: 88rpx;
            height: 88rpx;
            margin-bottom: 20rpx;
        }
        .task_num{
            position: absolute;
            top: -10rpx;
            right: 28rpx;
            font-size: 24rpx;
            width: 36rpx;
            height: 36rpx;
            background-color: red;
            color: #fff;
            border-radius: 50%;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    }
}
.banner_wrap {
  padding: 54rpx 44rpx;
  color: #fff;
@@ -227,107 +302,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 = []
    this.getList()
        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
@@ -68,7 +68,8 @@
                    <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" />
                            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
@@ -44,7 +44,7 @@
      </view>
      <view class="item">
        <view class="label">访客单位</view>
        <view class="value">{{ info.companyName }}人</view>
        <view class="value">{{ info.companyName }}</view>
      </view>
      <view class="item">
        <view class="label">来访事由</view>
@@ -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,9 +109,12 @@
    this.initData()
  },
  onReachBottom() {
    if (this.total > 10) {
        console.log('onReachBottom');
    if (this.total > this.dataList.length) {
      this.getList()
    }
    }else {
            this.showToast('暂无更多数据')
        }
  },
  methods: {
    getList() {
@@ -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,538 +1,506 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">{{ info.memberName }}的用车申请</view>
      <view class="placeholder9">{{ info.companyName }}</view>
            <view
              class="desc"
              :class="{
                gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '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>
    <!--  -->
    <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) }}至{{
            info.endTime.slice(0, 16)
          }}</view
        >
      </view>
      <view class="item">
        <view class="label">预计出发时间</view>
        <view class="value">{{ info.planUseDate }}</view>
      </view>
      <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>
      <view class="item">
        <view class="label">用车事由</view>
        <view class="value">{{ info.content }}</view>
      </view>
      <view class="item">
        <view class="label">车辆信息</view>
        <view class="value">{{ info.carCode }}</view>
      </view>
      <view class="item">
        <view class="label">司机信息</view>
        <view class="value">{{ info.driverName }} {{ info.driverPhone }}</view>
      </view>
    </view>
    <!-- æµç¨‹ -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <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
                  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"
            />
              <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"
            />
          </view>
          <view class="content">
            <view class="head">
              <view class="event">{{ item.title }}</view>
              <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
              >
            </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>{{ child.memberName }}</view>
              </view>
            </view>
          </view>
        </view>
      </view>
    </view>
    <view class="emyty"></view>
    <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>
      </template>
      <view v-else 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"
      :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">
          <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
          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" @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, carUseBookAppr, driveListPost, carUseBookBack } from '@/api'
export default {
  data() {
    return {
      showApprModal: false,
      isShowBack: false,
      backParam: {},
      isShowDrive: false,
      id: '',
      appr: '',
            infoStatus: '',
      info: {},
      param: {
        status: ''
      },
            statusMap: {
              0: '待审批',
              1: '审批中',
              2: '已通过',
              3: '撤回申请',
              4: '已取消',
            },
      driveList: []
    }
  },
  onLoad(option) {
    this.id = option.id
    this.appr = option.appr || ''
        this.infoStatus = option.info
    this.getDetail()
  },
  methods: {
    getDetail() {
      const { id } = this
      carUseBookDetail(id).then(res => {
        this.info = { ...res.data }
      })
    },
    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 =
      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>
<style>
page {
  background-color: #f7f7f7;
}
</style>
<style lang="scss">
.main_app {
  background-color: #fff;
  padding-bottom: 0;
  .flow_wrap {
    padding: 30rpx 0;
    .flow_title {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 24rpx;
    }
    .list {
      .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;
          position: relative;
          margin-right: 20rpx;
                  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;
            border-radius: 50%;
            position: absolute;
            right: 0;
            bottom: 0;
          }
        }
        .content {
          flex: 1;
          .head {
            display: flex;
            justify-content: space-between;
            margin-bottom: 4rpx;
            .event {
              font-size: 30rpx;
            }
            .time {
              font-size: 26rpx;
              color: #999999;
            }
          }
          .name_wrap {
            font-size: 26rpx;
            color: #777777;
            .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;
                          font-size: 26rpx;
                          color: #777777;
              .child_img {
                width: 48rpx;
                height: 48rpx;
                border-radius: 50%;
                              margin-bottom: 2rpx;
              }
                          .child_name{
                              margin-bottom: 2rpx;
                              width: 48rpx;
                              height: 48rpx;
                              text-align: center;
                              justify-content: center;
                              padding-top: 4rpx;
                              font-size: 28rpx;
                              border-radius: 50%;
                              color: #FFFFFF;
                              background-color: $uni-color-primary;
                          }
            }
          }
          .remark {
            margin-top: 12rpx;
            background-color: #f7f7f7;
            padding: 14rpx 20rpx;
            border-radius: 8rpx;
            font-size: 26rpx;
            color: #666666;
            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;
          }
        }
      }
    }
  }
  .module_list {
    .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;
        .avatar {
          margin-right: 20rpx;
          width: 120rpx;
          height: 120rpx;
          border-radius: 8rpx;
          border: 2rpx solid #e5e5e5;
        }
        .info {
          flex: 1;
          display: flex;
          flex-direction: column;
          justify-content: space-between;
          font-size: 26rpx;
          color: #666666;
          .name {
            font-size: 30rpx;
            color: #333333;
          }
        }
      }
    }
  }
  .status_wrap {
<template>
    <view class="main_app">
        <view class="status_wrap">
          <view class="name">{{ info.createMemberName }}提交的用车申请</view>
          <view
            class="desc"
            :class="{
              gray: info.status == '2' || info.status == '3' || info.status == '4',
            }"
            >{{ infoStatus }}</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) }}至{{
            info.endTime.slice(0, 16)
          }}</view>
            </view>
            <view class="item">
                <view class="label">预计出发时间</view>
                <view class="value">{{ info.planUseDate }}</view>
            </view>
            <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>
            <view class="item">
                <view class="label">用车事由</view>
                <view class="value">{{ info.content }}</view>
            </view>
            <view class="item">
                <view class="label">车辆信息</view>
                <view class="value">{{ info.carCode }}</view>
            </view>
            <view class="item">
                <view class="label">司机信息</view>
                <view class="value">{{ info.driverName }} {{ info.driverPhone }}</view>
            </view>
        </view>
        <!-- æµç¨‹ -->
        <view class="flow_wrap">
            <view class="flow_title">流程</view>
            <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 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" />
                    </view>
                    <view class="content">
                        <view class="head">
                            <view class="event">{{ item.title }}</view>
                            <view class="time">{{ item.checkDate }}</view>
                        </view>
                        <view class="name_wrap">
                            <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 == 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>
                    </view>
                </view>
            </view>
        </view>
        <view class="emyty"></view>
        <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>
            </template>
            <view v-else 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" :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">
                    <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 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" @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,
        carUseBookAppr,
        driveListPost,
        carUseBookBack
    } from '@/api'
    export default {
        data() {
            return {
                showApprModal: false,
                isShowBack: false,
                backParam: {},
                isShowDrive: false,
                id: '',
                appr: '',
                infoStatus: '',
                info: {},
                param: {
                    status: ''
                },
                statusMap: {
                    0: '待审批',
                    1: '审批中',
                    2: '已通过',
                    3: '撤回申请',
                    4: '已取消',
                },
                driveList: []
            }
        },
        onLoad(option) {
            this.id = option.id
            this.appr = option.appr || ''
            this.infoStatus = option.info
            this.getDetail()
        },
        methods: {
            getDetail() {
                const {
                    id
                } = this
                carUseBookDetail(id).then(res => {
                    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() {
                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 =
                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>
<style>
    page {
        background-color: #f7f7f7;
    }
</style>
<style lang="scss">
    .main_app {
        background-color: #fff;
        padding-bottom: 0;
        .flow_wrap {
            padding: 30rpx 0;
            .flow_title {
                font-weight: 600;
                font-size: 32rpx;
                color: #222222;
                margin-bottom: 24rpx;
            }
            .list {
                .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;
                        position: relative;
                        margin-right: 20rpx;
                        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;
                            border-radius: 50%;
                            position: absolute;
                            right: 0;
                            bottom: 0;
                        }
                    }
                    .content {
                        flex: 1;
                        .head {
                            display: flex;
                            justify-content: space-between;
                            margin-bottom: 4rpx;
                            .event {
                                font-size: 30rpx;
                            }
                            .time {
                                font-size: 26rpx;
                                color: #999999;
                            }
                        }
                        .name_wrap {
                            font-size: 26rpx;
                            color: #777777;
                            .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;
                                font-size: 26rpx;
                                color: #777777;
                                .child_img {
                                    width: 48rpx;
                                    height: 48rpx;
                                    border-radius: 50%;
                                    margin-bottom: 2rpx;
                                }
                                .child_name {
                                    margin-bottom: 2rpx;
                                    width: 48rpx;
                                    height: 48rpx;
                                    text-align: center;
                                    justify-content: center;
                                    padding-top: 4rpx;
                                    font-size: 28rpx;
                                    border-radius: 50%;
                                    color: #FFFFFF;
                                    background-color: $uni-color-primary;
                                }
                            }
                        }
                        .remark {
                            margin-top: 12rpx;
                            background-color: #f7f7f7;
                            padding: 14rpx 20rpx;
                            border-radius: 8rpx;
                            font-size: 26rpx;
                            color: #666666;
                            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;
                        }
                    }
                }
            }
        }
        .module_list {
            .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;
                    .avatar {
                        margin-right: 20rpx;
                        width: 120rpx;
                        height: 120rpx;
                        border-radius: 8rpx;
                        border: 2rpx solid #e5e5e5;
                    }
                    .info {
                        flex: 1;
                        display: flex;
                        flex-direction: column;
                        justify-content: space-between;
                        font-size: 26rpx;
                        color: #666666;
                        .name {
                            font-size: 30rpx;
                            color: #333333;
                        }
                    }
                }
            }
        }
 .status_wrap {
    position: relative;
    padding: 30rpx 0;
    .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,67 +516,75 @@
      background-color: #e9edff;
      color: $uni-color-primary;
    }
  }
  .main_footer {
    padding-bottom: 64rpx;
    display: flex;
    justify-content: space-between;
    .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;
    .status_img {
      position: absolute;
      right: 0rpx;
      top: 20rpx;
      width: 120rpx;
    }
    .agree {
      background: $uni-color-primary;
      color: #fff;
      border: 1rpx solid $uni-color-primary;
    }
  }
  .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: 600;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 40rpx;
      text-align: center;
    }
    textarea {
      box-sizing: border-box;
      width: 690rpx;
      background-color: #f7f7f7;
      font-size: 28rpx;
      color: #333333;
      padding: 24rpx;
      border-radius: 8rpx;
      margin-bottom: 30rpx;
    }
  }
  .emyty {
    width: 750rpx;
    height: 20rpx;
    background-color: #f7f7f7;
    margin: 0 -30rpx;
  }
}
</style>
  }
        .main_footer {
            padding-bottom: 64rpx;
            display: flex;
            justify-content: space-between;
            .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;
            }
            .agree {
                background: $uni-color-primary;
                color: #fff;
                border: 1rpx solid $uni-color-primary;
            }
        }
        .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: 600;
                font-size: 32rpx;
                color: #222222;
                margin-bottom: 40rpx;
                text-align: center;
            }
            textarea {
                box-sizing: border-box;
                width: 690rpx;
                background-color: #f7f7f7;
                font-size: 28rpx;
                color: #333333;
                padding: 24rpx;
                border-radius: 8rpx;
                margin-bottom: 30rpx;
            }
        }
        .emyty {
            width: 750rpx;
            height: 20rpx;
            background-color: #f7f7f7;
            margin: 0 -30rpx;
        }
    }
</style>
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,7 +83,7 @@
      @confirm="seletedCar"
      @cancel="isShowCar = false"
    ></u-picker>
    <u-datetime-picker
   <!-- <u-datetime-picker
      mode="datetime"
      :show="isShowDate"
      :filter="timeFilter"
@@ -93,11 +93,20 @@
      :closeOnClickOverlay="true"
      @confirm="seletedDate"
      @cancel="isShowDate = false"
    />
    /> -->
        <u-datetime-picker
           mode="datetime"
           :show="isShowDate"
           title="开始时间"
           :minDate="minDate"
           @close="isShowDate = false"
           :closeOnClickOverlay="true"
           @confirm="seletedDate"
           @cancel="isShowDate = false"
         />
    <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/static/home/ic_fangkebaobei@3x.png
h5/static/home/ic_huiyishiguanli@3x.png
h5/static/home/ic_kaoqin@3x.png
h5/static/home/ic_paichejilu@3x.png
h5/static/home/ic_renwuzhongxin@3x.png
h5/static/home/ic_wodehuiyi@3x.png
h5/static/home/ic_xiugaimima@3x.png
h5/static/home/ic_yinhuansuishoupai@3x.png
h5/static/home/ic_yongcheshenqing@3x.png
h5/static/home/ic_yuyuehuiyishi@3x.png
h5_meeting/unpackage/release/apk/»áÒéÊÒ.apk
Binary files differ
pda/api/index.js
@@ -157,4 +157,12 @@
    method: 'get',
    data
  })
}
// é¢„约     è¯¦æƒ…
export const driverApplyDetail = (data) => {
  return http({
    url: 'visitsAdmin/cloudService/web/driverPlatform/getDetail',
    method: 'get',
    data
  })
}
pda/manifest.json
@@ -1,96 +1,101 @@
{
    "name": "pda",
    "appid": "__UNI__8789FB4",
    "description": "",
    "versionName": "1.0.0",
    "versionCode": "100",
    "transformPx": false,
    "h5": {
        "router": {
            "mode": "hash",
            "base": "./"
        },
        // "base" : "/h5/"
        "devServer": {
            "port": 8090,
            "historyApiFallback": true,
            "disableHostCheck": true,
            "proxy": {
                "/gateway_interface": {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target": "http://192.168.0.100:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin": true, // å…è®¸è·¨åŸŸ
                    "pathRewrite": {
                        "^/gateway_interface": "" // é‡å†™åœ°å€ï¼Œå¦‚果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
                    }
                }
            },
            "https": false
        }
    },
    /* 5+App特有相关 */
    "app-plus": {
        "usingComponents": true,
        "nvueStyleCompiler": "uni-app",
        "compilerVersion": 3,
        "splashscreen": {
            "alwaysShowBeforeRender": true,
            "waiting": true,
            "autoclose": true,
            "delay": 0
        },
        /* æ¨¡å—配置 */
        "modules": {},
        /* åº”用发布信息 */
        "distribute": {
            /* android打包配置 */
            "android": {
                "permissions": [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios": {},
            /* SDK配置 */
            "sdkConfigs": {}
        }
    },
    /* å¿«åº”用特有相关 */
    "quickapp": {},
    /* å°ç¨‹åºç‰¹æœ‰ç›¸å…³ */
    "mp-weixin": {
        "appid": "",
        "setting": {
            "urlCheck": false
        },
        "usingComponents": true
    },
    "mp-alipay": {
        "usingComponents": true
    },
    "mp-baidu": {
        "usingComponents": true
    },
    "mp-toutiao": {
        "usingComponents": true
    },
    "uniStatistics": {
        "enable": false
    },
    "vueVersion": "2"
}
{
    "name" : "月台调度",
    "appid" : "__UNI__8789FB4",
    "description" : "",
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
    "h5" : {
        "router" : {
            "mode" : "hash",
            "base" : "./"
        },
        // "base" : "/h5/"
        "devServer" : {
            "port" : 8090,
            "historyApiFallback" : true,
            "disableHostCheck" : true,
            "proxy" : {
                "/gateway_interface" : {
                    // è¿™ä¸ªå­—段名需与你配置的basePrefixUrl一致,系统识别到带有/dev-api请求的地址时,会在前面拼接上代理服务器地址
                    "target" : "http://10.50.250.253:8088/gateway_interface", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    // "target": "http://192.168.0.100:10010", // ä»£ç†æœåŠ¡å™¨åŸŸåæˆ–IP地址
                    "changeOrigin" : true, // å…è®¸è·¨åŸŸ
                    "pathRewrite" : {
                        "^/gateway_interface" : "" // é‡å†™åœ°å€ï¼Œå¦‚果实际接口中是不带/dev-api,需要将这个前缀置空,因为这个前缀只是为了识别用,识别完之后就没用了
                    }
                }
            },
            "https" : false
        }
    },
    /* 5+App特有相关 */
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        /* æ¨¡å—配置 */
        "modules" : {},
        /* åº”用发布信息 */
        "distribute" : {
            /* android打包配置 */
            "android" : {
                "permissions" : [
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ]
            },
            /* ios打包配置 */
            "ios" : {
                "dSYMs" : false
            },
            /* SDK配置 */
            "sdkConfigs" : {
                "ad" : {}
            }
        }
    },
    /* å¿«åº”用特有相关 */
    "quickapp" : {},
    /* å°ç¨‹åºç‰¹æœ‰ç›¸å…³ */
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "vueVersion" : "2"
}
pda/pages.json
@@ -44,6 +44,13 @@
                "navigationBarTitleText": "配置显示月台",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/index/SubDetail",
            "style": {
                "navigationBarTitleText": "预约详情",
                "enablePullDownRefresh": false
            }
        }
    ],
    "globalStyle": {
pda/pages/index/SubDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,466 @@
<template>
  <view class="main_app">
    <view class="status_wrap">
      <view class="name">{{info.driverName}}的入园预约</view>
      <view class="gray">{{info.carCodeFront}}</view>
<!--             <view class="desc" :class="{
                gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '4',
              }">{{ infoStatus }}</view> -->
      <view class="status" v-if="info.status != 2 && info.status != 3">{{ statusMap[info.status] }}</view>
            <image v-if="info.status == 2" class="icon" src="@/static/ic_passed@2x.png" mode=""></image>
            <image v-if="info.status == 3" class="icon" src="@/static/ic_refused@2x.png" mode=""></image>
    </view>
    <!--  -->
    <view class="emyty"></view>
    <view class="module_list">
      <view class="item">
        <view class="label">入园原因</view>
        <view class="value">{{info.inReason}}</view>
      </view>
      <view class="item">
        <view class="label">合同编号</view>
        <view class="value">{{info.contractNum}}</view>
      </view>
            <view class="item">
              <view class="label">到场时间</view>
              <view v-if="info.arriveDate" class="value">{{info.arriveDate.slice(0,16)}}</view>
            </view>
            <view class="item">
              <view class="label">准运证照片</view>
              <view class="value">
                    <image
                        v-if="info.transportImg"
                      class="avatar_wrap"
                      :src="info.prefixUrl + info.transportImg"
                    ></image>
                </view>
            </view>
            <view class="item">
              <view class="label">入库类型</view>
              <view class="value">{{info.inType == 0 ? '整托盘' : '件烟'}}</view>
            </view>
            <view class="item">
              <view class="label">总运数量</view>
              <view class="value">{{info.totalNum}}万支</view>
            </view>
      <view class="emyty"></view>
      <view class="item">
        <view class="label">司机姓名</view>
        <view class="value">{{info.driverName}}
        </view>
      </view>
      <view class="item">
        <view class="label">手机号</view>
        <view class="value">{{info.driverPhone}}</view>
      </view>
            <view class="item">
              <view class="label">车牌照</view>
              <view class="value">前 {{info.carCodeFront}},后 {{info.carCodeBack}}</view>
            </view>
    </view>
    <!-- æµç¨‹ -->
    <view class="flow_wrap">
      <view class="flow_title">流程</view>
      <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 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" />
              </view>
              <view class="content">
                  <view class="head">
                      <view class="event">{{ item.title }}</view>
                      <view class="time">{{ item.checkDate }}</view>
                  </view>
                  <view class="name_wrap">
                      <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 == 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>
              </view>
          </view>
      </view>
    </view>
    <view class="emyty"></view>
  </view>
</template>
<script>
    import { driverApplyDetail } from '@/api'
export default {
  data() {
    return {
      showApprModal: false,
            checkInfo: '',
            infoStatus: '',
            flag: '1',
      info: {},
            type: 0,
            statusMap: {
                0: '待审批',
                1: '审批中',
                2: '已通过',
                3: '已拒绝',
                4: '已取消',
            },
    }
  },
    onLoad(option) {
        // this.type = option.objType
        // this.infoStatus = option.info
        this.getDetail(option.id)
    },
  methods: {
        getDetail(id) {
            driverApplyDetail({id}).then(res => {
                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.approveList = []
                        }
                    })
                }
                console.log('this.info.approveDateVO', this.info.approveDateVO.approveList);
            })
        },
  },
}
</script>
<style>
page {
  background-color: #f7f7f7;
}
</style>
<style lang="scss">
.main_app {
  background-color: #fff;
  padding-bottom: 0;
  .flow_wrap {
      padding: 30rpx 0;
      .flow_title {
          font-weight: 600;
          font-size: 32rpx;
          color: #222222;
          margin-bottom: 24rpx;
      }
      .list {
          .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;
                  position: relative;
                  margin-right: 20rpx;
                  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;
                      border-radius: 50%;
                      position: absolute;
                      right: 0;
                      bottom: 0;
                  }
              }
              .content {
                  flex: 1;
                  .head {
                      display: flex;
                      justify-content: space-between;
                      margin-bottom: 4rpx;
                      .event {
                          font-size: 30rpx;
                      }
                      .time {
                          font-size: 26rpx;
                          color: #999999;
                      }
                  }
                  .name_wrap {
                      font-size: 26rpx;
                      color: #777777;
                      .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;
                          font-size: 26rpx;
                          color: #777777;
                          .child_img {
                              width: 48rpx;
                              height: 48rpx;
                              border-radius: 50%;
                              margin-bottom: 2rpx;
                          }
                          .child_name {
                              margin-bottom: 2rpx;
                              width: 48rpx;
                              height: 48rpx;
                              text-align: center;
                              justify-content: center;
                              padding-top: 4rpx;
                              font-size: 28rpx;
                              border-radius: 50%;
                              color: #FFFFFF;
                              background-color: $uni-color-primary;
                          }
                      }
                  }
                  .remark {
                      margin-top: 12rpx;
                      background-color: #f7f7f7;
                      padding: 14rpx 20rpx;
                      border-radius: 8rpx;
                      font-size: 26rpx;
                      color: #666666;
                      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;
                  }
              }
          }
      }
  }
  .module_list {
    .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;
        .avatar_wrap {
          margin-right: 20rpx;
          width: 120rpx;
          height: 120rpx;
          border-radius: 8rpx;
          border: 2rpx solid #e5e5e5;
        }
        .info {
          flex: 1;
          display: flex;
          flex-direction: column;
          justify-content: space-between;
          font-size: 26rpx;
          color: #666666;
          .name {
            font-size: 30rpx;
            color: #333333;
          }
        }
      }
    }
  }
  .status_wrap {
    position: relative;
    padding: 30rpx 0;
    .name {
      font-weight: 600;
      font-size: 32rpx;
      margin-bottom: 20rpx;
      color: #222222;
    }
    .desc {
      font-size: 26rpx;
      color: #ed4545;
            margin-bottom: 12rpx;
    }
        .gray {
            color: #999999;
            margin-bottom: 12rpx;
        }
    .status {
      position: absolute;
      right: -30rpx;
      top: 0;
      height: 60rpx;
      line-height: 60rpx;
      padding: 0 32rpx;
      border-radius: 0rpx 0rpx 0rpx 30rpx;
      background-color: #e9edff;
      color: $uni-color-primary;
    }
        .icon{
            width: 120rpx;
            height: 120rpx;
            border-radius: 50%;
            position: absolute;
            right: 0rpx;
            top: 20rpx;
        }
  }
  .main_footer {
    padding-bottom: 64rpx;
    display: flex;
    justify-content: space-between;
    .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;
    }
  }
  .appr_modal {
    padding: 36rpx 30rpx 0;
    .title {
      font-weight: 600;
      font-size: 32rpx;
      color: #222222;
      margin-bottom: 40rpx;
      text-align: center;
    }
    textarea {
      box-sizing: border-box;
      width: 690rpx;
      background-color: #f7f7f7;
      font-size: 28rpx;
      color: #333333;
      padding: 24rpx;
      border-radius: 8rpx;
      margin-bottom: 30rpx;
    }
  }
  .emyty {
    width: 750rpx;
    height: 20rpx;
    background-color: #f7f7f7;
    margin: 0 -30rpx;
  }
}
</style>
pda/pages/index/center.vue
@@ -39,7 +39,8 @@
                </view>
                <view class="line" v-else>
                    <text class="label">合同单号</text>
                    <text class="value">{{ item.contractNum }}</text>
                    <text class="value">{{ item.contractNum }}</text>
                    <text class="primaryColor" @click="subDetail(item)">预约详情</text>
                </view>
                <view class="line">
                    <text class="label">驾驶员</text>
@@ -103,7 +104,8 @@
                            </view>
                            <view class="line" v-else>
                                <text class="label">合同单号</text>
                                <text class="value">{{ item.contractNum }}</text>
                                <text class="value">{{ item.contractNum }}</text>
                                <text class="primaryColor" @click="subDetail(item)">预约详情</text>
                            </view>
                            <view class="line">
                                <text class="label">驾驶员</text>
@@ -325,6 +327,11 @@
                    this.wmsInfo = res.data
                    this.showDetail = true
                })
            },
            subDetail(item) {
                uni.navigateTo({
                  url: `/pages/index/SubDetail?id=${item.bookId}`
                })
            },
            handleFinish(item) {
                finishWork({
pda/pages/index/login.vue
@@ -42,8 +42,8 @@
  data() {
    return {
      form: {
        username: '13996529050',
        password: '123456',
        username: '',
        password: '',
      },
            err: '',
      isShowProtocol: false,
pda/pages/index/queueup.vue
@@ -46,6 +46,7 @@
        <view class="line" v-else>
          <text class="label">合同单号</text>
          <text class="value">{{ item.contractNum }}</text>
                    <text class="primaryColor" @click="subDetail(item)">预约详情</text>
        </view>
        <view class="line">
          <text class="label">驾驶员</text>
@@ -163,6 +164,11 @@
          this.showDetail = true
      })
    },
        subDetail(item) {
            uni.navigateTo({
              url: `/pages/index/SubDetail?id=${item.bookId}`
            })
        },
    getPlatformGroup() {
      getPlatformGroupList({
        queryData: 1,
pda/static/ic_passed@2x.png
pda/static/ic_refused@2x.png
pda/static/staff/ic_chaosong@2x.png
pda/static/staff/ic_shenpiren@2x.png
pda/static/staff/liucheng_fail@2x.png
pda/static/staff/liucheng_success@2x.png
pda/unpackage/release/apk/__UNI__8789FB4__20241018164933.apk
Binary files differ
pda/unpackage/release/apk/pda.apk
Binary files differ
pda/unpackage/res/icons/1024x1024.png
pda/unpackage/res/icons/120x120.png
pda/unpackage/res/icons/144x144.png
pda/unpackage/res/icons/152x152.png
pda/unpackage/res/icons/167x167.png
pda/unpackage/res/icons/180x180.png
pda/unpackage/res/icons/192x192.png
pda/unpackage/res/icons/20x20.png
pda/unpackage/res/icons/29x29.png
pda/unpackage/res/icons/40x40.png
pda/unpackage/res/icons/58x58.png
pda/unpackage/res/icons/60x60.png
pda/unpackage/res/icons/72x72.png
pda/unpackage/res/icons/76x76.png
pda/unpackage/res/icons/80x80.png
pda/unpackage/res/icons/87x87.png
pda/unpackage/res/icons/96x96.png