From d8689abdb2378bdd1c97317ca881173eca26283c Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 14 一月 2026 17:13:52 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/components/business/OperaCouponWindow.vue |  267 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 172 insertions(+), 95 deletions(-)

diff --git a/admin/src/components/business/OperaCouponWindow.vue b/admin/src/components/business/OperaCouponWindow.vue
index 8e6eb3d..68002b6 100644
--- a/admin/src/components/business/OperaCouponWindow.vue
+++ b/admin/src/components/business/OperaCouponWindow.vue
@@ -1,116 +1,121 @@
 <template>
-  <GlobalAlertWindow
-    :title="title"
-    :visible.sync="visible"
-    :confirm-working="isWorking"
-    @confirm="confirm"
+  <GlobalWindow
+      :title="title"
+      width="80%"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules" label-width="120px" label-suffix="锛�" inline>
+      <p class="tip-header" >鍩烘湰灞炴��</p>
       <el-form-item label="浼樻儬鍒稿悕绉�" prop="name">
         <el-input v-model="form.name" placeholder="璇疯緭鍏ヤ紭鎯犲埜鍚嶇О" :maxlength="12" v-trim/>
       </el-form-item>
-      <el-form-item label="浼樻儬鍒歌鏄�" prop="info">
-        <el-input v-model="form.info" placeholder="璇疯緭鍏ヤ紭鎯犲埜璇存槑" :maxlength="30" v-trim/>
+      <el-form-item label="绫诲瀷" prop="couponType">
+          <el-radio-group v-model="form.couponType">
+            <el-radio :label="0" >婊″噺鍒�</el-radio>
+            <el-radio :label="1">鎶樻墸鍒�</el-radio>
+          </el-radio-group>
       </el-form-item>
-      <el-form-item label="浼樻儬瑙勫垯" prop="couponRule">
+      <el-form-item label="浼樻儬瑙勫垯" prop="couponRule" >
         <div class="coupon-rule">
           <div class="discrep">璁㈠崟婊�</div>
-          <el-input
-            v-model="form.limitPrice"
-            placeholder="璇疯緭鍏�"
-            @input="inputAction(form, 'limitPrice')"
+          <el-input v-model="form.limitPrice"   placeholder="璇疯緭鍏�"     @input="inputAction(form, 'limitPrice')"
           >
             <template slot="append">鍏�</template>
           </el-input>
-          <div class="discrep">鍑�</div>
-          <el-input
-            v-model="form.price"
-            placeholder="璇疯緭鍏�"
-            @input="inputAction(form, 'price')"
-          >
-            <template slot="append">鍏�</template>
+          <div class="discrep" >{{form.couponType === 1?'锛屼韩':'锛屽噺'}}</div>
+          <el-input  v-model="form.price"     placeholder="璇疯緭鍏�"    @input="inputAction(form, 'price')"  >
+            <template slot="append" >{{form.couponType ===1?'鎶�':'鍏�'}}</template>
           </el-input>
         </div>
       </el-form-item>
-      <el-form-item label="鍙戞斁鎬婚噺" prop="num">
-        <div class="num-style">
-          <el-input-number step-strictly v-model="form.num" :controls="false" :min="1" :max="99999" placeholder="璇疯緭鍏ュ彂鏀炬�婚噺(1~99999)" v-trim></el-input-number>
-        </div>
+      <el-form-item label="浼樻儬鍒歌鏄�" prop="info">
+        <el-input type="textarea" v-model="form.info" placeholder="璇疯緭鍏ヤ紭鎯犲埜璇存槑"  v-trim/>
       </el-form-item>
-      <el-form-item v-if="form.type==1" label="鍏戞崲鏉′欢" prop="integral">
-        <el-input-number step-strictly v-model="form.integral" :controls="false" :min="1" :max="99999" placeholder="璇疯緭鍏�" v-trim/> 鍜栬眴鍏戞崲涓�寮犱紭鎯犲埜
+      <p class="tip-header" >浣跨敤闄愬埗</p>
+      <el-form-item label="鏈夋晥鏈�" prop="useType">
+        <el-radio-group v-model="form.useType">
+          <el-radio :label="0">鍥哄畾鏃舵</el-radio>
+          <el-radio :label="1">鍥哄畾鏃堕暱</el-radio>
+        </el-radio-group>
       </el-form-item>
