ll
liukangdong
2024-10-18 0ed2002103cfe3d0892ee2468d98b7d3fad8e7b9
ll
已添加7个文件
已修改12个文件
1534 ■■■■■ 文件已修改
admin/src/components/business/OperaPlatformApproveTemplWindow.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalAlertWindow.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalConfiguration.vue 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/approvalReport.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprConfig.vue 267 ●●●●● 补丁 | 查看 | 原始文档 | 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/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 | 历史
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
@@ -40,6 +40,8 @@
    <GlobalAlertWindow
      title="修改密码"
      :visible.sync="visible.changePwd"
      :showClose="!userInfo.needChangePwd || userInfo.needChangePwd == '1'"
      :showCancel="userInfo.needChangePwd && userInfo.needChangePwd == '0'"
      @confirm="confirmChangePwd"
      @close="visible.changePwd = false"
    >
@@ -62,7 +64,7 @@
            v-model="changePwdData.form.newPwd"
            type="password"
            placeholder="请输入新密码"
            maxlength="30"
            maxlength="20"
            show-password
          ></el-input>
        </el-form-item>
@@ -71,7 +73,7 @@
            v-model="changePwdData.form.confirmPwd"
            type="password"
            placeholder="请再次输入新密码"
            maxlength="30"
            maxlength="20"
            show-password
          ></el-input>
        </el-form-item>
@@ -136,7 +138,10 @@
    // }
  },
  mounted() {
    console.log('userInfo',this.userInfo);
    // console.log('userInfo',this.userInfo);
    if(!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0'){
      this.visible.changePwd = true
    }
    
  },
  filters: {
admin/src/components/common/GlobalAlertWindow.vue
@@ -9,6 +9,7 @@
    :close-on-click-modal="false"
    :wrapper-closable="false"
    :append-to-body="true"
    :show-close="!showClose"
    @close="close"
  >
    <div slot="title" class="window__header">
@@ -20,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>
@@ -34,6 +35,14 @@
      type: String,
      default: '50%'
    },
    showClose: {
      type: Boolean,
      default: false
    },
    showCancel: {
      type: Boolean,
      default: true
    },
    // æ˜¯å¦åŒ…含底部操作
    withFooter: {
      type: Boolean,
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
@@ -82,7 +82,7 @@
      isRemPsd: false,
      username: '',
      password: '',
      activeTab: '1',
      activeTab: '0',
      // éªŒè¯ç 
      captcha: {
        loading: false,
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;
    }
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/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