ll
liukangdong
2024-09-06 d39cce94b1e2ac194fbf8c76b4925c7dcb41160e
ll
已添加6个文件
已修改14个文件
1368 ■■■■ 文件已修改
admin/src/api/business/approve.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/platform/index.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/workbench/index.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/task/bg_shenhe@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/task/bg_shenhe_chexiao@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/task/bg_shenhe_fail@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/task/bg_shenhe_pass@2x.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Header.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/subscribe.vue 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/config.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/platform.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/queueUp.vue 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/driverDetail.vue 500 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visReportDetail.vue 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/driver.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/approve.js
@@ -47,3 +47,7 @@
    params
  })
}
// ç‰©æµè½¦é¢„约详情
export function getDriverJobDetail (id) {
  return request.get('visitsAdmin/cloudService/business/platformBooks/getDetail?id=' + id)
}
admin/src/api/index.js
@@ -3,3 +3,4 @@
export * from './business/index'
export * from './platform'
export * from './other/other'
export * from './workbench/index'
admin/src/api/platform/index.js
@@ -59,3 +59,30 @@
    trim: true
  })
}
// è½¦è¾†æŽ’队情况
export function platformLineUpPage (data) {
  return request.post('/visitsAdmin/cloudService/business/platform/platformLineUpPage', data, {
    trim: true
  })
}
// å…¥å›­åŽŸå› 
export function platformReasonList () {
  return request.get('/visitsAdmin/cloudService/business/platformBooks/platformReasonList')
}
// ç‰©æµè½¦é¢„约
export function platformBooksApply (data) {
  return request.post('/visitsAdmin/cloudService/business/platformBooks/apply', data)
}
// èŽ·å–æœˆå°ç»„ ç­‰å¾…与异常挂起数据
export function getPlatformGroupWork (id) {
  return request.get('/visitsAdmin/cloudService/business/platform/getPlatformGroupWork?platformGroupId=' + id)
}
// æœˆå°å…¥å›­é¢„约 åˆ†é¡µåˆ—表
export function platformBooksPage (data) {
  return request.post('/visitsAdmin/cloudService/business/platformBooks/page', data)
}
// æœˆå°è°ƒåº¦ä½œä¸šä»»åŠ¡ åˆ†é¡µåˆ—表
export function platformJobPage (data) {
  return request.post('/visitsAdmin/cloudService/business/platformJob/page', data)
}
admin/src/api/workbench/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
import request from '@/utils/request'
// ä¸»ä½“数据
export function getWorkbenchBody (data) {
  return request.get('/visitsAdmin/cloudService/business/staging/body', data)
}
// å¤´éƒ¨æ•°æ®
export function getWorkbenchHead (data) {
  return request.get('/visitsAdmin/cloudService/business/staging/head', data)
}
// è¶…时预警人员
export function getWorkbenchLevel(data) {
  return request.get('/visitsAdmin/cloudService/business/staging/level', data)
}
// æ ‡è®°å·²è¯»
export function getWorkbenchSignRead (data) {
  return request.get('/visitsAdmin/cloudService/business/staging/signRead', data)
}
// ä»»åŠ¡ä¸­å¿ƒå¤´éƒ¨
export function getWorkbenchTaskHead (data) {
  return request.post('/visitsAdmin/cloudService/business/staging/taskCenterHeadPC', data)
}
admin/src/assets/task/bg_shenhe@2x.png
admin/src/assets/task/bg_shenhe_chexiao@2x.png
admin/src/assets/task/bg_shenhe_fail@2x.png
admin/src/assets/task/bg_shenhe_pass@2x.png
admin/src/components/common/CommonHeader.vue
@@ -2,7 +2,7 @@
  <div class="common-header">
    <div class="header">
      <div class="logo">
        <div>{{ title }}</div>
        <div class="title">{{ title }}</div>
        <div class="list">
          <div class="item active">
            <div>服务中心</div>
