From e8c30277924b6faac8c1a45ec10ef3b493667e6e Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 11 九月 2025 16:46:31 +0800
Subject: [PATCH] 虚拟商品优惠劵

---
 seller/src/views/goods/goods-seller/goodsOperationSec.vue |  245 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 241 insertions(+), 4 deletions(-)

diff --git a/seller/src/views/goods/goods-seller/goodsOperationSec.vue b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
index 0b8e8b0..ce95523 100644
--- a/seller/src/views/goods/goods-seller/goodsOperationSec.vue
+++ b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
@@ -74,6 +74,17 @@
                             @on-change="choosePreTime"></DatePicker>
               </div>
             </FormItem>
+            <FormItem v-if="baseInfoForm.goodsType == 'VIRTUAL_GOODS'" class="form-item-view-el" label="鍟嗗搧绫诲瀷">
+              <Select
+                v-model="baseInfoForm.virtualGoodsType"
+                clearable
+                style="width: 160px"
+                @on-clear="handleGoodsType"
+                @on-change="handleGoodsType"
+              >
+                <Option value="COUPON">浼樻儬鍗�</option>
+                </select>
+            </FormItem>
             <FormItem v-if="baseInfoForm.salesModel == 'WHOLESALE'" class="form-item-view-el" label="閿�鍞鍒�"
                       prop="wholesaleRule">
               <div class="form-item-view-wholesale">
@@ -118,6 +129,7 @@
             </FormItem>
           </div>
           <h4>鍟嗗搧瑙勬牸鍙婂浘鐗�</h4>
+
           <div class="form-item-view">
             <FormItem class="form-item-view-el required" label="涓诲浘" prop="goodsGalleryFiles"  >
               <div style="display: flex; flex-wrap: wrap;">
@@ -156,6 +168,9 @@
                 <img v-if="goodsPictureVisible" :src="previewGoodsPicture" style="width: 100%"/>
               </Modal>
             </FormItem>
+
+
+
             <FormItem>
 
 <!--              <div class="demo-upload-list" v-for="(item,index) in showListImages">-->
@@ -346,6 +361,14 @@
                             }}</span>
                           </Input>
                         </template>
+                        <template slot="COUPON" slot-scope="{ row }">
+                          <div  @click="showCouponListModal(row)">
+                            <Input v-model="row.couponName" clearable placeholder="閫夋嫨浼樻儬鍗�"
+                            >
+                            </Input>
+                          </div>
+
+                        </template>
                         <template slot="cost" slot-scope="{ row }">
                           <Input v-model="row.cost" clearable placeholder="璇疯緭鍏ユ垚鏈环"
                                  @on-change="updateSkuTable(row, 'cost')">
@@ -505,7 +528,43 @@
         <Button type="primary" @click="saveToDraft">淇濆瓨涓烘ā鐗�</Button>
       </ButtonGroup>
     </div>
-
+    <Modal v-model="showCouponModal" title="浼樻儬鍗峰垪琛�" width="1200px">
+      <div style="display: flex; align-items: center; margin-bottom: 20px;">
+        <!-- 妯℃嫙琛ㄥ崟label鏍峰紡 -->
+        <label style="width: 100px; text-align: right; padding-right: 12px; font-size:14px;">
+          宸查�夋嫨浼樻儬鍗�:
+        </label>
+        <Input
+          :disabled="true"
+          style="width: 30%;"
+          v-model="showCoupon"
+          placeholder="璇风偣鍑婚�夋嫨琛ㄦ牸鍐呬紭鎯犲姷"
+        ></Input>
+      </div>
+        <Table
+          :loading="couponLoading"
+          border
+          :columns="couponColumns"
+          :data="couponData"
+          ref="table"
+          @on-current-change="handleRowClick"
+          highlight-row
+        ></Table>
+        <Row type="flex" justify="center" class="mt_10">
+          <Page
+            :current="couponSearchForm.pageNumber"
+            :total="couponTotal"
+            :page-size="couponSearchForm.pageSize"
+            @on-change="couponChangePage"
+            @on-page-size-change="couponChangePageSize"
+            :page-size-opts="[10, 20, 50]"
+            size="small"
+            show-total
+            show-elevator
+            show-sizer
+          ></Page>
+        </Row>
+    </Modal>
     <Modal v-model="showGoodsVideo" title="鏌ョ湅瑙嗛">
       <div id="dplayer">
 
@@ -561,7 +620,8 @@
 import {getFileKey} from "@/utils/file.js";
 import {getFilePreview, getSts} from "@/api/file";
 import {formatDate} from "@/utils/filters";
