From 0fc9c0d48dccf86855a1210d97649dde38422a92 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期四, 30 四月 2026 16:23:03 +0800
Subject: [PATCH] 小程序 | app

---
 admin/src/components/business/OperaDriverEditWindow.vue |  353 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 353 insertions(+), 0 deletions(-)

diff --git a/admin/src/components/business/OperaDriverEditWindow.vue b/admin/src/components/business/OperaDriverEditWindow.vue
new file mode 100644
index 0000000..fc4f9e9
--- /dev/null
+++ b/admin/src/components/business/OperaDriverEditWindow.vue
@@ -0,0 +1,353 @@
+<template>
+  <GlobalWindow
+      :title="title"
+      :visible.sync="visible"
+      width="900px"
+      :withFooter="false"
+  >
+    <div class="driver-approval">
+      <div class="section">
+        <div class="section-header">
+          <span class="section-title">鍙告満淇℃伅</span>
+          <div class="approval-status">
+            <el-tag v-if="detailInfo.auditStatus === 0" type="warning" class="status-tag">寰呭鏍�</el-tag>
+          </div>
+        </div>
+        <div class="info-grid">
+          <div class="info-item">
+            <span class="label">鍙告満濮撳悕锛�</span>
+            <span class="value">{{ detailInfo.name || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">鎺堟潈鎵嬫満鍙凤細</span>
+            <span class="value">{{ detailInfo.telephone || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">韬唤璇佸彿锛�</span>
+            <span class="value">{{ detailInfo.idcard || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">濠氬Щ鎯呭喌锛�</span>
+            <span class="value" v-if="detailInfo.maritalStatus === 3">涓у伓</span>
+            <span class="value" v-else-if="detailInfo.maritalStatus === 2">绂诲紓</span>
+            <span class="value" v-else-if="detailInfo.maritalStatus === 1">宸插</span>
+            <span class="value" v-else-if="detailInfo.maritalStatus === 0">鏈</span>
+            <span class="value" v-else>-</span>
+          </div>
+          <div class="info-item">
+            <span class="label">鎬у埆锛�</span>
+            <span class="value">{{ detailInfo.gender === 1 ? '鐢�' : detailInfo.gender === 2 ? '濂�' : '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">鐜板眳浣忓湴鍧�锛�</span>
+            <span class="value">{{ detailInfo.livePlace || '-' }}</span>
+          </div>
+          <div class="info-item"  v-if="detailInfo.auditStatus === 3 || detailInfo.auditStatus === 1" >
+            <span class="label">璇勭骇锛�</span>
+            <span class="value" v-if="detailInfo.driverLevel ==5">S</span>
+            <span class="value" v-else-if="detailInfo.driverLevel ==4">A</span>
+            <span class="value" v-else-if="detailInfo.driverLevel ==3">B</span>
+            <span class="value" v-else-if="detailInfo.driverLevel ==2">C</span>
+            <span class="value" v-else-if="detailInfo.driverLevel ==1">D</span>
+            <span class="value" v-else>-</span>
+          </div>
+          <div class="info-item">
+            <span class="label">鐘舵�侊細</span>
+            <span class="value">{{ detailInfo.status === 0 ? '鍚敤' : '绂佺敤' }}</span>
+          </div>
+        </div>
+      </div>
+
+      <div class="section">
+        <div class="section-header">
+          <span class="section-title">杞﹁締淇℃伅</span>
+        </div>
+        <div class="info-grid">
+          <div class="info-item">
+            <span class="label">杞︾墝鍙凤細</span>
+            <span class="value">{{ detailInfo.carCode || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">杞﹁締绫诲瀷锛�</span>
+            <span class="value">{{ detailInfo.carTypeName || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">杞﹁締棰滆壊锛�</span>
+            <span class="value">{{ detailInfo.carColor || '-' }}</span>
+          </div>
+          <div class="info-item">
+            <span class="label">椹鹃┒璇佹湁鏁堟湡锛�</span>
+            <span class="value">{{ detailInfo.cardStartDate || '-' }} 鑷� {{ detailInfo.cardEndDate || '-' }}</span>
+          </div>
+        </div>
+      </div>
+
+      <div class="section">
+        <div class="section-header">
+          <span class="section-title">闄勪欢鏉愭枡</span>
+        </div>
+        <div class="info-grid">
+          <div class="info-item">
+            <span class="label">韬唤璇佹闈細</span>
+            <el-image
+                v-if="detailInfo.idcardImg"
+                style="width: 80px; height: 80px"
+                :src="detailInfo.imgPrefix + detailInfo.idcardImg"
+                :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImg]"
+                fit="cover"
+            ></el-image>
+            <span v-else>-</span>
+          </div>
+          <div class="info-item">
+            <span class="label">韬唤璇佸弽闈細</span>
+            <el-image
+                v-if="detailInfo.idcardImgBack"
+                style="width: 80px; height: 80px"
+                :src="detailInfo.imgPrefix + detailInfo.idcardImgBack"
+                :preview-src-list="[detailInfo.imgPrefix + detailInfo.idcardImgBack]"
+                fit="cover"
+            ></el-image>
+            <span v-else>-</span>
+          </div>
+          <div class="info-item full-width">
+            <span class="label">杞﹁締鐓х墖锛�</span>
+            <span v-if="!detailInfo.carImgList">-</span>
+            <div v-else class="image-list">
+              <el-image
+                  v-for="(img, index) in detailInfo.carImgList"
+                  :key="index"
+                  style="width: 80px; height: 80px; margin-right: 10px"
+                  :src="img.fileurlFull"
+                  :preview-src-list="detailInfo.carImgList.map(item => item.fileurlFull)"
+                  fit="cover"
+              ></el-image>
+            </div>
+          </div>
+          <div class="info-item full-width">
+            <span class="label">椹鹃┒璇佺収鐗囷細</span>
+            <span v-if="!detailInfo.licenseImgList">-</span>
+            <div v-else class="image-list">
+              <el-image
+                  v-for="(img, index) in detailInfo.licenseImgList"
+                  :key="index"
+                  style="width: 80px; height: 80px; margin-right: 10px"
+                  :src="img.fileurlFull"
+                  :preview-src-list="detailInfo.licenseImgList.map(item => item.fileurlFull)"
+                  fit="cover"
+              ></el-image>
+            </div>
+          </div>
+          <div class="info-item full-width">
+            <span class="label">鍏跺畠鏉愭枡锛�</span>
+            <span v-if="!detailInfo.otherImgList">-</span>
+            <div v-else class="image-list">
+              <el-image
+                  v-for="(img, index) in detailInfo.otherImgList"
+                  :key="index"
+                  style="width: 80px; height: 80px; margin-right: 10px"
+                  :src="img.fileurlFull"
+                  :preview-src-list="detailInfo.otherImgList.map(item => item.fileurlFull)"
+                  fit="cover"
+              ></el-image>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="approval-form" v-if="detailInfo.auditStatus === 0" >
+        <el-form ref="approvalForm" :model="approvalForm" :rules="approvalForm.auditStatus ===0?approvalRules:approvalRules1">
+          <el-form-item label="瀹℃壒缁撴灉" prop="auditStatus">
+            <el-radio-group v-model="approvalForm.auditStatus" @change="changeRadio">
+              <el-radio :label="0">閫氳繃</el-radio>
+              <el-radio :label="1">鎷掔粷</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="鍙告満璇勭骇" prop="driverLevel" v-if="approvalForm.auditStatus ===0">
+            <el-select v-model="approvalForm.driverLevel" placeholder="璇烽�夋嫨鍙告満璇勭骇" style="width: 300px">
+              <el-option label="S" :value="5"></el-option>
+              <el-option label="A" :value="4"></el-option>
+              <el-option label="B" :value="3"></el-option>
+              <el-option label="C" :value="2"></el-option>
+              <el-option label="D" :value="1"></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="瀹℃壒鎰忚" prop="auditRemark"  >
+            <el-input
+                type="textarea"
+                v-model="approvalForm.auditRemark"
+                placeholder="璇疯緭鍏ュ鎵规剰瑙�"
+                :rows="3"
+                style="width: 400px"
+            ></el-input>
+          </el-form-item>
+        </el-form>
+        <div class="approval-buttons">
+          <el-button @click="close">鍙栨秷</el-button>
+          <el-button type="primary" @click="handleConfirm" :loading="isWorking">纭畾</el-button>
+        </div>
+      </div>
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { getById, audit } from '@/api/business/driver'
+export default {
+  name: 'OperaDriverApproval',
+  components: { GlobalWindow },
+  data () {
+    return {
+      title: '鍙告満瀹℃牳',
+      visible: false,
+      isWorking: false,
+      detailInfo: {},
+      approvalForm: {
+        id: null,
+        auditStatus: 0,
+        driverLevel: '',
+        auditRemark: ''
+      },
+      approvalRules: {
+        auditStatus: [{ required: true, message: '璇烽�夋嫨瀹℃壒缁撴灉', trigger: 'change' }],
+        driverLevel: [{ required: true, message: '璇烽�夋嫨鍙告満璇勭骇', trigger: 'change' }]
+      },
+      approvalRules1: {
+        auditStatus: [{ required: true, message: '璇烽�夋嫨瀹℃壒缁撴灉', trigger: 'change' }],
+        auditRemark: [{ required: true, message: '璇疯緭鍏ュ鎵规剰瑙�', trigger: 'blur' }]
+      }
+    }
+  },
+  methods: {
+    changeRadio(){
+      this.$refs.approvalForm.clearValidate()
+    },
+    open (title, row) {
+      this.title = title
+      this.approvalForm = {
+        id: row.id,
+        auditStatus: 0,
+        driverLevel: '',
+        auditRemark: ''
+      }
+      this.$nextTick(() => {
+        this.$refs.approvalForm && this.$refs.approvalForm.clearValidate()
+      })
+      getById(row.id).then(res => {
+        this.detailInfo = res
+        this.visible = true
+      }).catch(e => {
+        this.$tip.apiFailed(e)
+      })
+    },
+    close () {
+      this.visible = false
+    },
+    handleConfirm () {
+      this.$refs.approvalForm.validate(valid => {
+        if (!valid) return
+        if (this.approvalForm.status === 2 && !this.approvalForm.remark) {
+          this.$message.warning('璇疯緭鍏ュ鎵规剰瑙�')
+          return
+        }
+        this.isWorking = true
+        audit({
+          id: this.approvalForm.id,
+          auditStatus: this.approvalForm.auditStatus,
+          driverLevel: this.approvalForm.driverLevel,
+          auditRemark: this.approvalForm.auditRemark
+        }).then(res => {
+          this.$tip.apiSuccess(res || '瀹℃牳鎴愬姛')
+          this.$emit('success', this.approvalForm)
+          this.visible = false
+        }).catch(e => {
+          this.$tip.apiFailed(e)
+        }).finally(() => {
+          this.isWorking = false
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.driver-approval {
+
+}
+.section {
+  margin-bottom: 25px;
+}
+.checkinfo {
+  align-items:start   !important;
+  display: flex !important;
+  flex-direction: column   !important;
+  background-color: rgb(254 242 242);
+  min-height: 100px;
+  margin-bottom: 30px;
+  padding: 20px;
+}
+.section-header {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  margin-bottom: 15px;
+  flex-wrap: wrap;
+}
+.section-title {
+  font-size: 16px;
+  font-weight: bold;
+  color: #303133;
+  padding-left: 10px;
+  border-left: 4px solid #2E68EC;
+}
+.approval-status {
+  margin-left: auto;
+}
+.status-tag {
+  font-size: 14px;
+  padding: 4px 12px;
+}
+.info-grid {
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 15px;
+  padding: 0 10px;
+}
+.info-item {
+  display: flex;
+  font-size: 14px;
+}
+.info-item.full-width {
+  grid-column: span 2;
+}
+.info-item .label {
+  color: #909399;
+  min-width: 110px;
+}
+.info-item .value {
+  color: #606266;
+  word-break: break-all;
+}
+.image-list {
+  display: flex;
+  flex-wrap: wrap;
+}
+.approval-form {
+  padding: 20px;
+  background: #f5f7fa;
+  border-top: 1px solid #eee;
+}
+.approval-form /deep/ .el-form-item {
+  margin-bottom: 15px;
+}
+.approval-form /deep/ .el-form-item:last-child {
+  margin-bottom: 0;
+}
+.approval-buttons {
+  display: flex;
+  justify-content: flex-end;
+  gap: 10px;
+  margin-top: 15px;
+}
+</style>

--
Gitblit v1.9.3