From 34437176cfbc2dc30f786601f5abf27d605e2c15 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期一, 13 四月 2026 20:17:20 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/gtzxinglijicun

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

diff --git a/admin/src/components/business/OperaShopApprovalWindow.vue b/admin/src/components/business/OperaShopApprovalWindow.vue
new file mode 100644
index 0000000..cf67cd7
--- /dev/null
+++ b/admin/src/components/business/OperaShopApprovalWindow.vue
@@ -0,0 +1,450 @@
+<template>
+  <GlobalWindow
+    :title="title"
+    :withFooter="false"
+    :visible.sync="visible"
+    width="80%"
+  >
+    <div class="store-header" v-if="storeInfo">
+      <div class="store-header-left">
+        <el-image :src="storeInfo.payMemberCoverImage ? storeInfo.imgPrefix + storeInfo.payMemberCoverImage : ''" fit="cover" class="store-avatar">
+          <div slot="error" class="image-slot">
+            <i class="el-icon-picture-outline"></i>
+          </div>
+        </el-image>
+      </div>
+      <div class="store-header-right">
+        <div class="store-name">{{ storeInfo.name }}</div>
+        <div class="store-info-row">
+          <span class="info-item">
+            <span class="label">闂ㄥ簵绫诲瀷锛�</span>
+            <span class="value">{{ storeInfo.companyType === 1 ? '浼佷笟' : '涓汉' }}</span>
+          </span>
+          <span class="info-item">
+            <span class="label">鑱旂郴浜猴細</span>
+            <span class="value">{{ storeInfo.linkName }}</span>
+          </span>
+          <span class="info-item">
+            <span class="label">鑱旂郴鐢佃瘽锛�</span>
+            <span class="value">{{ storeInfo.linkPhone }}</span>
+          </span>
+          <span class="info-item">
+            <span class="label">韬唤璇佸彿锛�</span>
+            <span class="value">{{ storeInfo.idcard }}</span>
+          </span>
+        </div>
+      </div>
+    </div>
+
+    <div class="qualification-content" v-if="storeInfo">
+      <div class="qualification-section">
+        <h4 class="section-title">鍩烘湰淇℃伅</h4>
+        <div class="info-grid">
+          <div class="info-row">
+            <span class="label">鎵�鍦ㄧ渷甯傚尯锛�</span>
+            <span class="value">{{ storeInfo.provinceName || '' }} {{ storeInfo.cityName || '' }} {{ storeInfo.areaName || '' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="label">闂ㄥ簵鍦板潃锛�</span>
+            <span class="value">{{ storeInfo.address }}</span>
+          </div>
+          <div class="info-row">
+            <span class="label">闂ㄥ簵鐘舵�侊細</span>
+            <span class="value">{{ storeInfo.auditStatus === 0 ? '寰呭鎵�' : storeInfo.auditStatus === 1 ? '瀹℃壒閫氳繃' : '瀹℃壒鏈�氳繃' }}</span>
+          </div>
+          <div class="info-row">
+            <span class="label">閰嶉�佽寖鍥达細</span>
+            <span class="value">{{ storeInfo.deliveryRange || '鏆傛棤' }}</span>
+          </div>
+        </div>
+      </div>
+
+      <div class="qualification-section">
+        <h4 class="section-title">涓讳綋璧勮川</h4>
+        <template v-if="storeInfo.companyType === 1">
+          <div class="info-grid">
+            <div class="info-row">
+              <span class="label">娉曚汉濮撳悕锛�</span>
+              <span class="value">{{ storeInfo.legalPersonName }}</span>
+            </div>
+            <div class="info-row">
+              <span class="label">娉曚汉鎵嬫満鍙凤細</span>
+              <span class="value">{{ storeInfo.legalPersonPhone }}</span>
+            </div>
+            <div class="info-row">
+              <span class="label">娉曚汉韬唤璇佸彿鐮侊細</span>
+              <span class="value">{{ storeInfo.legalPersonCard }}</span>
+            </div>
+          </div>
+          <div class="image-section">
+            <div class="image-item">
+              <span class="label">娉曚汉韬唤璇佹闈細</span>
+              <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]">
+                <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+              </el-image>
+            </div>
+            <div class="image-item">
+              <span class="label">娉曚汉韬唤璇佸弽闈細</span>
+              <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]">
+                <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+              </el-image>
+            </div>
+            <div class="image-item">
+              <span class="label">钀ヤ笟鎵х収锛�</span>
+              <el-image :src="storeInfo.businessImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.businessImg]">
+                <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+              </el-image>
+            </div>
+          </div>
+        </template>
+        <template v-else>
+          <div class="image-item-row">
+            <span class="label">韬唤璇佹闈細</span>
+            <el-image :src="storeInfo.idcardImg" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImg]">
+              <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+            </el-image>
+          </div>
+          <div class="image-item-row">
+            <span class="label">韬唤璇佸弽闈細</span>
+            <el-image :src="storeInfo.idcardImgBack" fit="cover" class="qualification-image" :preview-src-list="[storeInfo.idcardImgBack]">
+              <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+            </el-image>
+          </div>
+          <div class="image-item-row">
+            <span class="label">鏈夋晥鍔冲姩鍚堝悓锛�</span>
+            <div class="image-list">
+              <el-image v-for="(img, index) in storeInfo.laborContractImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.laborContractImgs">
+                <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+              </el-image>
+            </div>
+          </div>
+          <div class="image-item-row">
+            <span class="label">绀句繚缂寸撼璇佹槑锛�</span>
+            <div class="image-list">
+              <el-image v-for="(img, index) in storeInfo.socialSecurityImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.socialSecurityImgs">
+                <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+              </el-image>
+            </div>
+          </div>
+        </template>
+      </div>
+
+      <div class="qualification-section" v-if="storeInfo.companyType === 1">
+        <h4 class="section-title">闂ㄥ簵鐓х墖鍙婂叾浠栨潗鏂�</h4>
+        <div class="image-item-row">
+          <span class="label">闂ㄥ簵闂ㄥご鐓э細</span>
+          <div class="image-list">
+            <el-image v-for="(img, index) in storeInfo.storeFrontImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeFrontImgs">
+              <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+            </el-image>
+          </div>
+        </div>
+        <div class="image-item-row">
+          <span class="label">闂ㄥ簵鍐呴儴鐓х墖锛�</span>
+          <div class="image-list">
+            <el-image v-for="(img, index) in storeInfo.storeInteriorImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.storeInteriorImgs">
+              <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+            </el-image>
+          </div>
+        </div>
+        <div class="image-item-row">
+          <span class="label">鍏跺畠鏉愭枡锛�</span>
+          <div class="image-list">
+            <el-image v-for="(img, index) in storeInfo.otherMaterialImgs" :key="index" :src="img" fit="cover" class="qualification-image" :preview-src-list="storeInfo.otherMaterialImgs">
+              <div slot="error" class="image-slot"><i class="el-icon-picture-outline"></i></div>
+            </el-image>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="approval-section" v-if="storeInfo && storeInfo.auditStatus !== 0">
+      <div class="approval-result" :class="storeInfo.auditStatus === 1 ? 'approval-pass' : 'approval-reject'">
+        <div class="approval-status" v-if="storeInfo.auditStatus === 1">
+          <i class="el-icon-circle-check"></i>
+          <span>瀹℃牳閫氳繃</span>
+        </div>
+        <div class="approval-status" v-else>
+          <i class="el-icon-circle-close"></i>
+          <span>瀹℃牳鎷掔粷</span>
+        </div>
+        <div class="approval-info" v-if="storeInfo.auditStatus === 1">
+          <span class="info-item">瀹℃牳鏃堕棿锛歿{ storeInfo.auditTime }}</span>
+          <span class="info-item">瀹℃牳浜猴細{{ storeInfo.auditName }}</span>
+        </div>
+        <div class="approval-info" v-else>
+          <div class="info-item" v-if="storeInfo.auditRemark">澶囨敞锛歿{ storeInfo.auditRemark }}</div>
+          <div class="info-item">瀹℃牳鏃堕棿锛歿{ storeInfo.auditTime }}</div>
+          <div class="info-item">瀹℃牳浜猴細{{ storeInfo.auditName }}</div>
+        </div>
+      </div>
+    </div>
+
+    <div class="approval-form" v-if="storeInfo && storeInfo.auditStatus === 0">
+      <el-form ref="approvalForm" :model="approvalForm" :rules="approvalRules">
+        <el-form-item label="瀹℃壒缁撴灉" prop="auditStatus">
+          <el-radio-group v-model="approvalForm.auditStatus" @change="handleAuditStatusChange">
+            <el-radio :label="0">閫氳繃</el-radio>
+            <el-radio :label="1">鎷掔粷</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="瀹℃壒鎰忚" prop="auditRemark">
+          <el-input
+            v-model="approvalForm.auditRemark"
+            type="textarea"
+            :rows="2"
+            :placeholder="approvalForm.auditStatus === 2 ? '璇疯緭鍏ユ嫆缁濆師鍥狅紙蹇呭~锛�' : '璇疯緭鍏ュ鎵规剰瑙�'"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <section class="approval-buttons">
+          <el-button type="primary" @click="handleSubmit" :loading="isWorking.submit">鎻愪氦</el-button>
+          <el-button @click="handleCancel">鍙栨秷</el-button>
+        </section>
+      </el-form>
+    </div>
+  </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { detail, audit } from '@/api/business/shopInfo'
+
+export default {
+  name: 'OperaShopApprovalWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      storeInfo: null,
+      approvalForm: {
+        id: null,
+        auditStatus: 0,
+        auditRemark: ''
+      },
+      approvalRules: {
+        auditRemark: [
+          { required: true, message: '璇疯緭鍏ユ嫆缁濆師鍥�', trigger: 'blur' }
+        ]
+      },
+      isWorking: {
+        submit: false
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/shopInfo',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    open (title, row) {
+      this.title = title
+      this.approvalForm = {
+        id: row.id,
+        auditStatus: 1,
+        auditRemark: ''
+      }
+      detail(row.id)
+        .then(res => {
+          this.storeInfo = res
+          this.visible = true
+        })
+        .catch(e => {
+          this.$tip.apiFailed(e)
+        })
+    },
+    handleAuditStatusChange (val) {
+      if (val === 1) {
+        this.approvalRules.auditRemark = []
+      } else {
+        this.approvalRules.auditRemark = [{ required: true, message: '璇疯緭鍏ユ嫆缁濆師鍥�', trigger: 'blur' }]
+      }
+    },
+    handleSubmit () {
+      this.$refs.approvalForm.validate(valid => {
+        if (!valid) return
+        this.isWorking.submit = true
+        audit(this.approvalForm)
+          .then(res => {
+            this.$tip.apiSuccess(res || '鎻愪氦鎴愬姛')
+            this.visible = false
+            this.$emit('success')
+          })
+          .catch(e => {
+            this.$tip.apiFailed(e)
+          })
+          .finally(() => {
+            this.isWorking.submit = false
+          })
+      })
+    },
+    handleCancel () {
+      this.visible = false
+    }
+  }
+}
+</script>
+
+<style scoped>
+.store-header {
+  display: flex;
+  background: #f5f7fa;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 20px;
+}
+.store-header-left {
+  margin-right: 20px;
+}
+.store-avatar {
+  width: 80px;
+  height: 80px;
+  border-radius: 50%;
+}
+.store-header-right {
+  flex: 1;
+}
+.store-name {
+  font-size: 18px;
+  font-weight: bold;
+  color: #303133;
+  margin-bottom: 10px;
+}
+.store-info-row {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 20px;
+}
+.info-item {
+  font-size: 14px;
+  color: #606266;
+}
+.info-item .label {
+  color: #909399;
+}
+.qualification-content {
+  padding: 20px;
+}
+.qualification-section {
+  margin-bottom: 30px;
+}
+.section-title {
+  font-size: 16px;
+  font-weight: bold;
+  color: #303133;
+  margin-bottom: 15px;
+  padding-left: 10px;
+  border-left: 4px solid #2E68EC;
+}
+.info-grid {
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 15px;
+  margin-bottom: 20px;
+}
+.info-row {
+  display: flex;
+  font-size: 14px;
+}
+.info-row .label {
+  color: #909399;
+  min-width: 100px;
+}
+.info-row .value {
+  color: #606266;
+}
+.image-section {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 30px;
+}
+.image-item {
+  display: flex;
+  flex-direction: column;
+}
+.image-item-row {
+  display: flex;
+  align-items: flex-start;
+  margin-bottom: 20px;
+}
+.image-item-row .label {
+  color: #909399;
+  font-size: 14px;
+  min-width: 120px;
+}
+.image-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+.image-item .label {
+  color: #909399;
+  font-size: 14px;
+  margin-bottom: 8px;
+}
+.qualification-image {
+  width: 150px;
+  height: 100px;
+  border-radius: 4px;
+  border: 1px solid #eee;
+}
+.image-slot {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  height: 100%;
+  background: #f5f7fa;
+  color: #909399;
+  font-size: 20px;
+}
+.approval-section {
+  padding: 20px;
+}
+.approval-result {
+  border-radius: 8px;
+  padding: 20px;
+}
+.approval-pass {
+  background: #f0f9eb;
+  border: 1px solid #67c23a;
+}
+.approval-reject {
+  background: #fef0f0;
+  border: 1px solid #f56c6c;
+}
+.approval-status {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 15px;
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+.approval-pass .approval-status {
+  color: #67c23a;
+}
+.approval-reject .approval-status {
+  color: #f56c6c;
+}
+.approval-info {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 30px;
+  font-size: 14px;
+  color: #606266;
+}
+.approval-form {
+  padding: 20px;
+  border-top: 1px solid #eee;
+  background: #f5f7fa;
+  border-radius: 8px;
+  margin-top: 20px;
+}
+.approval-buttons {
+  margin-top: 20px;
+}
+</style>

--
Gitblit v1.9.3