From c25fecae568a074e338bce625a92960aca859fb8 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 15 一月 2026 16:04:10 +0800
Subject: [PATCH] 经销商管理

---
 admin/src/components/business/OperaMemberCouponWindow.vue |  349 ++++++++++++++++------------------------------------------
 1 files changed, 96 insertions(+), 253 deletions(-)

diff --git a/admin/src/components/business/OperaMemberCouponWindow.vue b/admin/src/components/business/OperaMemberCouponWindow.vue
index 68002b6..e290ef9 100644
--- a/admin/src/components/business/OperaMemberCouponWindow.vue
+++ b/admin/src/components/business/OperaMemberCouponWindow.vue
@@ -1,92 +1,58 @@
 <template>
   <GlobalWindow
       :title="title"
-      width="80%"
+      width="60%"
       :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="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" >
-        <div class="coupon-rule">
-          <div class="discrep">璁㈠崟婊�</div>
-          <el-input v-model="form.limitPrice"   placeholder="璇疯緭鍏�"     @input="inputAction(form, 'limitPrice')"
-          >
-            <template slot="append">鍏�</template>
-          </el-input>
-          <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="info">
-        <el-input type="textarea" v-model="form.info" placeholder="璇疯緭鍏ヤ紭鎯犲埜璇存槑"  v-trim/>
-      </el-form-item>
-      <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-form-item label="鍙戞斁瀵硅薄" prop="applyType">
+        <el-radio-group v-model="form.addType">
+          <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 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"
-          ></el-date-picker>
-        </div>
-      </el-form-item>
-      <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')"
+      <el-form-item v-if="form.addType===0" label="閫夋嫨鐢ㄦ埛" prop="addMemberIds" >
+          <el-select  v-model="form.addMemberIds" placeholder="璇疯緭鍏ヤ細鍛樻樀绉�/鎵嬫満鍙凤紝鍐嶉�夋嫨" clearable     filterable    remote  reserve-keyword    :remote-method="remoteMethod"
+              :loading="searchLoading"
+                      style="width: 400px;"
           >
-            <template slot="append">澶�</template>
-          </el-input>
-          <div class="discrep">鏈夋晥</div>
-        </div>
+            <el-option
+                v-for="item in users"
+                :key="item.id"
+                :label="item.nickname+'  '+(item.phone||'')"
+                :value="item.id">
+            </el-option>
+          </el-select>
       </el-form-item>
-      <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 v-if="form.addType===1" label="鎸囧畾鎵嬫満鍙�" prop="addMemberPhones" >
+        <el-input  style="width: 400px;"  type="textarea"   v-model="form.addMemberPhones"   placeholder="璇疯緭鍏ユ墜鏈哄彿"   v-trim/>
+        <p class="tip-warn" style="margin-bottom: 1px;"><i class="el-icon-warning"></i>鎻愰啋锛氬涓墜鏈哄彿锛岃鎹㈣杈撳叆</p>
       </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>
+      <el-form-item label="鍙戞斁鍐呭" prop="num">
+        <div  style="border: 1px solid #f2f2f2">
+          <el-table style="width: 600px;"  :data="form.addCouponList">
+            <el-table-column prop="name" label="浼樻儬鍒�" min-width="300px" align="center">
+              <template slot-scope="{row}" >
+                <el-select v-model="row.couponId" style="width: 200px;margin: 0px 20px" clearable filterable   placeholder="璇烽�夋嫨浼樻儬鍒�"  >
+                  <el-option v-for="item in couponList"   :label="item.name"  :value="item.id">  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column prop="num" label="鏁伴噺" min-width="200px" align="center">
+              <template slot-scope="{row}" >
+                <el-input  style="width: 150px;margin: 0px 20px" type="number"   v-model="row.num"   placeholder="璇疯緭鍏ユ暟閲�"   v-trim/>
+              </template>
+            </el-table-column>
+            <el-table-column  label="鎿嶄綔" min-width="100px" align="center">
+              <template slot-scope="scope" >
+                <el-button style="color: red;border: none;" @click="delCoupon( scope.$index)">鍒犻櫎</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-button s type="primary" icon="el-icon-plus" @click="addCoupon()" style="height: 30px;margin: 10px;">娣诲姞</el-button>
         </div>
       </el-form-item>
     </el-form>