@@ -208,6 +208,7 @@
  background-color: #2080f7;
}
.list{
  flex: 1;
  display: flex;
  align-items: center;
  margin-left: 60px;
@@ -241,7 +242,7 @@
  .logo {
    /* background: url("../../assets/images/top_ic_chilun@2x.png") no-repeat; */
    box-sizing: border-box;
    min-width: 280px;
    min-width: 360px;
    height: 56px;
    padding: 10px 30px;
    // flex-shrink: 0;
@@ -251,6 +252,9 @@
    color: #fff;
    display: flex;
    align-items: center;
    .title{
      width: 200px;
    }
    // display: inline;
    .title-en {
      font-size: 11px;
@@ -259,7 +263,7 @@
    }
  }
  .user {
    width: 712px;
    width: 212px;
    box-sizing: border-box;
    height: 56px;
    padding-right: 25px;
admin/src/components/common/Header.vue
@@ -41,7 +41,7 @@
  h2 {
    flex-shrink: 0;
    line-height: 48px;
    width: 200px;
    width: 240px;
    font-size: 19px;
    color: #606263;
    font-weight: normal;
admin/src/views/index.vue
@@ -1,7 +1,7 @@
<template>
  <div class="main_home">
    <div class="home_header">
      <div class="mb10 fs17">下午好,系统管理员</div>
      <div class="mb10 fs17">下午好,{{ userInfo.realname }}</div>
      <div class="fs13">
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎回到智慧物流园区安消一体化系统
      </div>
@@ -225,6 +225,10 @@
import dayjs from 'dayjs'
import * as echarts from 'echarts'
import { weeks } from '@/utils/config'
import {
  getWorkbenchBody,
  getWorkbenchHead
} from '@/api'
const colors = ['#52a4f7', '#7678f7', '#5fc6d5']
export default {
  data () {
@@ -240,7 +244,13 @@
      ]
    }
  },
  computed: {
    userInfo(){
      return this.$store.state.userInfo
    }
  },
  created () {
    this.updateDate()
    setInterval(() => {
      this.updateDate()
@@ -255,11 +265,20 @@
      this.nowWeek = weeks[new Date().getDay()]
    },
    initData () {
      this.getWorkBody() //主体数据
      this.getWorkHead() //主体数据
      this.initEchart1()
      this.initEchart2()
      this.initEchart3()
      this.initEchart4()
    },
    getWorkBody() {
      getWorkbenchBody()
    },
    getWorkHead() {
      getWorkbenchHead()
    },
    initEchart1 () {
      const myChart = echarts.init(document.getElementById('echart1'))
      const option = {
admin/src/views/platform/LogisticsRecord/subscribe.vue
@@ -1,133 +1,160 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="车牌前照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车牌后照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="驾驶员"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="联系方式"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="合同单号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="入库类型"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="预约到场时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="审批结果"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="审批人"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作"
        min-width="80"
        align="center"
        show-overflow-tooltip
      >
    <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear" />
    <div>
      <el-button type="primary" @click="handleEdit" icon="el-icon-plus"
        v-permissions="['business:platformbooks:create']">新建</el-button>
      <el-button type="primary" @click="handleEx" v-permissions="['business:platformbooks:exportExcel']">导出</el-button>
    </div>
    <el-table class="mb20" v-loading="loading" :data="list" stripe>
      <el-table-column prop="contractNum" label="合同单号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="inReason" label="入园原因" min-width="100" show-overflow-tooltip />
      <el-table-column prop="totalNum" label="总作业量(万支)" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeFront" label="车牌前照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="carCodeBack" label="车牌后照号" min-width="100" show-overflow-tooltip />
      <el-table-column prop="driverName" label="驾驶员" min-width="100" show-overflow-tooltip />
      <el-table-column prop="driverPhone" label="联系方式" min-width="100" show-overflow-tooltip />
      <el-table-column prop="inTypeTemp" label="入库类型" min-width="100" show-overflow-tooltip />
      <el-table-column prop="arriveDate" label="预约到场时间" min-width="150" show-overflow-tooltip />
      <el-table-column prop="name" label="审批结果" min-width="100" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button type="text" @click="handleEdit(scope.row)">预约详情</el-button>
          <span v-if="scope.row.status == '0'">待审批</span>
          <span v-if="scope.row.status == '1'">审批中</span>
          <span v-if="scope.row.status == '2'">审批通过</span>
          <span v-if="scope.row.status == '3'">审批驳回</span>
          <span v-if="scope.row.status == '4'">已取消</span>
        </template>
      </el-table-column>
      <el-table-column prop="name" label="当前审批人" min-width="100" show-overflow-tooltip />
      <el-table-column prop="editDate" label="操作时间" min-width="150" show-overflow-tooltip />
      <el-table-column prop="name" label="操作" min-width="120" align="center" fixed="right" show-overflow-tooltip>
        <template v-slot="scope">
          <el-button type="text" v-permissions="['business:platformbooks:detail']"
            @click="handleDetail(scope.row)">预约详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
    <pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" />
    <!--  -->
    <GlobalWindow :title="param.id ? '编辑物流车预约' : '新增物流车预约'" center :visible.sync="isShowEdit" width="600px"
      :confirm-working="subLoading" @confirm="onSubmit">
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
        <div class="param_title">运输信息</div>
        <el-form-item label="入园原因" prop="inReason">
          <el-select v-model="param.inReason" class="w300" placeholder="请选择">
            <el-option v-for="item in reasonList" :key="item.id" :label="item.reason" :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="合同号" prop="contractNum">
          <el-input v-model="param.contractNum" class="w300" placeholder="请输入合同号"></el-input>
        </el-form-item>
        <el-form-item label="到场时间" prop="arriveDate">
          <el-date-picker v-model="param.arriveDate" value-format="yyyy-MM-dd HH:mm:ss" type="datetime" class="w300"
            placeholder="请选择">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="入库类型" prop="inType">
          <div>
            <el-radio v-model="param.inType" :label="0">整件盘</el-radio>
            <el-radio v-model="param.inType" :label="1">件烟</el-radio>
          </div>
        </el-form-item>
        <el-form-item label="总运输量" prop="totalNum">
          <el-input v-model="param.totalNum" placeholder="请输入" class="w300"></el-input>
          <span class="ml10">万支</span>
        </el-form-item>
        <el-form-item label="准运证照片" prop="transportImgFull">
          <UploadFaceImg :file="{ 'imgurlfull': param.transportImgFull, 'imgurl': param.transportImg }"
            :uploadData="{ folder: 'PLATFORM' }" @uploadSuccess="uploadSuccess" @uploadEnd="isUploading = false"
            @uploadBegin="isUploading = true" />
        </el-form-item>
        <div class="param_title">司机/车辆信息</div>
        <el-form-item label="司机姓名" prop="driverName">
          <el-input v-model="param.driverName" placeholder="请输入" class="w300"></el-input>
        </el-form-item>
        <el-form-item label="司机手机号" prop="driverPhone">
          <el-input v-model="param.driverPhone" placeholder="请输入" class="w300"></el-input>
        </el-form-item>
        <el-form-item label="车前牌照号" prop="carCodeFront">
          <el-input v-model="param.carCodeFront" placeholder="请输入" class="w300"></el-input>
        </el-form-item>
        <el-form-item label="车后牌照号" prop="carCodeBack">
          <el-input v-model="param.carCodeBack" placeholder="请输入" class="w300"></el-input>
        </el-form-item>
      </el-form>
    </GlobalWindow>
    <!--  -->
    <DriverDetail v-if="isShowDriver" ref="DriverDetailRef" />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { platformBooksPage, platformReasonList, platformBooksApply } from '@/api'
import DriverDetail from "@/views/task/driverDetail"
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadFaceImg from '@/components/common/UploadFaceImg'
export default {
  components: {
    Pagination,
    QueryForm
    QueryForm,
    DriverDetail,
    GlobalWindow,
    UploadFaceImg
  },
  data () {
    return {
      isShowDriver: false,
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      filters: {
        selDate: []
      },
      list: [],
      total: 0,
      isShowEdit: false,
      subLoading: false,
      param: {},
      rules: {},
      reasonList: [],
      rules: {
        contractNum: [{ required: true, message: '请输入', trigger: 'blur' }],
        totalNum: [{ required: true, message: '请输入', trigger: 'blur' }],
        driverName: [{ required: true, message: '请输入', trigger: 'blur' }],
        driverPhone: [{ required: true, message: '请输入', trigger: 'blur' }],
        carCodeFront: [{ required: true, message: '请输入', trigger: 'blur' }],
        carCodeBack: [{ required: true, message: '请输入', trigger: 'blur' }],
        inReason: [{ required: true, message: '请选择', trigger: 'blur' }],
        arriveDate: [{ required: true, message: '请选择', trigger: 'blur' }],
        inType: [{ required: true, message: '请选择', trigger: 'blur' }],
        driverName: [{ required: true, message: '请选择', trigger: 'blur' }],
      },
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            filed: 'carCodeFront',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            filed: 'driverName',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'cc',
            filed: 'contractNum',
            type: 'input',
            label: '合同单号'
          },
          {
            filed: 'selDate',
            type: 'daterange',
            type: 'datetimerange',
            label: '操作时间'
          }
        ],
@@ -135,7 +162,58 @@
      },
    }
  },
  created() {
    this.getList()
  },
  methods: {
    getList(page) {
      const { pagination, filters } = this
      this.loading = true
      platformBooksPage({
        model: {
          ...filters,
          arriveDateStart: filters.selDate && filters.selDate.length > 0 ? filters.selDate[0] : null,
          arriveDateEnd: filters.selDate && filters.selDate.length > 0 ? filters.selDate[1] : null,
        },
        capacity: pagination.pageSize,
        page: page || pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.list.forEach(item => {
          item.inTypeTemp = item.inType == 0 ? '整托盘' : '件烟'
        })
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    handleEx() {
    },
    onSubmit() {
      this.$refs['ruleForm'].validate((valid) => {
        const param = this.param
        if (valid) {
          platformBooksApply({...param}).then(res => {
          })
        }
      })
    },
    uploadSuccess(file) {
      this.$set(this.param, 'transportImg', file.imgurl)
      this.$set(this.param, 'transportImgFull', file.imgurlfull)
    },
    handleEdit(row) {
      this.isShowEdit = true
      this.getplatformReason()
    },
    getplatformReason() {
      platformReasonList().then(res => {
        this.reasonList = res || []
      })
    },
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
@@ -143,18 +221,34 @@
        }
      })
    },
    getList (page) { },
    clear () { },
    handleEdit (row) {
      this.isShowEdit = true
    clear() {
      this.pagination.page = 1
      this.filters = {
        selDate: []
      }
      this.getList()
    },
    handleDetail(row) {
      this.isShowDriver = true
      this.$nextTick(() => {
        this.$refs.DriverDetailRef.id = row.id
        this.$refs.DriverDetailRef.type = 6
        this.$refs.DriverDetailRef.getDetail()
        this.$refs.DriverDetailRef.isShowModal = true
      })
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style>
<style lang="scss" scoped>
.param_title {
  font-size: 18px;
  font-weight: 600;
  color: #000000;
  margin-bottom: 15px;
}
</style>
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -84,7 +84,13 @@
      width="480px"
    >
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
        <el-form-item label="运输单号" prop="name">
        <el-form-item label="入园原因" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="合同号" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="到场时间" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="车前牌照号" prop="name">
@@ -115,6 +121,7 @@
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import { platformJobPage } from '@/api'
export default {
  components: {
    Pagination,
@@ -124,29 +131,29 @@
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
        pageSize: 10,
        page: 1,
        total: 0
      },
      filters: {},
      list: [],
      total: 0,
      isShowEdit: false,
      param: {},
      rules: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            filed: 'carCodeFront',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            filed: 'driverName',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'cc',
            filed: 'code',
            type: 'input',
            label: '运输单号'
          },
@@ -160,6 +167,9 @@
      },
    }
  },
  created() {
    this.getList()
  },
  methods: {
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
@@ -168,18 +178,33 @@
        }
      })
    },
    getList (page) { },
    clear () { },
    getList (page) {
      const { pagination, filters } = this
      this.loading = true
      platformJobPage({
        model: { ...filters, jobType: 0 },
        capacity: pagination.pageSize,
        page: pagination.page,
      }).then(res => {
        this.loading = false
        this.list = res.records || []
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    clear () {
      this.pagination.page = 1
      this.filters = {}
      this.getList()
    },
    handleEdit (row) {
      this.isShowEdit = true
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
      this.pagination.pageSize = capacity
    }
  }
}
</script>
<style>
</style>
admin/src/views/platform/config.js
@@ -12,3 +12,14 @@
  10: '已离园',
  11: '已过号'
}
export const queryQueueUpConfig = {
  formItems: [
    {
      filed: 'carCodeFront',
      type: 'input',
      label: '搜索车辆',
      placeholder: '请输入车牌号'
    },
  ],
  online: true
}
admin/src/views/platform/platform.vue
@@ -68,7 +68,7 @@
        </el-table-column>
        <el-table-column prop="broadcastNames" label="关联广播" min-width="100px"></el-table-column>
        <el-table-column prop="ledNames" label="关联LED" min-width="100px"></el-table-column>
        <el-table-column prop="hkDate" label="同步时间" min-width="140px"></el-table-column>
        <el-table-column prop="hkDate" label="同步时间" min-width="150px"></el-table-column>
        <el-table-column
          v-if="containPermissions(['business:platform:update', 'business:platform:delete'])"
          label="操作"