-      <el-form-item label="鍙鍙栨椂闂�" prop="getDate">
+      <el-form-item label="浣跨敤鏃舵" prop="getDate" v-if="form.useType===0">
         <div class="date-style">
           <el-date-picker
-            v-model="getDate"
-            type="datetimerange"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            format="yyyy-MM-dd HH:mm:ss"
-            range-separator="鑷�"
-            start-placeholder="寮�濮嬫椂闂�"
-            end-placeholder="缁撴潫鏃堕棿"
-            @change="selectDate"
+              v-model="getDate"
+              type="datetimerange"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              @change="selectDate"
           ></el-date-picker>
         </div>
       </el-form-item>
-
-      <el-form-item label="鍙敤鏃堕棿" prop="validDays">
-        <!-- <el-input v-model="form.validDays" placeholder="璇疯緭鍏ラ鍙栧悗鏈夋晥澶╂暟" v-trim/> -->
+      <el-form-item label="鍥哄畾鏃堕暱" prop="validDays" v-if="form.useType===1">
         <div class="coupon-rule">
           <div class="discrep">棰嗗姷鍚�</div>
           <el-input
-            v-model="form.validDays"
-            placeholder="璇疯緭鍏�"
-            @input="inputAction(form, 'validDays')"
+              v-model="form.validDays"
+              placeholder="璇疯緭鍏�"
+              @input="inputAction(form, 'validDays')"
           >
             <template slot="append">澶�</template>
           </el-input>
-          <div class="discrep">鍐呮湁鏁堬紝棰嗗彇鍚庣珛鍗崇敓鏁�</div>
+          <div class="discrep">鏈夋晥</div>
         </div>
       </el-form-item>
-      <el-form-item v-if="form.type==0" label="鍏宠仈搴楅摵" prop="shopId">
-        <el-select
-          v-model="form.shopId"
-          placeholder="璇疯緭鍏ュ簵閾哄悕绉帮紝鍐嶉�夋嫨"
-          filterable
-          remote
-          reserve-keyword
-          :remote-method="remoteMethod"
-          :loading="searchLoading"
-
-        >
-          <el-option
-            v-for="item in shops"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id">
-          </el-option>
+      <el-form-item label="閫傜敤瀵硅薄" prop="applyType">
+        <el-radio-group v-model="form.applyType">
+          <el-radio :label="0">鍏ㄥ満閫氱敤</el-radio>
+          <el-radio :label="1">鎸夊搧绫�</el-radio>
+          <el-radio :label="2">鎸囧畾鍟嗗搧</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item v-if="form.applyType===1" label="閫夋嫨鍝佺被" prop="applyCateIdList" >
+        <el-select v-model="form.applyCateIdList"  placeholder="璇烽�夋嫨,鏀寔澶氶��" filterable multiple clearable >
+          <el-option  v-for="item in categorys" :key="'optCate'+item.id"  :label="item.name"  :value="item.id">  </el-option>
         </el-select>
       </el-form-item>
+      <el-form-item v-if="form.applyType===2" label="閫夋嫨鍟嗗搧" prop="applyIdList" style="display: flex">
+          <span style="font-size: 12px;color: #216EEE"   @click="selectGoods">宸叉寚瀹氥�� {{applyDataList.length}} 銆戜欢鍟嗗搧</span>
+        <el-button style="margin-left:30px;display: inline-block;width: 80px;" type="primary"  @click="selectGoods">鍘婚�夋嫨 </el-button>
+      </el-form-item>
+      <p class="tip-header" >鍙戞斁瑙勫垯</p>
+      <el-form-item label="鍙戞斁鎬婚噺" prop="num">
+        <div class="num-style">
+          <el-input-number  v-model="form.num" :controls="false" :min="1" :max="99999" placeholder="璇疯緭鍏ュ彂鏀炬�婚噺(1~99999)" v-trim></el-input-number>
+        </div>
+      </el-form-item>
     </el-form>
