peng
2025-10-29 65956f8f44f764dd007b1a0141302b5614c9ca89
seller/src/views/goods/goods-seller/goodsOperationSec.vue
@@ -74,6 +74,28 @@
                            @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.goodsType == 'PHYSICAL_GOODS'" class="form-item-view-el" label="商品类型">
              <Select
                v-model="baseInfoForm.customizeFlag"
                clearable
                style="width: 160px"
                @on-clear="handleGoodsType"
                @on-change="handleGoodsType"
              >
                <Option value="CUSTOMIZE">定制商品</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 +140,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 +179,9 @@
                <img v-if="goodsPictureVisible" :src="previewGoodsPicture" style="width: 100%"/>
              </Modal>
            </FormItem>
            <FormItem>
<!--              <div class="demo-upload-list" v-for="(item,index) in showListImages">-->
@@ -221,9 +247,9 @@
                                              @on-change="editSkuItem(item.name, $index, item)">
                                </AutoComplete>
<!--                                <iSwitch v-if="$index === 0" style="margin-left: 10px" size="small"-->
<!--                                         @on-change="changeSkuOpenImage" v-model="openImage"/>-->
<!--                                <span v-if="$index === 0" style="margin-left: 5px">添加规格图片</span>-->
                                <iSwitch v-if="$index === 0" style="margin-left: 10px" size="small"
                                         @on-change="changeSkuOpenImage" v-model="openImage"/>
                                <span v-if="$index === 0" style="margin-left: 5px">添加规格图片</span>
                              </div>
                            </FormItem>
@@ -313,8 +339,8 @@
                      </Button>
                    </div>
                    &nbsp;
                    <!--                    <Button class="add-sku-btn" size="small" type="warning" @click="handleClearSku">清空规格项-->
                    <!--                    </Button>-->
                                        <Button class="add-sku-btn" size="small" type="warning" @click="handleClearSku">清空规格项
                                        </Button>
                  </div>
                </Panel>
                <Panel name="2">
@@ -346,6 +372,23 @@
                            }}</span>
                          </Input>
                        </template>
                        <template slot="COUPON" slot-scope="{ row }">
                          <div  @click="showCouponListModal($event,row)">
                            <Input v-model="row.couponName" clearable placeholder="选择优惠劵"
                            >
                            </Input>
                          </div>
                        </template>
                        <template slot="CUSTOMIZE" slot-scope="{ row }">
                          <div  @click="showTemplateListModal($event,row)">
                            <Input v-model="row.customizeTemplateName" clearable placeholder="选择定制模板"
                            >
                            </Input>
                          </div>
                        </template>
                        <template slot="cost" slot-scope="{ row }">
                          <Input v-model="row.cost" clearable placeholder="请输入成本价"
                                 @on-change="updateSkuTable(row, 'cost')">
@@ -505,6 +548,82 @@
        <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="showTemplateModal" 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="showTemplate"
          placeholder="请点击选择表格内模板"
        ></Input>
      </div>
      <Table
        :loading="templateLoading"
        border
        :columns="templateColumns"
        :data="templateData"
        ref="table"
        @on-current-change="templateHandleRowClick"
        highlight-row
      ></Table>
      <Row type="flex" justify="center" class="mt_10">
        <Page
          :current="templateSearchForm.pageNumber"
          :total="templateTotal"
          :page-size="templateSearchForm.pageSize"
          @on-change="templateChangePage"
          @on-page-size-change="templateChangePageSize"
          :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">
@@ -546,6 +665,7 @@
  </div>
</template>
<script>
import * as API_GOODS_CUSTOMEIZE from "@/api/goods-customeize-template"
import * as API_GOODS from "@/api/goods";
import * as API_Shop from "@/api/shops";
import cloneObj from "@/utils/index";
@@ -561,7 +681,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 +714,141 @@
      }, 1000);
    };
    return {
      showTemplateModal:false,
      showTemplate:'',
      templateSearchForm: {
        // 搜索框初始化对象
        pageNumber: 1, // 当前页数
        pageSize: 10, // 页面大小
        status:"ENABLE"
      },
      templateLoading:false,
      templateColumns:[
        {
          title: "模板名称",
          key: "templateName",
          tooltip: true,
        },
        {
          title: '启用状态',
          key: 'status',
          width: 120,
          align: 'center',
          render: (h, params) => {
            const status = params.row.status;
            const color = status === 'ENABLE' ? 'success' : status === 'DISABLE' ? 'default' : 'warning';
            const text = status === 'ENABLE' ? '启用' : status === 'DISABLE' ? '未启用' : '未知';
            return h('Tag', {
              props: {
                color: color
              }
            }, text);
          }
        },
      ],
      templateData:[],
      templateTotal:0,
      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 +921,8 @@
      ],
      /** 发布商品基本参数 */
      baseInfoForm: {
        customizeFlag:"",
        virtualGoodsType:"",
        salesModel: "RETAIL",
        /** 商品相册列表 */
        goodsGalleryFiles: [],
@@ -701,7 +959,8 @@
        preSaleTime:[],
        preSaleBeginDate:'',
        preSaleEndDate:'',
        commission:5
        commission:5,
      },
      /** 表格头 */
      skuTableColumn: [],
