MrShi
2025-03-12 69a1b3bf45738f048361ee4ccb6bdc64fce35720
admin/src/views/task/driverDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,519 @@
<template>
  <GlobalWindow :title="title" :visible.sync="isShowModal" @close="close" @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 || info.ioQty }}万支</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.checkDate }}</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 == 0 || item.type == 1 || item.approveType == 1" class="carbon">
                <div class="carbon_item" v-for="child in item.approveList" :key="child.id">
                  <img v-if="child.faceImg != null && child.faceImg != ''" :src="child.faceImg" class="avatar" alt="" />
                  <img v-if="child.faceImg == null || child.faceImg == ''" src="@/assets/avatar/man.png" class="avatar"
                    alt="" />
                  <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="close">返回</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.$emit('success')
                this.$emit('close')
                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 = []
            }
          })
        }
      })
    },
    close() {
      this.isShowModal = false
      this.$emit('close')
    },
    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: $primaryColor;
            }
          }
          .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>