admin/src/views/platform/queueUp.vue
@@ -2,33 +2,92 @@
  <div class="main_app">
    <div class="mb20 main_header">
      <div class="platgroup_tabs">
        <div
          class="tab"
          :class="{ active: activeGroup.id === item.id }"
          @click="platgroupClick(item)"
          v-for="(item, i) in PlatGroupList"
          :key="i"
        >
        <div class="tab" :class="{ active: activeGroup.id === item.id }" @click="platgroupClick(item)"
          v-for="(item, i) in PlatGroupList" :key="i">
          {{ item.name }}
        </div>
    </div>
    </div>
    <QueryForm v-model="filters" :query-form-config="queryQueueUpConfig" @handleQuery="getList(1)" @clear="clear">
    </QueryForm>
    <div class="main_content">
      <div class="static_wrap">
        <span>等待:<span class="num">{{ staticParam.waitNum }}</span></span>
        <span class="mr30">{{ }}</span>
        <span>挂起:<span class="red">{{ staticParam.exceptionNum }}</span></span>
        <span></span>
      </div>
    </div>
    <el-table class="mb20" v-loading="loading" :data="dataList" stripe row-key="id" default-expand-all>
      <el-table-column type="index" label="序号" width="80" />
      <el-table-column label="车牌号" width="160">
        <template slot-scope="{ row }">
          <div class="plate_id">
            <span>{{ row.carCodeFront.slice(0, 1) }}</span>
            <span>{{ row.carCodeFront.slice(1, 2) }}</span>
            <span>·</span>
            <span>{{ row.carCodeFront.slice(2) }}</span>
          </div>
        </template>
      </el-table-column>
      <el-table-column prop="carrierName" label="运输公司" min-width="200" />
      <el-table-column prop="code" label="运单号" min-width="200" />
      <el-table-column prop="totalNum" label="总运输量(万支)" min-width="130" />
      <el-table-column prop="driverName" label="驾驶员" min-width="140">
        <template slot-scope="{ row }">
          <span class="mr10">{{ row.driverName }}</span>
          <span>{{ row.drivierPhone }}</span>
        </template>
      </el-table-column>
      <el-table-column prop="signDate" label="签到时间" min-width="150" />
      <el-table-column label="操作" width="100" fixed="right">
        <template slot-scope="{ row }">
          <el-button type="text" @click="handleDetail(row)" v-permissions="['business:company:update']">运单详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="pagination" />
    <!--  -->
    <WaybillDetail
      ref="WaybillDetailRef"
      v-if="isShowDetail"
      @success="getList"
      @close="isShowDetail = false"
    />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import {
  getPlatformGroupList
  getPlatformGroupList,
  platformLineUpPage,
  getPlatformGroupWork
} from '@/api'
import { queryQueueUpConfig } from './config'
import WaybillDetail from './components/WaybillDetail.vue'
export default {
  components: {
    Pagination,
    QueryForm,
    WaybillDetail
  },
  data () {
    return {
      filters: {},
      activeGroup: {},
      PlatGroupList: [],
      isShowSet: false, // æœˆå°é…ç½®
      setParam: {},
      staticParam: {},
      dataList: [],
      loading: false,
      pagination: {
        pageSize: 10,
        page: 1,
        total: 0,
      },
      queryQueueUpConfig,
      isShowDetail: false, // è¿å•详情
      detail: {}
    }
@@ -43,36 +102,137 @@
        queryType: 1
      }).then(res => {
        this.PlatGroupList = res || []
        if (res && res.length > 0) {
        if (this.activeGroup && this.activeGroup.id) {
          this.activeGroup = res.find(item => item.id === this.activeGroup.id)
        } else {
          this.activeGroup = res[0]
        }
          this.getPlatformGroupWork()
          this.getList()
        }
      })
    },
    getList() {
      const { activeGroup, pagination, filters } = this
      this.loading = true
      platformLineUpPage({
        model: { platformGroupId: activeGroup.id, ...filters, callType: 3 },
        capacity: pagination.pageSize,
        page: pagination.page,
      }).then(res => {
        this.loading = false
        this.dataList = res.records || []
        this.pagination.total = res.total || 0
      }, () => {
        this.loading = false
      })
    },
    getPlatformGroupWork() {
      const { activeGroup } = this
      getPlatformGroupWork(activeGroup.id).then(res => {
        this.staticParam = res || {}
      })
    },
    handleSizeChange(e) {
      this.pagination.pageSize = e
      this.getList()
    },
    handlePageChange(e) {
      this.pagination.page = e
      this.getList()
    },
    platgroupClick (item) {
      this.activeGroup = { ...item }
      this.pagination.page = 1
      this.filters = {}
      this.getPlatformGroupWork()
      this.getList()
    },
    getList () { },
    clear () { }
    clear() {
      this.pagination.page = 1
      this.filters = {}
      this.getList()
    },
    handleDetail(row) {
      this.isShowDetail = true
      this.$nextTick(() => {
        this.$refs.WaybillDetailRef.isShowModal = true
      })
    },
  }
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.main_content {
  background-color: #fff;
  position: relative;
  z-index: 999;
  top: -10;
  margin: -20px;
  padding: 0 20px;
  .static_wrap {
    height: 50px;
    line-height: 50px;
    color: #666666;
    font-size: 15px;
    padding: 0 20px;
    background: #F4FAFB;
    border-radius: 2px 2px 0px 0px;
    margin-bottom: 36px;
    .num {
      color: #111111;
    }
  }
}
.plate_id {
  display: flex;
  width: 111px;
  font-weight: 600;
  height: 30px;
  line-height: 30px;
  font-size: 16px;
  color: #111111;
  border-radius: 4px;
  border: 1px solid #dfdede;
  span {
    &:nth-of-type(1) {
      background: $primary-color;
      padding: 0 6px;
      color: #fff
    }
    &:nth-of-type(2) {
      padding-left: 2px;
    }
    &:nth-of-type(4) {
      padding-right: 3px;
    }
  }
}
.main_header {
  .platgroup_tabs {
    flex: 1;
    display: flex;
    border-bottom: 1px solid #dfe2e8;
    .tab {
      color: #666666;
      margin-right: 40px;
      cursor: pointer;
      padding-bottom: 18px;
      padding-bottom: 14px;
      border-bottom: 2px solid #fff;
    }
    .active {
      font-weight: 500;
      font-size: 15px;
admin/src/views/task/driverDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,500 @@
<template>
  <GlobalWindow :title="title" :visible.sync="isShowModal" @confirm="confirm">
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.status == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
          <div class="left">
            <div class="h1">物流车预约</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
          </div>
          <div class="right" :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{ statusMap[info.status] }}</div>
        </div>
        <div class="info">
          <div class="title">公务车申请信息</div>
          <div class="list">
            <div class="item">
              <div class="label">申请人</div>
              <div class="value">{{ info.driverName }} {{ info.driverPhone }}</div>
            </div>
            <div class="item">
              <div class="label">车牌照</div>
              <div class="value">前 {{ info.carCodeFront }},后 {{ info.carCodeBack }}</div>
            </div>
            <div class="item">
              <div class="label">合同编号</div>
              <div class="value">{{ info.contractNum }}</div>
            </div>
            <div class="item">
              <div class="label">到厂时间</div>
              <div class="value">{{ info.arriveDate }}</div>
            </div>
            <div class="item">
              <div class="label">入库类型</div>
              <div class="value">{{ info.inType == 0 ? '整托盘' : '件烟' }}</div>
            </div>
            <div class="item">
              <div class="label">总运输量</div>
              <div class="value">{{ info.totalNum }}万支</div>
            </div>
            <div class="item">
              <div class="label">准运证照片</div>
              <div v-if="info.transportImg" class="value">
                <el-image  style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]" :src="info.prefixUrl + info.transportImg" alt="" />
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="side">
        <div class="side_title">审批流程</div>
        <div class="list" v-if="info.approveDateVO != null && info.approveDateVO.approveList != null">
          <div class="item" v-for="item, index in info.approveDateVO.approveList">
            <div v-if="index != info.approveDateVO.approveList.length - 1" class="separate"></div>
            <div class="info">
              <img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
              <img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
              <img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
            </div>
            <div class="avatar_wrap">
              <img class="img" :src="item.faceImg
                ? item.faceImg
                : require('@/assets/avatar/man.png')
                " />
            </div>
            <div class="content">
              <div class="head">
                <div class="event">{{ item.title }}</div>
                <div class="time">{{ item.createDate }}</div>
              </div>
              <div class="name_wrap">
                <span>{{ item.memberName }}<span v-if="item.statusInfo" class="status">({{ item.statusInfo
                    }})</span></span>
              </div>
              <div v-if="item.checkInfo" class="remark">
                {{ item.checkInfo }}
              </div>
              <div v-if="item.approveType == 1" class="carbon">
                <div class="carbon_item" v-for="child in item.approveList" :key="child.id">
                  <img :src="child.faceImg
                    ? child.faceImg
                    : require('@/assets/avatar/man.png')
                    "></img>
                  <div class="text">{{ child.memberName }}</div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!--  -->
    <template v-slot:footer>
      <el-button @click="handleAppr(2)" type="primary" class="status-red" v-if="
        info.approveDateVO != null &&
        info.approveDateVO.canBeApproved != null &&
        info.approveDateVO.canBeApproved == 1
      ">同意</el-button>
      <el-button @click="handleAppr(3)" type="danger" v-if="
        info.approveDateVO != null &&
        info.approveDateVO.canBeApproved != null &&
        info.approveDateVO.canBeApproved == 1
      ">拒绝</el-button>
      <el-button @click="isShowModal = false">返回</el-button>
    </template>
    <!--  åŒæ„/拒绝 -->
    <el-dialog append-to-body :title="apprTitle" :visible.sync="isShowAppr" width="480px">
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '同意说明' : '拒绝说明'">
          <el-input type="textarea" :placeholder="param.status == 2 ? '同意说明,非必填' : '拒绝说明必填'
            " :rows="4" v-model="param.checkInfo" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowAppr = false">取消</el-button>
        <el-button :loading="subLoading" type="primary" @click="onSubAppr">确定</el-button>
      </span>
    </el-dialog>
  </GlobalWindow>
</template>
<script>
import GlobalWindow from '@/components/common/GlobalWindow'
import {
  getDriverJobDetail,
  approveDo
} from '@/api'
export default {
  components: { GlobalWindow },
  data() {
    return {
      id: '',
      type: '',
      title: '访客预约详情',
      isShowModal: false,
      info: {},
      isShowAppr: false,
      apprTitle: '同意',
      subLoading: false,
      param: {},
      isShowProblem: false,
      rules: {
        checkInfo: [{ required: true, message: '请输入', trigger: 'blur' }]
      },
      statusMap: {
        0: '待审核',
        1: '处理中',
        2: '已同意',
        3: '已拒绝',
        4: '已取消',
        5: '他人或签',
        6: '他人拒绝'
      },
      cateList: {
        0: '访客申请',
        1: '访客报备',
        2: '用车申请',
        3: '隐患随手拍',
        4: '物流车申请'
      }
    }
  },
  methods: {
    onSubAppr() {
      this.$refs.ruleForm.validate((valid) => {
        if (!valid) {
          return
        }
        this.$dialog.actionConfirm('操作确认', this.param.status === 2 ? '您确认同意该申请吗?' : '您确认拒绝该申请吗?')
          .then(() => {
            this.subLoading = true
            approveDo({
              objId: this.id,
              objType: 6,
              status: this.param.status,
              checkInfo: this.param.checkInfo
            })
              .then(res => {
                this.subLoading = false
                this.$tip.apiSuccess('处理成功')
                this.getDetail()
                this.isShowAppr = false
              })
              .finally(() => {
                this.subLoading = false
              })
          })
      })
    },
    getDetail() {
      const { id } = this
      getDriverJobDetail(id).then(res => {
        this.info = res
        if (this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0) {
          this.info.approveDateVO.approveList.forEach(item => {
            if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
              item.title = item.approveList[0].title
              item.faceImg = item.approveList[0].faceImg
              item.memberName = item.approveList[0].memberName
              item.statusInfo = item.approveList[0].statusInfo
              item.approveList = []
            }
          })
        }
      })
    },
    handleAppr(val) {
      this.$set(this.param, 'status', val)
      this.apprTitle = val == 2 ? '同意' : '拒绝'
      this.isShowAppr = true
    },
    confirm() {
      console.log('--')
    },
    handleTransfer() {
      this.isShowProblem = true
    },
    reject() { },
    handleAvatarSuccess() { },
    beforeAvatarUpload() { }
  }
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.upload_box {
  width: 84px;
  height: 84px;
  border-radius: 4px;
  background-color: #f7f7f7;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  color: #999999;
  border: 1px solid #e4e4e4;
  .icon {
    font-size: 24px;
  }
  .text {
    font-size: 12px;
  }
}
.side_title {
  font-weight: 600;
  font-size: 18px;
  color: #111111;
  margin-bottom: 20px;
  margin-left: 20px;
  margin-top: 20px;
}
.modal_wrap {
  display: flex;
  height: 100%;
  .modal_content {
    flex: 1;
    padding: 0px 30px;
    border-radius: 8px;
    overflow: hidden;
    height: 100%;
    .title {
      font-weight: 600;
      font-size: 18px;
      color: #333333;
      margin-bottom: 20px;
      margin-top: 30px;
    }
    .info {
      .list {
        display: flex;
        flex-wrap: wrap;
        .item {
          display: flex;
          width: 40%;
          margin-bottom: 20px;
          &:nth-of-type(2n) {
            width: 60%;
          }
          .label {
            color: #888888;
            width: 100px;
          }
          .value {
            color: #111111;
          }
        }
      }
    }
    .header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 20px 30px;
      margin: 0 -30px;
      border-radius: 8px 8px 0 0;
      position: relative;
      .head_bg{
        position: absolute;
        width: 100%;
        height: 100%;
        left: 0;
        top: 0;
        z-index: 9;
      }
      .h1 {
        font-weight: 600;
        font-size: 22px;
        color: #111111;
        margin-bottom: 8px;
      }
      .time {
        font-size: 14px;
        color: #999999;
      }
      .right {
        height: 40px;
        font-size: 16px;
        color: #ffffff;
        line-height: 40px;
        padding: 0 20px;
        background: #207ff7;
        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
        border-radius: 16px 0px 16px 0px;
        position: relative;
        z-index: 99;
      }
      .scs{
        background-color: #00BA67;
      }
      .msg{
        background-color: #ED4545;
      }
    }
    .table_info {
      .name_wrap {
        display: flex;
        align-items: center;
        .avatar {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          margin-right: 12px;
        }
        .content {
          .line {
            display: flex;
          }
          .tag {
            color: #b2cbf9;
            border: 1px solid #b2cbf9;
            padding: 0px 4px;
            border-radius: 4px;
            margin-left: 6px;
          }
        }
      }
    }
  }
  .side {
    height: 100%;
    width: 420px;
    background: #ffffff;
    border-left: 20px solid #f7f7f7;
    .list {
      .item {
        padding: 8px 0;
        display: flex;
        margin-bottom: 24px;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
          left: 31px;
          height: calc(100% - 2px);
          top: 42px;
        }
        .info{
          padding-top: 10px;
          margin-left: 20px;
          margin-right: 16px;
          .iconnew {
            width: 24px;
            height: 24px;
          }
        }
        .avatar_wrap {
          width: 40px;
          height: 40px;
          position: relative;
          margin-right: 10px;
          .img {
            width: 40px;
            height: 40px;
            border-radius: 50%;
          }
          .status {
            width: 14px;
            height: 14px;
            border-radius: 50%;
            position: absolute;
            right: 0;
            bottom: 0;
          }
        }
        .content {
          flex: 1;
          .head {
            display: flex;
            justify-content: space-between;
            margin-bottom: 2px;
            .event {
              font-size: 15px;
            }
            .time {
              font-size: 13px;
              color: #999999;
            }
          }
          .name_wrap {
            font-size: 13px;
            color: #777777;
            .status {
              color: $primary-color;
            }
          }
          .remark {
            margin-top: 6px;
            background-color: #f7f7f7;
            padding: 7px 10px;
            border-radius: 4px;
            font-size: 13px;
            color: #666666;
            line-height: 18px;
          }
        }
        .carbon {
          display: flex;
          width: 100%;
          overflow-x: auto;
          margin-top: 12px;
          .carbon_item {
            text-align: center;
            flex-shrink: 0;
            width: 60px;
            img {
              width: 36px;
              height: 36px;
              margin: 0 auto;
            }
            div {
              font-size: 13px;
              color: #777777;
            }
          }
        }
      }
    }
  }
}
</style>
admin/src/views/task/index.vue
@@ -59,24 +59,11 @@
      :data="dataList"
      stripe
      row-key="id"
      class="mb20"
      default-expand-all
    >