@@ -759,6 +1018,10 @@
        "price",
        "weight",
        "quantity",
        "couponName",
        "couponId",
        "customizeTemplateName",
        "customizetemplateId",
        // "alertQuantity",
        "specId",
        "specValueId",
@@ -767,6 +1030,7 @@
      selectedFormBtnName: "", // 点击图片绑定form
      selectedImage: [],
      lastEditSkuValue: '',
    };
  },
  watch: {
@@ -783,6 +1047,97 @@
    }
  },
  methods: {
    showTemplateListModal(event,row){
      if (event.target.classList.contains('ivu-icon-ios-close-circle') ||
        event.target.closest('.ivu-input-wrapper-clear-icon')) {
        return; // 如果是清除按钮,不执行后续逻辑
      }
      console.log(row)
      console.log("触发点击")
      this.showTemplateModal = true;
      this.showTemplate='';
      this.getTemplateDataList()
      this.currentRow = row;
    },
    showCouponListModal(event,row){
      if (event.target.classList.contains('ivu-icon-ios-close-circle') ||
        event.target.closest('.ivu-input-wrapper-clear-icon')) {
        return; // 如果是清除按钮,不执行后续逻辑
      }
      this.showCouponModal = true;
      this.showCoupon ='';
      this.getCouponDataList()
      this.currentRow = row;
    },
    handleGoodsType(){
      //重新渲染
      this.renderTableData(this.skuTableData);
    },
    getTemplateDataList() {
      // 获取数据
      this.templateLoading = true;
      API_GOODS_CUSTOMEIZE.getPage(this.templateSearchForm).then((res) => {
        this.templateLoading = false;
        if (res.code === 200) {
          this.templateData = res.data;
          this.templateTotal = res.total;
        }
      });
      this.templateLoading = false;
    },
    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;
    },
    templateHandleRowClick(currentRow ,oldCurrentRow){
      this.showTemplate = currentRow.templateName;
      this.$set(this.currentRow, 'customizeTemplateName', currentRow.templateName);
      this.currentRow.customizeTemplateId = currentRow.id
      console.log(this.currentRow)
      this.updateSkuTable(this.currentRow,"customizeTemplateName")
      this.updateSkuTable(this.currentRow,"customizeTemplateId")
      console.log(this.skuTableData)
    },
    // 处理行点击事件
    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)
    },
    templateChangePage(v){
      this.templateSearchForm.pageNumber = v;
      this.getTemplateDataList();
    },
    templateChangePageSize(v){
      this.templateSearchForm.pageNumber = 1;
      this.templateSearchForm.pageSize = v;
      this.getTemplateDataList();
    },
    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');