-  </GlobalAlertWindow>
+    <OperaCouponGoodsWindow ref="OperaCouponGoodsWindow" @success="doSelect"/>
+  </GlobalWindow>
 </template>
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
-import GlobalAlertWindow from '@/components/common/GlobalAlertWindow'
 import { fetchList as shopList } from '@/api/business/shop'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { findAll as labelList } from '@/api/business/labels'
+import { allList as goodsList} from '@/api/business/goods'
+import OperaCouponGoodsWindow from '@/components/business/OperaCouponGoodsWindow'
 export default {
   name: 'OperaCouponWindow',
   extends: BaseOpera,
-  components: { GlobalAlertWindow },
+  components: { GlobalWindow,OperaCouponGoodsWindow },
   data () {
-    let couponRules = (rule, value, callback) => {
+    const couponRules = (rule, value, callback) => {
       if (!this.form.limitPrice) {
         callback(new Error('璇疯緭鍏ユ弧棰�'))
       } else if (!this.form.price) {
-        callback(new Error('璇疯緭鍏ヤ紭鎯犻噾棰�'))
+        callback(new Error('璇峰畬鍠勪紭鎯犺鍒�'))
       } else {
         callback()
       }
     }
-    let getDateRules = (rule, value, callback) => {
+    const getDateRules = (rule, value, callback) => {
       if (!this.form.startDate) {
         callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�'))
       } else if (!this.form.endDate) {
@@ -119,7 +124,7 @@
         callback()
       }
     }
-    let numRule = (rule, value, callBack) => {
+    const numRule = (rule, value, callBack) => {
       if (value < 0) {
         callBack(new Error())
       } else {
@@ -129,16 +134,24 @@
     return {
       searchLoading: false,
       getDate: [],
+      applyDataList:[],
+      showGoods:false,
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
         name: '',
+        couponType: 0,
+        applyType: 0,
+        useType: 0,
         shopId: '',
-        type: '',
+        applyIdList: [],
+        applyCateIdList: [],
+        type: 0,
         limitPrice: '',
         price: '',
         startDate: '',
         endDate: '',
+        applyIds: '',
         validDays: '',
         getMethod: '',
         integral: '',
@@ -147,29 +160,39 @@
         info: ''
       },
       shops: [],
+      categorys: [],
       // 楠岃瘉瑙勫垯
       rules: {
         name: [
           { required: true, message: '璇疯緭鍏ヤ紭鎯犲埜鍚嶇О', tigger: 'blur' }
         ],
         couponRule: [
-          { required: true, validator: couponRules, tigger: 'blur'}
+          { required: true, validator: couponRules, tigger: 'blur' }
+        ],
+        useType: [
+          { required: true, message: '璇烽�夋嫨鏈夋晥鏈熸柟寮�' }
+        ],
+        couponType: [
+          { required: true, message: '璇烽�夋嫨绫诲瀷' }
+        ],
+        applyType: [
+          { required: true, message: '璇烽�夋嫨閫傜敤瀵硅薄绫诲瀷' }
         ],
         num: [
-          { required: true, validator: numRule, message: '璇疯緭鍏ュ彂鏀炬�绘暟', tigger: 'blur'}
+          { required: true, validator: numRule, message: '璇疯緭鍏ュ彂鏀炬�绘暟', tigger: 'blur' }
         ],
-        integral: [
-          { required: true, validator: numRule, message: '璇疯緭鍏ュ厬鎹㈡潯浠�', tigger: 'blur'}
-        ],
-        validDays: [
-          { required: true, message: '璇疯緭鍏ュ彲鐢ㄦ椂闂�', tigger: 'blur'}
-        ],
-        getDate: [
-          { required: true, validator: getDateRules, tigger: 'change'}
-        ],
-        shopId: [
-          { required: true, validator: numRule, message: '璇烽�夋嫨鍏宠仈搴楅摵', tigger: 'change'}
-        ],
+        /*integral: [
+          { required: true, validator: numRule, message: '璇疯緭鍏ュ厬鎹㈡潯浠�', tigger: 'blur' }
+        ],*/
+        // validDays: [
+        //   { required: true, message: '璇疯緭鍏ュ彲鐢ㄦ椂闂�', tigger: 'blur' }
+        // ],
+        // getDate: [
+        //   { required: true, validator: getDateRules, tigger: 'change' }
+        // ],
+        // shopId: [
+        //   { required: true, validator: numRule, message: '璇烽�夋嫨鍏宠仈搴楅摵', tigger: 'change' }
+        // ]
       }
     }
   },
@@ -180,21 +203,62 @@
     })
   },
   methods: {
+    selectGoods(){
+      this.$refs.OperaCouponGoodsWindow.open('閫夋嫨鍟嗗搧', this.applyDataList)
+    },
+    loadLabels(){
+      labelList({
+        type: 0 // 鍟嗗搧鍒嗙被
+      }).then(res => {
+        this.categorys = res || []
+      })
+    },
+    loadSelectGoods(){
+      console.log(this.form.applyIdList)
+      if(!this.form.applyIdList || !this.form.applyIdList.length){
+        return
+      }
+      goodsList({
+        idList: this.form.applyIdList // 鍟嗗搧鍒嗙被
+      }).then(res => {
+        this.applyDataList = res || []
+      })
+    },
+    doSelect(rows){
+      console.log(rows,this.applyDataList)
+      this.applyDataList =[]
+      this.form.applyIdList=[]
+      if(rows && rows.length){
+        rows.forEach(item => {
+          this.applyDataList.push(item)
+          this.form.applyIdList.push(item.id)
+        })
+      }
+    },
     open (title, target, type) {
+      this.showGoods=false
       this.title = title
       this.visible = true
       this.form.type = type
       this.getDate = []
       this.form.startDate = ''
       this.form.endDate = ''
+      this.applyDataList=[]
+      this.form.applyIdList=[]
+      this.form.applyCateIdList=[]
+      this.loadLabels()
+      this.form.limitPrice=null
+      this.form.price=null
+      this.form.startDate=null
+      this.form.endDate=null
+      this.form.num=1
       // 鏂板缓
       if (target == null) {
         this.$nextTick(() => {
           this.$refs.form.resetFields()
-          console.log(this.form);
+          console.log(this.form)
           this.form[this.configData['field.id']] = null
         })
-
         return
       }
       // 缂栬緫
@@ -203,29 +267,42 @@
           this.form[key] = target[key]
         }
         this.getDate = [target.startDate, target.endDate]
+        if(this.form.applyType === 1){
+          this.form.applyCateIdList =[]
+          var ta = this.form.applyIds.split(',')
+          if(ta && ta.length){
+            ta.forEach(tt =>{
+              this.form.applyCateIdList.push(parseInt(tt))
+            })
+          }
+        }
+        if(this.form.applyType === 2){
+          this.form.applyIdList = this.form.applyIds.split(',')
+          this.loadSelectGoods()
+        }
       })
     },
-    selectDate(value) {
+    selectDate (value) {
       this.form.startDate = value[0]
       this.form.endDate = value[1]
     },
-    inputAction(item, key) {
-      if(item[key]<0) {
+    inputAction (item, key) {
+      if (item[key] < 0) {
         item[key] = ''
       } else {
         item[key] = item[key].replace(/[^\d.]/g, '')
-                      .replace(/\.{2,}/g, '.')
-                      .replace('.', '$#$')
-                      .replace(/\./g, '')
-                      .replace('$#$', '.')
-                      .replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
-                      .replace(/^\./g, '')
+          .replace(/\.{2,}/g, '.')
+          .replace('.', '$#$')
+          .replace(/\./g, '')
+          .replace('$#$', '.')
+          .replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
+          .replace(/^\./g, '')
       }
     },
-    remoteMethod(query) {
+    remoteMethod (query) {
       if (query !== '') {
         this.searchLoading = true
-        let action = this.form.type==2 ? activityList : shopList
+        const action = this.form.type == 2 ? activityList : shopList
         action({
           capacity: 999,
           model: {
@@ -239,8 +316,8 @@
             this.searchLoading = false
           })
       }
-    },
-  },
+    }
+  }
 }
 </script>
 

--
Gitblit v1.9.3