<!--      <el-table-column prop="name" label="任务类型" min-width="100">
        <template v-slot="scope">
          <span
            v-if="
              (scope.row.objType || scope.row.objType == 0) &&
              cateList[scope.row.objType].name
            "
            >{{ cateList[scope.row.objType].name }}</span
          >
        </template>
      </el-table-column>-->
      <el-table-column label="处理事项" min-width="200">
        <template slot-scope="{ row }"> {{ row.title}}
<!--          <span v-if="row.title">{{
            row.title.split("-")[1]
          }}</span>-->
        </template>
      </el-table-column>
      <el-table-column prop="createDate" label="提交时间" min-width="100">
@@ -100,6 +87,7 @@
    <TaskDetail v-if="isShowDetail" ref="DetailRef" />
    <VisReportDetail v-if="isShowReport" ref="VisReportDetailRef" />
    <DangetDetail v-if="isShowDanger" ref="DangetDetailRef" />
    <DriverDetail v-if="isShowDriver" ref="DriverDetailRef" />
    <!-- ç”¨è½¦ç”³è¯· -->
    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="getList" />
    <!-- é𐿂£ -->
@@ -115,6 +103,7 @@
import TaskDetail from './visSubDetail.vue'
import VisReportDetail from './visReportDetail.vue'
import DangetDetail from './dangetDetail.vue'
import DriverDetail from './driverDetail.vue'
import OperaCarUseBookWindow from '@/components/business/OperaCarUseBookWindow'
import OperaHiddenDangerWindow from '@/components/business/OperaHiddenDangerWindow'
import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow'
@@ -130,6 +119,7 @@
    VisReportDetail,
    DangetDetail,
    QueryForm,
    DriverDetail,
    Pagination,
    OperaCarUseBookWindow,
    OperaHiddenDangerWindow,