-
+import {getShopCouponList} from '@/api/promotion'
+import {promotionsScopeTypeRender} from "../../../utils/promotions";
 
 export default {
   name: "goodsOperationSec",
@@ -593,6 +653,105 @@
       }, 1000);
     };
     return {
+      currentRow:null,
+      showCouponModal:false,
+      showCoupon:'',
+
+      couponSearchForm: {
+        // 鎼滅储妗嗗垵濮嬪寲瀵硅薄
+        pageNumber: 1, // 褰撳墠椤垫暟
+        pageSize: 10, // 椤甸潰澶у皬
+        sort: "startTime", // 榛樿鎺掑簭瀛楁
+        order: "desc", // 榛樿鎺掑簭鏂瑰紡
+        promotionStatus:"START",
+      },
+      selectedRowId:'',
+      couponTotal:0,
+      couponData:[],
+      couponLoading:false,
+      couponColumns: [
+        // 琛ㄥご
+        {
+          title: "浼樻儬鍒稿悕绉�",
+          key: "couponName",
+          width: 180,
+          tooltip: true,
+        },
+        {
+          title: "闈㈤/鎶樻墸",
+          key: "price",
+          width: 150,
+          render: (h, params) => {
+            if (params.row.price) {
+              return h("priceColorScheme", {props:{value:params.row.price,color:this.$mainColor}} );
+
+            } else {
+              return h("div", params.row.couponDiscount + "鎶�");
+            }
+          },
+        },
+
+        {
+          title: "鑾峰彇鏂瑰紡",
+          width: 120,
+          key: "getType",
+          render: (h, params) => {
+            if (params.row.getType === "FREE") {
+              return h("Tag", { props: { color: "red" } }, "鍏嶈垂鑾峰彇");
+            } else if (params.row.getType === "ACTIVITY") {
+              return h("Tag", { props: { color: "volcano" } }, "娲诲姩鑾峰彇");
+            } else if (params.row.getType === "INSIDE") {
+              return h("Tag", { props: { color: "lime" } }, "鍐呰喘");
+            } else if (params.row.getType === "IGAME") {
+              return h("Tag", { props: { color: "lime" } }, "娓告垙浜虹敓");
+            } else {
+              return h("Tag", { props: { color: "purple" } }, "鏈煡");
+            }
+          },
+        },
+        {
+          title: "浼樻儬鍒哥被鍨�",
+          key: "couponType",
+          width: 150,
+          render: (h, params) => {
+            let text = "";
+            if (params.row.couponType === "DISCOUNT") {
+              return h("Tag", { props: { color: "blue" } }, "鎵撴姌");
+            } else if (params.row.couponType === "PRICE") {
+              return h("Tag", { props: { color: "geekblue" } }, "鍑忓厤鐜伴噾");
+            } else {
+              return h("Tag", { props: { color: "purple" } }, "鏈煡");
+            }
+          },
+        },
+        {
+          title: "鍝佺被鎻忚堪",
+          key: "scopeType",
+          width: 120,
+          render: (h, params) => {
+            return promotionsScopeTypeRender(h, params);
+          },
+        },
+        {
+          title: "娲诲姩鏃堕棿",
+          render: (h, params) => {
+            if (
+              params?.row?.getType === "ACTIVITY" &&
+              params?.row?.rangeDayType === "DYNAMICTIME"
+            ) {
+              return h("div", "闀挎湡鏈夋晥");
+            } else if (params?.row?.startTime && params?.row?.endTime) {
+              return h("div", {
+                domProps: {
+                  innerHTML:
+                    params.row.startTime + "<br/>" + params.row.endTime,
+                },
+              });
+            }
+          },
+        }
+      ],
+
       showListImages: [],
       regular,
       openImage: false,
@@ -665,6 +824,7 @@
       ],
       /** 鍙戝竷鍟嗗搧鍩烘湰鍙傛暟 */
       baseInfoForm: {
+        virtualGoodsType:"",
         salesModel: "RETAIL",
         /** 鍟嗗搧鐩稿唽鍒楄〃 */
         goodsGalleryFiles: [],
@@ -701,7 +861,8 @@
         preSaleTime:[],
         preSaleBeginDate:'',
         preSaleEndDate:'',
-        commission:5
+        commission:5,
+
       },
       /** 琛ㄦ牸澶� */
       skuTableColumn: [],
@@ -759,6 +920,8 @@
         "price",
         "weight",
         "quantity",
+        "couponName",
+        "couponId",
         // "alertQuantity",
         "specId",
         "specValueId",
@@ -767,6 +930,7 @@
       selectedFormBtnName: "", // 鐐瑰嚮鍥剧墖缁戝畾form
       selectedImage: [],
       lastEditSkuValue: '',
