From 89c12efa2ef8464680c81b11a5d98ac39fc99338 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 15 九月 2025 11:59:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/send_coupon' into send_coupon

---
 seller/src/views/goods/goods-seller/goodsOperationSec.vue |  335 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 296 insertions(+), 39 deletions(-)

diff --git a/seller/src/views/goods/goods-seller/goodsOperationSec.vue b/seller/src/views/goods/goods-seller/goodsOperationSec.vue
index 2f3df7c..8ed6ef2 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">-->
@@ -270,12 +285,13 @@
                                       </template>
                                     </div>
                                   </vuedraggable>
-<!--                                  todo 3-->
-                                  <Upload ref="uploadSku" action="-"
+                                  <!--                                  todo 3-->
+                                  <Upload ref="uploadSku" :action="uploadFileUrl"
                                           v-if="val.images < 1"
                                           :before-upload="handleBeforeUpload"
                                           :format="['jpg', 'jpeg', 'png', 'webp']"
                                           :max-size="2048"
+                                          :headers="{ ...accessToken }"
                                           :on-error="() => { $Spin.hide(); }"
                                           :on-exceeded-size="handleMaxSize"
                                           :on-format-error="handleFormatError"
@@ -327,9 +343,9 @@
                             overflow-x: hidden;
                           }
                         ">
-                        <template slot="sn" slot-scope="{ row }">
-                          <Input v-model="row.sn" clearable placeholder="璇疯緭鍏ヨ揣鍙�"
-                                 @on-change="updateSkuTable(row, 'sn')"/>
+                        <template slot="sn" slot-scope="{ row, index }">
+                          <Input v-model="row.sn" placeholder="璇疯緭鍏ヨ揣鍙�" disabled
+                                 @on-change="updateSkuTable(row, 'sn')" />
                         </template>
                         <div v-if="baseInfoForm.goodsType !== 'VIRTUAL_GOODS'" slot="weight" slot-scope="{ row }">
                           <Input v-model="row.weight" clearable placeholder="璇疯緭鍏ラ噸閲�"
@@ -344,6 +360,14 @@
                               baseInfoForm.goodsUnit || ""
                             }}</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="璇疯緭鍏ユ垚鏈环"
@@ -401,7 +425,7 @@
             </div>
             <FormItem class="form-item-view-el" label="PC鍟嗗搧鎻忚堪" prop="intro" style="width: 100%">
               <editor
-                :show-upload="false"
+                :show-upload="true"
                 ref="editor"
                 v-model="baseInfoForm.intro"
                 height="800px"
@@ -415,7 +439,7 @@
 
             <FormItem class="form-item-view-el" label="绉诲姩绔弿杩�" prop="skuList" style="width: 100%">
               <editor
-                :show-upload="false"
+                :show-upload="true"
                 ref="introEditor"
                 v-model="baseInfoForm.mobileIntro"
                 height="800px"
@@ -504,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">
 
@@ -560,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",
@@ -592,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,
@@ -664,6 +824,7 @@
       ],
       /** 鍙戝竷鍟嗗搧鍩烘湰鍙傛暟 */
       baseInfoForm: {
+        virtualGoodsType:"",
         salesModel: "RETAIL",
         /** 鍟嗗搧鐩稿唽鍒楄〃 */
         goodsGalleryFiles: [],
@@ -700,7 +861,8 @@
         preSaleTime:[],
         preSaleBeginDate:'',
         preSaleEndDate:'',
-        commission:5
+        commission:5,
+
       },
       /** 琛ㄦ牸澶� */
       skuTableColumn: [],
@@ -758,6 +920,8 @@
         "price",
         "weight",
         "quantity",
+        "couponName",
+        "couponId",
         // "alertQuantity",
         "specId",
         "specValueId",
@@ -766,6 +930,7 @@
       selectedFormBtnName: "", // 鐐瑰嚮鍥剧墖缁戝畾form
       selectedImage: [],
       lastEditSkuValue: '',
+
     };
   },
   watch: {
@@ -782,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');
@@ -1116,6 +1325,16 @@
       }
     },
     // sku鍥剧墖涓婁紶鍓嶉挬瀛�
+  // async handleBeforeUpload(file) {
+  //     const check =
+  //       this.selectedSku.images !== undefined &&
+  //       this.selectedSku.images.length > 5;
+  //     if (check) {
+  //       this.$Notice.warning({title: "鍥剧墖鏁伴噺涓嶈兘澶т簬浜斿紶"});
+  //       return false;
+  //     }
+  //   },
+    // sku鍥剧墖涓婁紶鍓嶉挬瀛�
   async handleBeforeUpload(file) {
       const check =
         this.selectedSku.images !== undefined &&
@@ -1327,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) {
@@ -1459,8 +1680,8 @@
         this.$Message.error("宸插瓨鍦ㄧ浉鍚岃鏍奸」锛�");
         return;
       }
-      if (this.zz(0, val) > 20) {
-        this.$Message.error("瑙勬牸鍊兼渶澶氬崄涓瓧绗﹂暱搴︼紒");
+      if (this.zz(0, val) > 30) {
+        this.$Message.error("瑙勬牸鍊兼渶澶氬崄浜斾釜瀛楃闀垮害锛�");
         // val = val.toString().slice(0, 4);
         this.skuInfo[index].name = this.countCharacters(val, 10);
         this.$forceUpdate();// 璋冪敤璇ユ柟娉曚細瑙﹀彂缁勪欢鐨勯噸鏂版覆鏌�
@@ -1515,8 +1736,8 @@
       if (val.value === '') {
         return;
       }
-      if (this.zz(0, val.value) > 20) {
-        this.$Message.error("瑙勬牸鍊兼渶澶氬崄涓瓧绗﹂暱搴︼紒");
+      if (this.zz(0, val.value) > 30) {
+        this.$Message.error("瑙勬牸鍊兼渶澶氬崄浜斾釜瀛楃闀垮害锛�");
         // val.value = val.value.toString().slice(0, 4);
         this.skuInfo[$index].spec_values[index].value = this.countCharacters(val.value, 10);
         this.$forceUpdate();// 璋冪敤璇ユ柟娉曚細瑙﹀彂缁勪欢鐨勯噸鏂版覆鏌�
@@ -1678,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);
@@ -1692,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 = "");
 
@@ -1703,6 +1928,7 @@
         this.baseInfoForm.regeneratorSkuFlag = true;
         this.newSkuValues[$index] = "";
       }
+      this.renderTableData(this.skuTableData);
     },
     handleClearSku() {
       this.skuInfo = [];
@@ -1730,7 +1956,7 @@
      * 娓叉煋table鎵�闇�瑕佺殑column 鍜� data
      */
     renderTableData(skus) {
-      console.log('-------------->閿�鍞被鍨�',skus)
+      console.log('-------------->閿�鍞被鍨�', skus)
       this.skuTableColumn = [];
       let pushData = [];
       // 娓叉煋澶撮儴
@@ -1756,14 +1982,14 @@
         );
       }
       // 棰勫敭妯″紡