@@ -140,6 +130,7 @@
      isShowDetail: false,
      isShowReport: false,
      isShowDanger: false,
      isShowDriver: false,
      filters: {
        queryType: '0',
        fastdate: 0
@@ -229,6 +220,17 @@
        this.$refs.OperaHiddenDangerWindow.open('隐患随手拍详情', obj)
        return
      }
      if (row.objType === 6) {
        const obj = { ...row, id: row.objId }
        this.isShowDriver = true
        this.$nextTick(() => {
          this.$refs.DriverDetailRef.id = row.objId
          this.$refs.DriverDetailRef.type = row.objType
          this.$refs.DriverDetailRef.getDetail()
          this.$refs.DriverDetailRef.isShowModal = true
        })
        return
      }
      if (row.objType === 0) {
        this.isShowDetail = true
        this.$nextTick(() => {
admin/src/views/task/visReportDetail.vue
@@ -45,69 +45,24 @@
      </div>
      <div class="side">
        <div class="side_title">审批流程</div>
        <div
          class="list"
          v-if="
        <div class="list" v-if="
            info.approveDateVO != null && info.approveDateVO.approveList != null
          "
        >
          <div
            class="item"
            v-for="(item, index) in info.approveDateVO.approveList"
            :key="item.id"
          >
            <div
              class="separate"
              v-if="index < info.approveDateVO.approveList.length - 1"
            ></div>
        ">
          <div class="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id">
            <div class="separate" v-if="index < info.approveDateVO.approveList.length - 1"></div>
            <div class="info">
              <img
                src="@/assets/icons/ic_tongguo.png"
                class="iconnew"
                v-if="item.status == 2"
              />
              <img
                src="@/assets/icons/ic_dangqian.png"
                class="iconnew"
                v-if="item.status == 1"
              />
              <img
                src="@/assets/icons/ic_jujue.png"
                class="iconnew"
                v-if="item.status == 3"
              />
              <img
                src="@/assets/icons/ic_grey.png"
                class="iconnew"
                v-if="item.status == null || item.status == 0"
              />
              <img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="item.status == 2" />
              <img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="item.status == 1" />
              <img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="item.status == 3" />
              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
              <div style="display: inline" v-if="item.approveType != 1">
                <img
                  v-if="item.faceImg != null && item.faceImg != ''"
                  :src="item.faceImg"
                  class="avatar"
                  alt=""
                />
                <img
                  v-if="item.faceImg == null || item.faceImg == ''"
                  src="@/assets/avatar/man.png"
                  class="avatar"
                  alt=""
                />
                <img v-if="item.faceImg != null && item.faceImg != ''" :src="item.faceImg" class="avatar" alt="" />
                <img v-if="item.faceImg == null || item.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
                  alt="" />
              </div>
              <div style="display: inline" v-if="item.approveType == 1">
                <img
                  v-if="item.type != 1"
                  src="@/assets/icons/ic_duoren.png"
                  class="avatar"
                  alt=""
                />
                <img
                  v-if="item.type == 1"
                  src="@/assets/icons/ic_chaosong.png"
                  class="avatar"
                  alt=""
                />
                <img v-if="item.type != 1" src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
                <img v-if="item.type == 1" src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              </div>
              <div class="content">
                <div class="line">
@@ -117,47 +72,27 @@
                <div class="line">
                  <div class="company">
                    {{ item.memberName }}
                    <div
                      style="display: inline"
                      v-if="item.statusInfo != null && item.statusInfo != ''"
                    >
                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                      ï¼ˆ<span class="status-green">{{
                        item.statusInfo || ""
                      }}</span
                      >)
                        }}</span>)
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div
              v-if="
            <div v-if="
                item.approveType != 1 &&
                item.checkInfo != null &&
                item.checkInfo != ''
              "
              class="remark"
            >
            " class="remark">
              {{ item.checkInfo || "" }}
            </div>
            <div v-if="item.approveType == 1" class="childList">
              <div
                class="m_content company"
                v-for="item1 in item.approveList"
                :key="item1.id"
              >
                <img
                  v-if="item1.faceImg != null && item1.faceImg != ''"
                  :src="item1.faceImg"
                  class="avatar"
                  alt=""
                />
                <img
                  v-if="item1.faceImg == null || item1.faceImg == ''"
                  src="@/assets/avatar/man.png"
                  class="avatar"
                  alt=""
                />
              <div class="m_content company" v-for="item1 in item.approveList" :key="item1.id">
                <img v-if="item1.faceImg != null && item1.faceImg != ''" :src="item1.faceImg" class="avatar" alt="" />
                <img v-if="item1.faceImg == null || item1.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
                  alt="" />
                <span> {{ item1.memberName }}</span>
              </div>
            </div>