+
     };
   },
   watch: {
@@ -783,6 +947,50 @@
     }
   },
   methods: {
+    showCouponListModal(row){
+      this.showCouponModal = true;
+      this.showCoupon ='';
+      this.getCouponDataList()
+      this.currentRow = row;
+    },
+    handleGoodsType(){
+      //閲嶆柊娓叉煋
+      this.renderTableData(this.skuTableData);
+    },
+    getCouponDataList() {
+      // 鑾峰彇鏁版嵁
+      this.couponLoading = true;
+      getShopCouponList(this.couponSearchForm).then((res) => {
+        this.couponLoading = false;
+        if (res.success) {
+          this.couponData = res.result.records;
+          this.couponTotal = res.result.total;
+        }
+      });
+      this.couponLoading = false;
+    },
+    // 澶勭悊琛岀偣鍑讳簨浠�
+    handleRowClick(currentRow ,oldCurrentRow){
+      this.showCoupon = currentRow.couponName;
+      this.$set(this.currentRow, 'couponName', currentRow.couponName);
+      this.currentRow.couponId = currentRow.id
+      console.log(this.currentRow)
+      this.updateSkuTable(this.currentRow,"couponName")
+      this.updateSkuTable(this.currentRow,"couponId")
+      console.log(this.skuTableData)
+    },
+    couponChangePage(v) {
+      // 鏀瑰彉椤电爜
+      this.couponSearchForm.pageNumber = v;
+      this.getCouponDataList();
+    },
+    couponChangePageSize(v) {
+      // 鏀瑰彉椤垫暟
+      this.couponSearchForm.pageNumber = 1;
+      this.couponSearchForm.pageSize = v;
+      this.getCouponDataList();
+    },
+
     // 鏍煎紡鍖栨樉绀哄��
     formatter(date) {
       return this.formatDate(date, 'yyyy-MM-dd');
@@ -1338,6 +1546,8 @@
           // cost: e.cost,
           quantity: e.quantity,
           // alertQuantity: e.alertQuantity,
+          couponName:e.couponName,
+          couponId:e.couponId,
           weight: e.weight,
         };
         if (e.goodsGalleryList && e.goodsGalleryList.length >= 1) {
@@ -1689,6 +1899,8 @@
               // find.cost && (find.cost = "");
               find.quantity && (find.quantity = "");
               // find.alertQuantity && (find.alertQuantity = "");
+              find.couponName && (find.couponName = "");
+              find.couponId && (find.couponId = "");
               find.weight && (find.weight = "");
 
               this.skuTableData.splice(this.skuTableData.length, 0, find);
@@ -1703,6 +1915,8 @@
               find.sn && (find.sn = "");
               // find.cost && (find.cost = "");
               find.quantity && (find.quantity = "");
+              find.couponName && (find.couponName = "");
+              find.couponId && (find.couponId = "");
               // find.alertQuantity && (find.alertQuantity = "");
               find.weight && (find.weight = "");
 
@@ -1795,6 +2009,14 @@
           slot: "weight",
         });
       }
+      if (this.baseInfoForm.goodsType ==="VIRTUAL_GOODS" && this.baseInfoForm.virtualGoodsType==="COUPON"){
+        pushData.push(
+          {
+            title:"浼樻儬鍗�",
+            slot:"COUPON"
+          }
+        )
+      }
       pushData.push(
         {
           title: "搴撳瓨",
@@ -1847,6 +2069,7 @@
               id: skus[index].id,
               sn: skus[index].sn,
               quantity: skus[index].quantity,
+              coupon: skus[index].coupon,
               cost: skus[index].cost,
               price: skus[index].price,
               // [spec[0].name]: skus[index][spec[0].name] ? skus[index][spec[0].name] : specItem.value,
@@ -2010,7 +2233,7 @@
             }
             this.baseInfoForm.goodsId = this.goodsId;
             let submit = JSON.parse(JSON.stringify(this.baseInfoForm));
-            console.log('----------------->鎻愪氦', submit);
+
             if (
               submit.goodsGalleryFiles &&
               submit.goodsGalleryFiles.length <= 0
@@ -2048,10 +2271,22 @@
                 cost: 1,
                 price: sku.price,
                 quantity: sku.quantity,
+                couponName:sku.couponName,
+                couponId:sku.couponId,
                 // alertQuantity: sku.alertQuantity,
                 sn: sku.sn,
                 images: [],
               };
+              if(this.baseInfoForm.goodsType === "VIRTUAL_GOODS"){
+                if (sku.couponId === null || sku.couponId === undefined){
+                  this.$Message.error("璇烽�夋嫨浼樻儬鍔�")
+                  return;
+                }
+                if (sku.couponName === null || sku.couponName === undefined){
+                  this.$Message.error("璇烽�夋嫨浼樻儬鍔�")
+                  return;
+                }
+              }
               if (this.openImage) {
                 this.skuInfo[0].spec_values.forEach(item => {
                   if (!item.images || item.images.length === 0) {
@@ -2078,6 +2313,7 @@
               }
               submit.skuList.push(skuCopy);
             });
+            console.log('----------------->鎻愪氦', submit);
             if (containEmptyImage) {
               this.$Message.error("寮�鍚鏍煎浘鐗囷紝鎵�鏈夎鏍煎浘鐗囦笉鑳戒负绌猴紒");
               this.submitLoading = false;
@@ -2105,6 +2341,7 @@
                 }
               });
             } else {
+              console.log(submit)
               API_GOODS.createGoods(submit).then((res) => {
                 if (res.success) {
                   this.submitLoading = false;

--
Gitblit v1.8.0