@@ -1163,11 +1518,11 @@
          },
        });
        console.log("上传成功", upData)
        this.$nextTick(() => {
          this.listImages.push(fileKey);
          this.showListImages.push(sts.data.endpoint + "/" + fileKey);
          this.baseInfoForm.goodsGalleryFiles.push(fileKey);
        })
        // this.$nextTick(() => {
        //   this.listImages.push(fileKey);
        //   this.showListImages.push(sts.data.endpoint + "/" + fileKey);
        //   this.baseInfoForm.goodsGalleryFiles.push(fileKey);
        // })
      } catch (e) {
        console.log("上传失败", upData)
@@ -1338,6 +1693,10 @@
          // cost: e.cost,
          quantity: e.quantity,
          // alertQuantity: e.alertQuantity,
          couponName:e.couponName,
          couponId:e.couponId,
          customizeTemplateName:e.customizeTemplateName,
          customizeTemplateId:e.customizeTemplateId,
          weight: e.weight,
        };
        if (e.goodsGalleryList && e.goodsGalleryList.length >= 1) {
@@ -1689,6 +2048,10 @@
              // find.cost && (find.cost = "");
              find.quantity && (find.quantity = "");
              // find.alertQuantity && (find.alertQuantity = "");
              find.couponName && (find.couponName = "");
              find.couponId && (find.couponId = "");
              find.customizeTemplateName && (find.customizeTemplateName = "");
              find.customizeTemplateId && (find.customizeTemplateId ="");
              find.weight && (find.weight = "");
              this.skuTableData.splice(this.skuTableData.length, 0, find);
@@ -1703,6 +2066,10 @@
              find.sn && (find.sn = "");
              // find.cost && (find.cost = "");
              find.quantity && (find.quantity = "");
              find.couponName && (find.couponName = "");
              find.couponId && (find.couponId = "");
              find.customizeTemplateName && (find.customizeTemplateName = "");
              find.customizeTemplateId && (find.customizeTemplateId ="");
              // find.alertQuantity && (find.alertQuantity = "");
              find.weight && (find.weight = "");
@@ -1795,6 +2162,21 @@
          slot: "weight",
        });
      }
      if (this.baseInfoForm.goodsType ==="VIRTUAL_GOODS" && this.baseInfoForm.virtualGoodsType==="COUPON"){
        pushData.push(
          {
            title:"优惠劵",
            slot:"COUPON"
          }
        )
      }
      if(this.baseInfoForm.goodsType==="PHYSICAL_GOODS" &&this.baseInfoForm.customizeFlag==="CUSTOMIZE"){
        pushData.push({
          title:"定制商品模板",
          slot:"CUSTOMIZE"
        })
      }
      pushData.push(
        {
          title: "库存",
@@ -1847,6 +2229,8 @@
              id: skus[index].id,
              sn: skus[index].sn,
              quantity: skus[index].quantity,
              coupon: skus[index].coupon,
              customize: skus[index].customize,
              cost: skus[index].cost,
              price: skus[index].price,
              // [spec[0].name]: skus[index][spec[0].name] ? skus[index][spec[0].name] : specItem.value,
@@ -1996,6 +2380,7 @@
    },
    /**  添加商品 **/
    save() {
      console.log(this.skuTableData)
      try {
        this.submitLoading = true;
        this.$refs["baseInfoForm"].validate((valid) => {
@@ -2010,7 +2395,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 +2433,37 @@
                cost: 1,
                price: sku.price,
                quantity: sku.quantity,
                couponName:this.baseInfoForm.virtualGoodsType === "COUPON" ? sku.couponName:null,
                couponId:this.baseInfoForm.virtualGoodsType === "COUPON" ? sku.couponId:null,
                customizeTemplateName:this.baseInfoForm.customizeFlag === "CUSTOMIZE" ? sku.customizeTemplateName : null,
                customizeTemplateId:this.baseInfoForm.customizeFlag === "CUSTOMIZE" ? sku.customizeTemplateId :null,
                // alertQuantity: sku.alertQuantity,
                sn: sku.sn,
                images: [],
              };
              if(this.baseInfoForm.goodsType === "VIRTUAL_GOODS" &&
                this.baseInfoForm.virtualGoodsType === "COUPON"
              ){
                if (sku.couponId === null || sku.couponId === undefined){
                  this.$Message.error("请选择优惠劵")
                  return;
                }
                if (sku.couponName === null || sku.couponName === undefined){
                  this.$Message.error("请选择优惠劵")
                  return;
                }
              }
              if(this.baseInfoForm.goodsType === "PHYSICAL_GOODS" &&
                this.baseInfoForm.customizeFlag === "CUSTOMIZE"){
                if (sku.customizeTemplateId === null || sku.customizeTemplateId === undefined){
                  this.$Message.error("请选择定制模板")
                  return;
                }
                if (sku.customizeTemplateName === null || sku.customizeTemplateName === undefined){
                  this.$Message.error("请选择定制模板")
                  return;
                }
              }
              if (this.openImage) {
                this.skuInfo[0].spec_values.forEach(item => {
                  if (!item.images || item.images.length === 0) {
@@ -2078,6 +2490,7 @@
              }
              submit.skuList.push(skuCopy);
            });
            console.log('----------------->提交', submit);
            if (containEmptyImage) {
              this.$Message.error("开启规格图片,所有规格图片不能为空!");
              this.submitLoading = false;
@@ -2096,6 +2509,7 @@
              ? (submit.recommend = true)
              : (submit.recommend = false);
            if (this.goodsId) {
              console.log(this.submit)
              API_GOODS.editGoods(this.goodsId, submit).then((res) => {
                if (res.success) {
                  this.submitLoading = false;
@@ -2105,6 +2519,7 @@
                }
              });
            } else {
              console.log(submit)
              API_GOODS.createGoods(submit).then((res) => {
                if (res.success) {
                  this.submitLoading = false;
@@ -2293,6 +2708,7 @@
    },
  },
  mounted() {
    this.accessToken = {
      accessToken: this.getStore("accessToken"),
    };
@@ -2314,7 +2730,7 @@
        this.categoryId = cateId[2];
        this.baseInfoForm.categoryPath = cateId.toString();
        this.baseInfoForm.goodsType = this.firstData.goodsType;
        console.log(this.baseInfoForm)
        if (this.categoryId != null && this.categoryId !== '') {
          /** 获取该商城分类下 商品参数信息 */