@@ -96,226 +62,103 @@
 
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
-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'
+import { allList } from '@/api/business/coupon'
+import { findAll, findAll as memberlist } from '@/api/business/member'
 export default {
   name: 'OperaCouponWindow',
   extends: BaseOpera,
-  components: { GlobalWindow,OperaCouponGoodsWindow },
+  components: { GlobalWindow, OperaCouponGoodsWindow },
   data () {
     const couponRules = (rule, value, callback) => {
-      if (!this.form.limitPrice) {
-        callback(new Error('璇疯緭鍏ユ弧棰�'))
-      } else if (!this.form.price) {
-        callback(new Error('璇峰畬鍠勪紭鎯犺鍒�'))
+      if (!this.form.addCouponList || !this.form.addCouponList.length) {
+        callback(new Error('璇烽�夋嫨浼樻儬鍒镐俊鎭�'))
       } else {
-        callback()
-      }
-    }
-    const getDateRules = (rule, value, callback) => {
-      if (!this.form.startDate) {
-        callback(new Error('璇烽�夋嫨寮�濮嬫椂闂�'))
-      } else if (!this.form.endDate) {
-        callback(new Error('璇疯緭鍏ョ粨鏉熸椂闂�'))
-      } else {
-        callback()
-      }
-    }
-    const numRule = (rule, value, callBack) => {
-      if (value < 0) {
-        callBack(new Error())
-      } else {
-        callBack()
+        var r = true
+        this.form.addCouponList.forEach(item => {
+          if (!item.id || !item.num) {
+            r = false
+          }
+        })
+        if (!r) {
+          callback(new Error('璇峰畬鍠勪紭鎯犲埜淇℃伅'))
+        } else {
+          callback()
+        }
       }
     }
     return {
       searchLoading: false,
-      getDate: [],
-      applyDataList:[],
-      showGoods:false,
+      couponList: [],
+      users: [],
       // 琛ㄥ崟鏁版嵁
       form: {
-        id: null,
-        name: '',
-        couponType: 0,
-        applyType: 0,
-        useType: 0,
-        shopId: '',
-        applyIdList: [],
-        applyCateIdList: [],
-        type: 0,
-        limitPrice: '',
-        price: '',
-        startDate: '',
-        endDate: '',
-        applyIds: '',
-        validDays: '',
-        getMethod: '',
-        integral: '',
-        status: '',
-        num: '',
-        info: ''
+        addType: 0,
+        addMemberIds: null,
+        addMemberPhones: null,
+        addCouponList: [{ id: null, num: null }]
       },
       shops: [],
       categorys: [],
       // 楠岃瘉瑙勫垯
       rules: {
-        name: [
-          { required: true, message: '璇疯緭鍏ヤ紭鎯犲埜鍚嶇О', tigger: 'blur' }
+        addType: [
+          { required: true, message: '璇烽�夋嫨鍙戞斁瀵硅薄' }
         ],
-        couponRule: [
+        addCouponList: [
           { 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' }
-        ],
-        /*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' }
-        // ]
+        ]
       }
     }
   },
   created () {
     this.config({
-      api: '/business/coupon',
+      api: '/business/memberCoupon',
       'field.id': 'id'
     })
   },
   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)
-          this.form[this.configData['field.id']] = null
-        })
-        return
-      }
-      // 缂栬緫
-      this.$nextTick(() => {
-        for (const key in this.form) {
-          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) {
-      this.form.startDate = value[0]
-      this.form.endDate = value[1]
-    },
-    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, '')
-      }
-    },
     remoteMethod (query) {
       if (query !== '') {
         this.searchLoading = true
-        const action = this.form.type == 2 ? activityList : shopList
-        action({
+        findAll({
           capacity: 999,
           model: {
-            name: query
+            nickname: query,
+            status: 0
           }
         })
           .then(res => {
-            this.shops = res.records
+            this.users = res
           })
           .finally(() => {
             this.searchLoading = false
           })
       }
+    },
+    getCouponList () {
+      allList({status:0})
+        .then(res => {
+          if (res) {
+            this.couponList = res || []
+          }
+        })
+    },
+    delCoupon (index) {
+      this.form.addCouponList.splice(index, 1)
+    },
+    addCoupon (type) {
+      this.form.addCouponList.push({ id: null, num: null })
+    },
+    open (title, target, type) {
+      this.title = title
+      this.visible = true
+      this.form.addMemberIds=null
+      this.form.addMemberPhones=null
+      this.form.addType = 0
+      this.form.addCouponList = [{id:null,num:null}]
+      this.getCouponList()
     }
   }
 }

--
Gitblit v1.9.3