@@ -167,46 +102,24 @@
    </div>
    <!--  -->
    <template v-slot:footer>
      <el-button
        @click="handleAppr(2)"
        type="primary"
        class="status-red"
        v-if="
      <el-button @click="handleAppr(2)" type="primary" class="status-red" v-if="
          info.approveDateVO != null &&
          info.approveDateVO.canBeApproved != null &&
          info.approveDateVO.canBeApproved == 1
        "
        >同意</el-button
      >
      <el-button
        @click="handleAppr(3)"
        type="danger"
        v-if="
      ">同意</el-button>
      <el-button @click="handleAppr(3)" type="danger" v-if="
          info.approveDateVO != null &&
          info.approveDateVO.canBeApproved != null &&
          info.approveDateVO.canBeApproved == 1
        "
        >拒绝</el-button
      >
      ">拒绝</el-button>
      <el-button @click="isShowModal = false">返回</el-button>
    </template>
    <!--  åŒæ„/拒绝 -->
    <el-dialog
      append-to-body
      :title="apprTitle"
      :visible.sync="isShowAppr"
      width="480px"
    >
    <el-dialog append-to-body :title="apprTitle" :visible.sync="isShowAppr" width="480px">
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '同意说明' : '拒绝说明'">
          <el-input
            type="textarea"
            :placeholder="
              param.status == 2 ? '同意说明,非必填' : '拒绝说明必填'
            "
            :rows="4"
            v-model="param.checkInfo"
          />
          <el-input type="textarea" :placeholder="param.status == 2 ? '同意说明,非必填' : '拒绝说明必填'
            " :rows="4" v-model="param.checkInfo" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