-      if (this.baseInfoForm.salesModel !== "PRESALE") {
-        pushData.push(
-          {
-            title: "棰勫敭鏃堕棿",
-            slot: "price",
-          }
-        );
-      }
+      // if (this.baseInfoForm.salesModel !== "PRESALE") {
+      //   pushData.push(
+      //     {
+      //       title: "棰勫敭鏃堕棿",
+      //       slot: "price",
+      //     }
+      //   );
+      // }
       if (this.baseInfoForm.salesModel === "WHOLESALE" && this.wholesaleData) {
         this.wholesaleData.forEach((item, index) => {
           pushData.push({
@@ -1782,6 +2008,14 @@
           title: "閲嶉噺",
           slot: "weight",
         });
+      }
+      if (this.baseInfoForm.goodsType ==="VIRTUAL_GOODS" && this.baseInfoForm.virtualGoodsType==="COUPON"){
+        pushData.push(
+          {
+            title:"浼樻儬鍗�",
+            slot:"COUPON"
+          }
+        )
       }
       pushData.push(
         {
@@ -1819,6 +2053,7 @@
      * array spec鏁版嵁
      */
     specIterator(result, spec, skus) {
+
       let table = result;
       if (spec.length > 0) {
         //娓呴櫎褰撳墠寰幆鐨勫垎缁�
@@ -1834,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,
@@ -1860,6 +2096,11 @@
       } else {
         this.skuIndex++;
       }
+
+      table.forEach((item,index) =>{
+        console.log("鍏冪礌:" + item +"index:" + (index +1))
+          item.sn = index + 1;
+      })
       return table;
     },
     /** 鏍规嵁鍒嗙被id鑾峰彇绯荤粺璁剧疆瑙勬牸淇℃伅*/
@@ -1917,6 +2158,7 @@
           return;
         }
       }
+
       // else if (item === "alertQuantity") {
       //   if (
       //     !/^[0-9]\d*$/.test(row[item]) ||
@@ -1991,20 +2233,20 @@
             }
             this.baseInfoForm.goodsId = this.goodsId;
             let submit = JSON.parse(JSON.stringify(this.baseInfoForm));
-            console.log('----------------->鎻愪氦',submit);
+
             if (
               submit.goodsGalleryFiles &&
-                submit.goodsGalleryFiles.length <= 0
+              submit.goodsGalleryFiles.length <= 0
             ) {
               this.submitLoading = false;
               this.$Message.error("璇蜂笂浼犲晢鍝佸浘鐗�");
               return;
             }
-            if (!submit.goodsVideo){
-              this.submitLoading = false;
-              this.$Message.error("璇蜂笂浼犲晢鍝佽棰�");
-              return;
-            }
+            // if (!submit.goodsVideo){
+            //   this.submitLoading = false;
+            //   this.$Message.error("璇蜂笂浼犲晢鍝佽棰�");
+            //   return;
+            // }
             if (submit.templateId === "") submit.templateId = 0;
             let flag = false;
             let paramValue = "";
@@ -2029,10 +2271,25 @@
                 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" &&
+                this.baseInfoForm.virtualGoodsType !== '' &&
+                this.baseInfoForm.virtualGoodsType !== undefined &&
+                this.baseInfoForm.virtualGoodsType !== null){
+                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) {
@@ -2059,6 +2316,7 @@
               }
               submit.skuList.push(skuCopy);
             });
+            console.log('----------------->鎻愪氦', submit);
             if (containEmptyImage) {
               this.$Message.error("寮�鍚鏍煎浘鐗囷紝鎵�鏈夎鏍煎浘鐗囦笉鑳戒负绌猴紒");
               this.submitLoading = false;
@@ -2086,6 +2344,7 @@
                 }
               });
             } else {
+              console.log(submit)
               API_GOODS.createGoods(submit).then((res) => {
                 if (res.success) {
                   this.submitLoading = false;
@@ -2169,18 +2428,18 @@
           this.$Message.error("鍒锋柊澶辫触锛岃閲嶈瘯");
         }
       }).catch(reason => {
-        console.log("鑾峰彇妯℃澘澶辫触",reason)
+        console.log("鑾峰彇妯℃澘澶辫触", reason)
       });
     },
-    removeVideo(){
+    removeVideo() {
       this.baseInfoForm.showGoodsVideo = null;
       this.baseInfoForm.goodsVideo = null;
     },
     // todo 鏂囦欢涓婁紶
     async upLoadImg(file) {
-      console.log(file,this.count++);
-      if (this.listImages.length >= 5) {
-        this.$Message.error("鍥剧墖涓婁紶涓嶈兘瓒呰繃5涓�");
+      console.log(file, this.count++);
+      if (this.listImages.length >= 10) {
+        this.$Message.error("鍥剧墖涓婁紶涓嶈兘瓒呰繃10涓�");
         return;
       }
       try {
@@ -2297,12 +2556,10 @@
         this.baseInfoForm.goodsType = this.firstData.goodsType;
 
 
-
-
-        if (this.categoryId!=null && this.categoryId!=='') {
+        if (this.categoryId != null && this.categoryId !== '') {
           /** 鑾峰彇璇ュ晢鍩庡垎绫讳笅 鍟嗗搧鍙傛暟淇℃伅 */
           this.GET_GoodsParams();
-          console.log('鍒嗙被id------------------>',this.categoryId);
+          console.log('鍒嗙被id------------------>', this.categoryId);
           /** 鏌ヨ鍒嗙被缁戝畾鐨勮鏍间俊鎭� */
           this.Get_SkuInfoByCategory(this.categoryId);
           /** 鏌ヨ鍝佺墝鍒楄〃 */

--
Gitblit v1.8.0