From eb7a808aaf7dd0a6dd2ff70f9ef3f8ce0b1e31d1 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期五, 22 五月 2026 18:27:32 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/gtzxinglijicun

---
 admin/src/components/business/OperaShopEditWindow.vue |  308 ++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 233 insertions(+), 75 deletions(-)

diff --git a/admin/src/components/business/OperaShopEditWindow.vue b/admin/src/components/business/OperaShopEditWindow.vue
index 7c3855d..0cf82a2 100644
--- a/admin/src/components/business/OperaShopEditWindow.vue
+++ b/admin/src/components/business/OperaShopEditWindow.vue
@@ -49,6 +49,17 @@
             <el-button type="primary" @click="openMapSelector">閫夋嫨</el-button>
           </div>
         </el-form-item>
+        <el-form-item label="浣嶇疆鏍囩" prop="locationTagIds">
+          <el-select v-model="form.locationTagIds" multiple placeholder="璇烽�夋嫨浣嶇疆鏍囩" style="width: 100%;" @change="handleLocationTagChange">
+            <el-option v-for="item in locationTagList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="闂ㄥ簵閰嶉�佽寖鍥�" prop="deliveryRange">
+          <div class="delivery-range">
+            <el-input v-model.number="form.deliveryRange" placeholder="璇疯緭鍏ラ厤閫佽寖鍥�" style="width: 150px;"></el-input>
+            <span class="unit">鍏噷</span>
+          </div>
+        </el-form-item>
       </div>
 
       <div class="form-section">
@@ -143,6 +154,34 @@
                 @deleteRow="index => form.otherMaterialImgs.splice(index, 1)" />
             </el-form-item>
           </el-tab-pane>
+          
+          <el-tab-pane label="闂ㄥ簵鍒嗘垚" name="profit">
+            <div class="profit-section">
+              <h4 class="section-title">灏卞湴瀵勫瓨妯″紡</h4>
+              <el-form-item label="鍦ㄨ鍗曚腑浣滀负瀵勪欢鐐规椂锛屽垎鎴愭瘮渚嬩负" prop="localDeposit" label-suffix="锛�*" :rules="[{ validator: this.validateDepositRate, trigger: 'blur' }]">
+                <div class="profit-input">
+                  <el-input v-model="form.localDeposit" placeholder="璇疯緭鍏ュ垎鎴愭瘮渚�" style="width: 150px;"></el-input>
+                  <span class="unit">%</span>
+                </div>
+              </el-form-item>
+            </div>
+            
+            <div class="profit-section">
+              <h4 class="section-title">鍚屽煄瀵勯�佹ā寮�</h4>
+              <el-form-item label="鍦ㄨ鍗曚腑浣滀负瀵勪欢鐐规椂锛屽垎鎴愭瘮渚嬩负" prop="remoteTake" label-suffix="锛�*" :rules="[{ validator: this.validateDepositRate, trigger: 'blur' }]">
+                <div class="profit-input">
+                  <el-input v-model="form.remoteDeposit" placeholder="璇疯緭鍏ュ垎鎴愭瘮渚�" style="width: 150px;"></el-input>
+                  <span class="unit">%</span>
+                </div>
+              </el-form-item>
+              <el-form-item label="鍦ㄨ鍗曚腑浣滀负鏀朵欢鐐规椂锛屽垎鎴愭瘮渚嬩负" prop="remoteDeposit" label-suffix="锛�" :rules="[{ validator: this.validateDepositRate, trigger: 'blur' }]">
+                <div class="profit-input">
+                  <el-input v-model="form.remoteTake" placeholder="璇疯緭鍏ュ垎鎴愭瘮渚�" style="width: 150px;"></el-input>
+                  <span class="unit">%</span>
+                </div>
+              </el-form-item>
+            </div>
+          </el-tab-pane>
         </el-tabs>
       </div>
     </el-form>
@@ -155,6 +194,7 @@
 import UploadImages from '@/components/common/uploadImages'
 import { detail, updateById } from '@/api/business/shopInfo'
 import { listByParentId } from '@/api/business/areas'
+import { fetchList } from '@/api/business/category'
 export default {
   name: 'OperaShopEditWindow',
   extends: BaseOpera,
@@ -176,6 +216,11 @@
         address: '',
         longitude: '',
         latitude: '',
+        locationTagIds: [],
+        deliveryRange: '',
+        localDeposit: '',
+        remoteTake: '',
+        remoteDeposit: '',
         legalPersonName: '',
         legalPersonPhone: '',
         legalPersonCard: '',
@@ -188,6 +233,7 @@
         storeInteriorImgs: '',
         otherMaterialImgs: ''
       },