@@ -215,32 +128,16 @@
      </span>
    </el-dialog>
    <!-- é𐿂£ -->
    <el-dialog
      append-to-body
      title="隐患"
      :visible.sync="isShowProblem"
      width="480px"
    >
    <el-dialog append-to-body title="隐患" :visible.sync="isShowProblem" width="480px">
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
        <el-form-item label="退回时间">
          <el-date-picker
            class="w300"
            value-format="yyyy-MM-dd"
            type="date"
            placeholder="选择日期"
            v-model="param.date"
          />
          <el-date-picker class="w300" value-format="yyyy-MM-dd" type="date" placeholder="选择日期" v-model="param.date" />
        </el-form-item>
        <el-form-item label="整改前">
          <div class="df_ac">
            <img src="@/assets/avatar/man.png" />
            <el-upload
              class="avatar-uploader"
              action="https://jsonplaceholder.typicode.com/posts/"
              :show-file-list="false"
              :on-success="handleAvatarSuccess"
              :before-upload="beforeAvatarUpload"
            >
            <el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/"
              :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
              <img v-if="param.url" :src="param.url" class="avatar" />
              <div v-else class="upload_box">
                <el-icon class="el-icon-plus icon" />
@@ -250,19 +147,12 @@
          </div>
        </el-form-item>
        <el-form-item label="退回说明">
          <el-input
            type="textarea"
            placeholder="请填写说明"
            :rows="4"
            v-model="param.explain"
          />
          <el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="param.explain" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowProblem = false">取消</el-button>
        <el-button type="primary" @click="isShowProblem = false"
          >确定</el-button
        >
        <el-button type="primary" @click="isShowProblem = false">确定</el-button>
      </span>
    </el-dialog>
  </GlobalWindow>