+      locationTagList: [],
       rules: {
         name: [{ required: true, message: '璇疯緭鍏ラ棬搴楀悕绉�', trigger: 'blur' }],
         companyType: [{ required: true, message: '璇烽�夋嫨闂ㄥ簵绫诲瀷', trigger: 'change' }],
@@ -206,8 +252,8 @@
         laborContractImgs: [{ required: true, message: '璇疯緭鍏ユ湁鏁堝姵鍔ㄥ悎鍚�', trigger: 'blur' }],
         socialSecurityImgs: [{ required: true, message: '璇疯緭鍏ョぞ淇濈即绾宠瘉鏄�', trigger: 'blur' }],
         storeFrontImgs: [{ required: true, message: '璇疯緭鍏ラ棬搴楅棬澶寸収', trigger: 'blur' }],
-        storeInteriorImgs: [{ required: true, message: '璇疯緭鍏ラ棬搴楀唴閮ㄧ収鐗�', trigger: 'blur' }],
-        otherMaterialImgs: [{ required: true, message: '璇疯緭鍏ュ叾瀹冩潗鏂�', trigger: 'blur' }]
+        storeInteriorImgs: [{ required: true, message: '璇疯緭鍏ラ棬搴楀唴閮ㄧ収鐗�', trigger: 'blur' }]
+        // otherMaterialImgs: [{ required: true, message: '璇疯緭鍏ュ叾瀹冩潗鏂�', trigger: 'blur' }]
       },
       qualificationTab: 'enterprise',
       areaOptions: [],
@@ -222,47 +268,87 @@
       'field.id': 'id'
     })
     this.loadAreaOptions()
+    this.getLocationTagList()
   },
   methods: {
-    open (title, row) {
-      this.isWorking.save = false
-      detail(row.id)
-        .then(res => {
-          this.form = {
-            id: res.id,
-            telephone: res.telephone || '',
-            name: res.name || '',
-            companyType: res.companyType ?? 1,
-            linkName: res.linkName || '',
-            linkPhone: res.linkPhone || '',
-            idcard: res.idcard || '',
-            areaCode: res.provinceId ? [res.provinceId, res.cityId, res.areaId] : [],
-            provinceId: res.provinceId || '',
-            cityId: res.cityId || '',
-            areaId: res.areaId || '',
-            address: res.address || '',
-            longitude: res.longitude || '',
-            latitude: res.latitude || '',
-            legalPersonName: res.legalPersonName || '',
-            legalPersonPhone: res.legalPersonPhone || '',
-            legalPersonCard: res.legalPersonCard || '',
-            businessImg: res.companyType === 1 ? [{ fileurl: res.businessImg, url: res.imgPrefix + res.businessImg }] : [],
-            idcardImg: [{ fileurl: res.idcardImg, url: res.imgPrefix + res.idcardImg }],
-            idcardImgBack: [{ fileurl: res.idcardImgBack, url: res.imgPrefix + res.idcardImgBack }],
-            laborContractImgs: res.laborContractImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
-            socialSecurityImgs: res.socialSecurityImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
-            storeFrontImgs: res.storeFrontImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
-            storeInteriorImgs: res.storeInteriorImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
-            otherMaterialImgs: res.otherMaterialImgs ? res.otherMaterialImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })) : []
+    validateDepositRate (rule, value, callback) {
+      if (value !== null && value !== '' && value !== undefined) {
+        const num = Number(value)
+        if (isNaN(num)) {
+          callback(new Error('璇疯緭鍏ユ湁鏁堟暟瀛�'))
+        } else if (num < 1) {
+          callback(new Error('蹇呴』澶т簬绛変簬1'))
+        } else {
+          const str = String(num)
+          if (str.includes('.')) {
+            const decimal = str.split('.')[1]
+            if (decimal.length > 1) {
+              callback(new Error('鏈�澶氭敮鎸佷竴浣嶅皬鏁�'))
+            } else {
+              callback()
+            }
+          } else {
+            callback()
           }
-          this.qualificationTab = res.companyType === 1 ? 'enterprise' : 'personal'
-          this.title = title
-          this.visible = true
-        })
-        .catch(e => {
-          this.$tip.apiFailed(e)
-        })
+        }
+      } else {
+        callback()
+      }
     },