@@ -346,6 +236,7 @@
    },
    handleAppr (val) {
      this.$set(this.param, 'status', val)
      this.apprTitle = val == 2 ? '同意' : '拒绝'
      this.isShowAppr = true
    },
    confirm () {
@@ -373,13 +264,16 @@
  align-items: center;
  color: #999999;
  border: 1px solid #e4e4e4;
  .icon {
    font-size: 24px;
  }
  .text {
    font-size: 12px;
  }
}
.side_title {
  font-weight: 600;
  font-size: 18px;
@@ -388,9 +282,11 @@
  margin-left: 20px;
  margin-top: 20px;
}
.modal_wrap {
  display: flex;
  height: 100%;
  .modal_content {
    flex: 1;
    padding: 0px 30px;
@@ -405,6 +301,7 @@
      margin-bottom: 20px;
      margin-top: 30px;
    }
    .info {
      .list {
        display: flex;
@@ -414,6 +311,7 @@
          display: flex;
          width: 40%;
          margin-bottom: 20px;
          &:nth-of-type(2n) {
            width: 60%;
          }
@@ -462,20 +360,24 @@
        border-radius: 16px 0px 16px 0px;
      }
    }
    .table_info {
      .name_wrap {
        display: flex;
        align-items: center;
        .avatar {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          margin-right: 12px;
        }
        .content {
          .line {
            display: flex;
          }
          .tag {
            color: #b2cbf9;
            border: 1px solid #b2cbf9;
@@ -493,10 +395,12 @@
    width: 420px;
    background: #ffffff;
    border-left: 20px solid #f7f7f7;
    .list {
      .item {
        padding: 8px 0;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
@@ -504,6 +408,7 @@
          height: calc(100% - 36px);
          top: 49px;
        }
        .avatar {
          width: 40px;
          height: 40px;
@@ -511,18 +416,22 @@
          margin: 0 12px 0 16px;
          //border: 1px solid;
        }
        .childList {
          display: flex;
          flex-wrap: wrap;
          margin-left: 100px;
        }
        .company {
          font-size: 13px;
          color: #888888;
          .status {
            color: #00ba67;
          }
        }
        .m_content {
          display: flex;
          flex-direction: column;
@@ -530,56 +439,67 @@
          justify-content: center;
          margin-bottom: 4px;
        }
        .info {
          display: flex;
          align-items: center;
          margin-left: 20px;
          .icon {
            position: relative;
            z-index: 11;
            color: #53b76f;
            font-size: 24px;
          }
          .icon1 {
            position: relative;
            z-index: 11;
            color: deepskyblue;
            font-size: 24px;
          }
          .icon2 {
            position: relative;
            z-index: 11;
            color: #dc362e;
            font-size: 24px;
          }
          .iconnew {
            width: 24px;
            height: 24px;
          }
          .icon3 {
            position: relative;
            z-index: 11;
            color: gray;
            font-size: 24px;
          }
          .content {
            flex: 1;
            .line {
              display: flex;
              justify-content: space-between;
              align-content: center;
              margin-bottom: 6px;
              .name {
                font-weight: 600;
                font-size: 16px;
                color: #111111;
              }
              .time {
                color: #888888;
              }
            }
          }
        }
        .remark {
          background: #f7f7f7;
          border-radius: 4px;
h5/pages/staff/task/driver.vue
@@ -91,6 +91,9 @@
            <view class="name_wrap">
              <text>{{item.memberName}}<text v-if="item.statusInfo" class="status">({{item.statusInfo}})</text></text>
            </view>
                        <div v-if="item.checkInfo" class="remark">
                            {{ item.checkInfo }}
                        </div>
                        <view v-if="item.approveType == 1" class="carbon">
                          <view class="carbon_item" v-for="child in item.approveList"
                :key="child.id">