+    handleLocationTagChange (val) {
+      if (val.length > 2) {
+        this.$message.warning('浣嶇疆鏍囩鏈�澶氬彧鑳介�夋嫨2涓�')
+        this.form.locationTagIds = val.slice(0, 2)
+      }
+    },
+    open (title, row) {
+    this.isWorking.save = false
+    detail(row.id)
+      .then(res => {
+        this.form = {
+          id: res.id,
+          telephone: res.telephone || '',
+          name: res.name || '',
+          companyType: res.companyType ?? 1,
+          linkName: res.linkName || '',
+          linkPhone: res.linkPhone || '',
+          idcard: res.idcard || '',
+          areaCode: res.provinceId ? [res.provinceId, res.cityId, res.areaId] : [],
+          provinceId: res.provinceId || '',
+          cityId: res.cityId || '',
+          areaId: res.areaId || '',
+          address: res.address || '',
+          longitude: res.longitude || '',
+          latitude: res.latitude || '',
+          locationTagIds: res.locationTagIds || [],
+          deliveryRange: res.deliveryRange || '',
+          localDeposit: res.localDeposit || '',
+          remoteTake: res.remoteTake || '',
+          remoteDeposit: res.remoteDeposit || '',
+          legalPersonName: res.legalPersonName || '',
+          legalPersonPhone: res.legalPersonPhone || '',
+          legalPersonCard: res.legalPersonCard || '',
+          businessImg: res.companyType === 1 ? [{ fileurl: res.businessImg, url: res.imgPrefix + res.businessImg }] : [],
+          idcardImg: [{ fileurl: res.idcardImg, url: res.imgPrefix + res.idcardImg }],
+          idcardImgBack: [{ fileurl: res.idcardImgBack, url: res.imgPrefix + res.idcardImgBack }],
+          laborContractImgs: res.laborContractImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
+          socialSecurityImgs: res.socialSecurityImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
+          storeFrontImgs: res.storeFrontImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
+          storeInteriorImgs: res.storeInteriorImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })),
+          otherMaterialImgs: res.otherMaterialImgs ? res.otherMaterialImgs.map(item => ({ fileurl: item, url: res.imgPrefix + item })) : []
+        }
+        // 澶勭悊浣嶇疆鏍囩锛堝瓧绗︿覆杞暟缁勶級
+        if (this.form.locationTagIds && typeof this.form.locationTagIds === 'string') {
+          this.form.locationTagIds = this.form.locationTagIds.split(',').map(Number)
+        }
+        this.qualificationTab = res.companyType === 1 ? 'enterprise' : 'personal'
+        this.title = title
+        this.visible = true
+      })
+      .catch(e => {
+        this.$tip.apiFailed(e)
+      })
+  },
     loadAreaOptions () {
       listByParentId({ })
         .then(data => {
@@ -272,6 +358,21 @@
         .catch(e => {
           this.$tip.apiFailed(e)
         })
+    },
+    // 鑾峰彇浣嶇疆鏍囩鍒楄〃
+    async getLocationTagList() {
+      try {
+        const res = await fetchList({
+          capacity: 9999,
+          page: 1,
+          model: {
+            type: 5
+          }
+        })
+        this.locationTagList = res.records
+      } catch (e) {
+        this.$tip.apiFailed(e.message)
+      }
     },
     formatAreaData (data) {
       const map = {}
@@ -303,40 +404,64 @@
     openMapSelector () {
       window.open('https://lbs.qq.com/getPoint/', '_blank')
     },
-    handleConfirm () {
-      this.$refs.form.validate(valid => {
+    async handleConfirm () {
+      try {
+        // 鏍¢獙鍒嗘垚姣斾緥
+        if (!this.form.localDeposit) {
+          this.$message.error('璇峰~鍐欏氨鍦板瘎瀛樻ā寮忕殑鍒嗘垚姣斾緥')
+          return
+        }
+        if (!this.form.remoteTake) {
+          this.$message.error('璇峰~鍐欏悓鍩庡瘎閫佹ā寮忎笅浣滀负瀵勪欢鐐圭殑鍒嗘垚姣斾緥')
+          return
+        }
+        if (!this.form.remoteDeposit) {
+          this.$message.error('璇峰~鍐欏悓鍩庡瘎閫佹ā寮忎笅浣滀负鏀朵欢鐐圭殑鍒嗘垚姣斾緥')
+          return
+        }
+        
+        const valid = await this.$refs.form.validate()
         if (!valid) return
         this.isWorking.save = true
-        const imageFields = ['laborContractImgs', 'socialSecurityImgs', 'storeFrontImgs', 'storeInteriorImgs', 'otherMaterialImgs']
-        const singleImageFields = ['businessImg', 'idcardImg', 'idcardImgBack']
-        const data = { ...this.form }
-        singleImageFields.forEach(field => {
-          if (data[field] && Array.isArray(data[field])) {
-            data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item).join(',')
-          }
-        })
+        const params = { ...this.form }
+        // 澶勭悊鐪佸競鍖虹紪鐮�
+        if (params.areaCode && params.areaCode.length === 3) {
+          params.provinceId = params.areaCode[0]
+          params.cityId = params.areaCode[1]
+          params.areaId = params.areaCode[2]
+        }
+        delete params.areaCode
+        // 澶勭悊浣嶇疆鏍囩锛堟暟缁勮浆閫楀彿鍒嗛殧瀛楃涓诧級
+        if (params.locationTagIds && Array.isArray(params.locationTagIds)) {
+          params.locationTagIds = params.locationTagIds.join(',')
+        }
+        // 澶勭悊鍥剧墖鏁扮粍
+        const imageFields = ['idcardImg', 'idcardImgBack', 'businessImg', 'laborContractImgs', 'socialSecurityImgs', 'storeFrontImgs', 'storeInteriorImgs', 'otherMaterialImgs']
         imageFields.forEach(field => {
-          if (data[field] && Array.isArray(data[field])) {
-            data[field] = data[field].map(item => typeof item === 'object' ? item.fileurl : item)
+          if (params[field] && Array.isArray(params[field])) {
+            // 韬唤璇佸拰钀ヤ笟鎵х収鍥剧墖闇�瑕佷紶瀛楃涓诧紙鍗曚釜鍥剧墖锛�
+            if (['idcardImg', 'idcardImgBack', 'businessImg'].includes(field)) {
+              params[field] = params[field].map(item => item.fileurl).join(',')
+            } else {
+              // 鍏朵粬鍥剧墖浼犳暟缁�
+              params[field] = params[field].map(item => item.fileurl)
+            }
           }
         })
-        data.provinceId = this.form.areaCode[0] || ''
-        data.cityId = this.form.areaCode[1] || ''
-        data.areaId = this.form.areaCode[2] || ''
-        delete data.areaCode
-        updateById(data)
-          .then(res => {
-            this.$tip.apiSuccess(res || '淇濆瓨鎴愬姛')
-            this.visible = false
-            this.$emit('success')
-          })
-          .catch(e => {
-            this.$tip.apiFailed(e)
-          })
-          .finally(() => {
-            this.isWorking.save = false
-          })
-      })
+        // 涓汉闂ㄥ簵涓嶉渶瑕佷紶businessImg
+        if (params.companyType === 0) {
+          delete params.businessImg
+        }
+        await updateById(params)
+        this.$tip.apiSuccess('淇濆瓨鎴愬姛')
+        this.visible = false
+        this.$emit('success')
+      } catch (e) {
+        this.$tip.apiFailed(e)
+        console.error('淇濆瓨澶辫触:', e)
+      } finally {
+        this.isWorking.save = false
+      }
     }
   }
 }
@@ -360,13 +485,46 @@
   margin: -10px 0 15px 0;
 }
 .longitude-latitude {
-  display: flex;
-  align-items: center;
-  gap: 10px;
-}
-.longitude-latitude .separator {
-  color: #606266;
-}
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
+  .longitude-latitude .separator {
+    color: #909399;
+  }
+  
+  .delivery-range {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
+  
+  .unit {
+    color: #909399;
+    font-size: 14px;
+  }
+  
+  .profit-section {
+    margin-bottom: 30px;
+    padding: 20px;
+    background: #f5f7fa;
+    border-radius: 4px;
+  }
+  
+  .profit-section .section-title {
+    font-size: 16px;
+    font-weight: bold;
+    color: #303133;
+    margin-bottom: 20px;
+    padding-bottom: 10px;
+    border-bottom: 1px solid #e4e7ed;
+  }
+  
+  .profit-input {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+  }
 .inline-form /deep/ .el-form-item {
   display: block;
   margin-right: 0;

--
Gitblit v1.9.3