Sfoglia il codice sorgente

feat:发起售后支持多件多折

chenjiaxin 3 mesi fa
parent
commit
97ae37899a

+ 20 - 5
src/api/oms/refund/refund.js

@@ -68,7 +68,7 @@ export function saveRefund(data) {
     data
   });
 }
-
+// 旧版本 客户创建售后单
 export function saveRefundNew(data) {
   return request({
     url: "/ordersRefund/saveNew",
@@ -76,7 +76,14 @@ export function saveRefundNew(data) {
     data
   });
 }
-
+// 新版本 多件多折 客户创建售后单
+export function backstageSubmitRefund(data) {
+  return request({
+    url: "/ordersRefund/backstageSubmitRefund",
+    method: "post",
+    data
+  });
+}
 export function updateRefund(data) {
   return request({
     url: "/ordersRefund/update",
@@ -214,15 +221,23 @@ export function validPromotionReq(data) {
 // 客服提交售后申请版本查询
 export function checkRefundVersions(data) {
   return request({
-    url: "/getRefundVersions",
-    method: "post",
+    url: "/ordersRefund/getRefundVersions",
+    method: "get",
     data
   });
 }
 // 客服提交售后申请预览
 export function checkSubmitRefund(data) {
   return request({
-    url: "/checkSubmitRefund",
+    url: "/ordersRefund/backstageCheckSubmitRefund",
+    method: "post",
+    data
+  });
+}
+// 退款单获取折扣信息
+export function getRefundDiscount(data) {
+  return request({
+    url: "/ordersRefund/getRefundDiscount",
     method: "post",
     data
   });

+ 2 - 1
src/lang/en/label.js

@@ -455,11 +455,12 @@ export default {
   discount: 'Discount code',
   autoDiscount: "Automatic discount",
   discountSetting: "Discount Setting",
+  paidTips: '現在の注文には未払いの価格差額注文があります。適用する前に顧客に支払いまたはキャンセルを促してください。',
   order: "Order",
   product: "Product",
   discountStr: 'Discount',
   numberStr: "Quantity",
-  money: 'Money',
+  money: 'Amount',
   productCollection: " Product Collections",
   all: ", Total ",
   itemProduct: ' Items',

+ 1 - 0
src/lang/ja/label.js

@@ -781,6 +781,7 @@ export default {
   shippingRates: '貨物',
   shippingRatesValue: '一定額を超える送料を除外する',
   needPayWithCustomers: "差額はお客様がお支払いいただきます",
+  paidTips: 'There is an unpaid price difference order for the current order. Please remind the customer to pay or cancel before applying.',
   promotionBuyTyper: [{
     label: '一度限りの購入',
     value: 1

+ 1 - 0
src/lang/zh/label.js

@@ -404,6 +404,7 @@ export default {
   originalQuantity: "原数量",
   refundPercentage: "退款比例",
   eligibleQuantity: "可退数量",
+  paidTips: '当前订单存在未支付的补差价单,请提醒顾客去支付或者取消后,再进行申请.',
   refundedAmount: "退还金额",
   refundReason: "退款原因",
   reasonExplanation: "原因说明",

+ 99 - 183
src/views/oms/promotion/amountOffOrder/index.vue

@@ -8,19 +8,19 @@
             style="width: 200px;"
             clearable
             class="filter-item"
-            v-model="listQuery.promotionName"
+            v-model="listQuery.title"
             @keyup.enter.native="retPage"
           />
           <el-input
             :placeholder="$t('label.minimumPurchaseRequirement')"
-            style="width: 200px;"
+            style="width: 220px;"
             clearable
             class="filter-item"
-            v-model="listQuery.minimumPurchaseRequirement"
+            v-model="listQuery.requireValue"
             @keyup.enter.native="retPage"
           />
           <el-select
-            v-model="listQuery.applicationMethod"
+            v-model="listQuery.discountMethod"
             clearable
             class="filter-item"
             style="width: 200px;"
@@ -29,9 +29,9 @@
           >
             <el-option
               :key="index"
-              v-for="(item, index) in storeList"
-              :label="item.storeName"
-              :value="item.storeId"
+              v-for="(item, index) in $t('label.applicationMethodList')"
+              :label="item.label"
+              :value="item.value"
             />
           </el-select>
           <el-button
@@ -60,36 +60,22 @@
             :label="$t('label.promotionEventName')"
             width="220"
             show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionName }}</span>
-            </template>
-          </el-table-column>
+            prop="title"
+          />
           <el-table-column
             :label="$t('label.promotionId')"
             align="center"
             width="220"
             show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionInfo }}</span>
-            </template>
-          </el-table-column>
+            prop="id"
+          />
           <el-table-column
             :label="$t('label.participateType')"
             align="center"
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{
-                $t("label.participateTypeArr").find(
-                  item => item.value === row.participateType
-                )
-                  ? $t("label.participateTypeArr").find(
-                      item => item.value === row.participateType
-                    ).label
-                  : ""
-              }}</span>
+              <span>{{ ruleTypeLabel(row.ruleType) }}</span>
             </template>
           </el-table-column>
           <el-table-column
@@ -97,9 +83,7 @@
             align="center"
             width="220"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
+            <span>{{ $t("label.product") }}</span>
           </el-table-column>
           <el-table-column
             :label="$t('label.applicationMethod')"
@@ -107,7 +91,7 @@
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateNum }}</span>
+              <span>{{ applicationMethod(row.discountMethod) }}</span>
             </template>
           </el-table-column>
           <el-table-column
@@ -116,7 +100,7 @@
             width="160"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
+              <span>{{ purchaseRequire(row) }}</span>
             </template>
           </el-table-column>
 
@@ -126,18 +110,10 @@
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{
-                $t("label.conditionTypeArr").find(
-                  item => item.value === row.conditionType
-                )
-                  ? $t("label.conditionTypeArr").find(
-                      item => item.value === row.conditionType
-                    ).label
-                  : ""
-              }}</span>
+              {{ discountVal(row) }}
             </template>
           </el-table-column>
-          <el-table-column
+          <!-- <el-table-column
             :label="$t('label.priority')"
             align="center"
             width="120"
@@ -145,42 +121,44 @@
             <template v-slot="{ row }">
               <span>{{ row.participateWeight }}</span>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             :label="$t('label.stackableType')"
             align="center"
             width="150"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
+              <span>{{ stackableType(row) }}</span>
             </template>
           </el-table-column>
           <el-table-column
             :label="$t('label.promotionStartTime')"
             align="center"
+            prop="startTime"
             width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
-          </el-table-column>
+          />
           <el-table-column
             :label="$t('label.promotionEndTime')"
             align="center"
             width="220"
+            prop="endTime"
+          />
+          <!-- <el-table-column
+            :label="$t('label.status')"
+            align="center"
+            width="120"
+            prop="status"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionEndTime }}</span>
-            </template>
-          </el-table-column>
+            <template v-slot="{ row }">{{ statusVal(row.status) }}</template>
+          </el-table-column> -->
           <el-table-column
             :label="$t('label.version')"
             align="center"
             width="120"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
+            <template v-slot="{ row }">{{
+              row.version ? "V" + row.version : ""
+            }}</template>
           </el-table-column>
           <el-table-column
             :label="$t('label.operation')"
@@ -189,55 +167,6 @@
             fixed="right"
           >
             <template v-slot="{ row }">
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.edit')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:update'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-edit"
-                  circle
-                  @click="showDialog(row.id, false)"
-                >
-                </el-button>
-              </el-tooltip> -->
-
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.details')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:list'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-more"
-                  circle
-                  @click="showDialog(row.id, true)"
-                >
-                </el-button>
-              </el-tooltip>
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.delete')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:delete'"
-                  type="danger"
-                  circle
-                  size="mini"
-                  icon="el-icon-delete"
-                  @click="handleDelete(row.id)"
-                >
-                </el-button>
-              </el-tooltip>
               <el-tooltip
                 class="item"
                 effect="dark"
@@ -245,31 +174,15 @@
                 placement="top-start"
               >
                 <el-button
-                  v-has="'promotion:status'"
+                  v-has="'priceRule:version'"
                   type="primary"
                   circle
                   size="mini"
-                  icon="el-icon-notebook-1"
+                  icon="el-icon-more"
                   @click="handleLog(row.id)"
                 >
                 </el-button>
               </el-tooltip>
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('title.operationLog')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotionLog:list'"
-                  type="primary"
-                  circle
-                  size="mini"
-                  icon="el-icon-notebook-1"
-                  @click="handleLog(row.id)"
-                >
-                </el-button>
-              </el-tooltip> -->
             </template>
           </el-table-column>
         </el-table>
@@ -285,8 +198,11 @@
       </el-main>
     </el-container>
 
-    <promotion-form ref="promotionFormRef" @refresh-table="getList" />
-    <promotion-log-list ref="logListRef" @show="id => showDialog(id, true)" />
+    <promotion-form ref="promotionBuyXgetYFormRef" @refresh-table="getList" />
+    <promotion-log-list
+      ref="logListRef"
+      @show="({ id, version }) => showDialog(id, true, version)"
+    />
   </div>
 </template>
 
@@ -295,15 +211,10 @@ import waves from "@/directive/waves"; // 水波纹指令
 import SwPage from "@/views/common/swPage.vue";
 import ElContainer from "element-ui/packages/container/src/main";
 import PromotionForm from "@/views/oms/promotion/amountOffOrder/promotionForm.vue";
-import PromotionLogList from "@/views/oms/promotion/amountOffOrder/promotionLogList.vue";
-import {
-  fetchList,
-  deleteById,
-  storeList,
-  checkPromotion,
-  changeStatus
-} from "@/api/oms/order/promotion";
+import PromotionLogList from "@/views/oms/promotion/multiBuyDiscount/promotionLogList.vue";
+import { fetchList } from "@/api/oms/order/multiBuyDiscount";
 import { getToken } from "@/utils/auth";
+import i18n from "@/lang";
 
 export default {
   inject: ["reload"], //刷新
@@ -313,7 +224,7 @@ export default {
     PromotionForm,
     PromotionLogList
   },
-  name: "multiBuyDiscount",
+  name: "buyXgetYDiscount",
   directives: {
     waves
   },
@@ -327,18 +238,18 @@ export default {
       total: null,
       listLoading: false,
       listQuery: {
-        applicationMethod: null,
-        promotionName: null,
-        minimumPurchaseRequirement: null,
+        discountMethod: null,
+        title: null,
+        requireValue: null,
         page: 1,
-        limit: 10
+        limit: 10,
+        ruleType: 2 //折扣类型 1 产品降价 2 订单降价 3 买X得Y 4免运费 5 多件多扣'
       },
       storeList: []
     };
   },
   created() {
     this.getList();
-    this.getStoreList();
   },
   computed: {
     headers: function() {
@@ -346,12 +257,54 @@ export default {
     }
   },
   methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
+    // 可叠加类型
+    stackableType(row) {
+      const { combineWithOrder, combineWithProduct, combineWithShipping } = row;
+      let arr = [];
+      if (combineWithOrder) {
+        arr.push(i18n.t("label.combinationList")[1].label);
+      }
+      if (combineWithProduct) {
+        arr.push(i18n.t("label.combinationList")[0].label);
+      }
+      if (combineWithShipping) {
+        arr.push(i18n.t("label.combinationList")[2].label);
+      }
+      return arr.join(",");
+    },
+    // 折扣类型
+    applicationMethod(val) {
+      const data = i18n
+        .t("label.applicationMethodList")
+        .find(item => item.value === val);
+      return val && data ? data.label : "";
+    },
+    // 最低购买条件
+    purchaseRequire(row) {
+      let { purchaseRequire, requireValue } = row;
+      if (purchaseRequire === 2) {
+        return "$ " + requireValue;
+      } else if (purchaseRequire === 3) {
+        return requireValue + " " + i18n.t("label.item");
+      } else {
+        return i18n.t("label.noRequirement");
+      }
+    },
+    // 折扣内容
+    discountVal(row) {
+      let { valueType, numericValue } = row;
+      if (valueType === 1) {
+        return numericValue * 100 + "% off";
+      } else if (valueType === 2) {
+        return numericValue;
+      } else {
+        return i18n.t("label.free");
+      }
+    },
+    // 折扣类型
+    ruleTypeLabel(val) {
+      const obj = i18n.t("label.ruleTypeList").find(item => item.value === val);
+      return val && obj ? obj.label : "";
     },
     getList() {
       this.listLoading = true;
@@ -375,46 +328,9 @@ export default {
       this.listQuery.page = 1;
       this.getList();
     },
-    handleDelete(id) {
-      this.$confirm("是否删除该记录?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      }).then(() => {
-        deleteById(id).then(res => {
-          if (res.code === 200) {
-            this.$message({
-              message: "操作成功",
-              type: "success"
-            });
-            this.getList();
-          }
-        });
-      });
-    },
-    showDialog(id, edit) {
-      this.$refs.promotionFormRef.showDialog(id, edit);
-    },
-    handleDetail(id) {
-      console.log(id, "detail");
+    showDialog(id, edit, version) {
+      this.$refs.promotionBuyXgetYFormRef.showDialog(id, edit, version);
     },
-    // changePromotionStatus(id, status) {
-    //   this.$confirm(status ? "是否确认禁用?" : "是否确认启用?", "提示", {
-    //     confirmButtonText: "确定",
-    //     cancelButtonText: "取消",
-    //     type: "warning"
-    //   }).then(() => {
-    //     changeStatus(id).then(res => {
-    //       if (res.code === 200) {
-    //         this.$message({
-    //           message: "操作成功",
-    //           type: "success"
-    //         });
-    //         this.getList();
-    //       }
-    //     });
-    //   });
-    // },
     handleLog(id) {
       this.$refs.logListRef.handleOpen(id);
     }

+ 0 - 556
src/views/oms/promotion/amountOffOrder/promotionForm copy.vue

@@ -1,556 +0,0 @@
-<template>
-  <el-dialog
-    v-loading="pageLoad"
-    element-loading-text="loading..."
-    :title="title"
-    top="0"
-    width="100%"
-    lock-scroll
-    custom-class="promotionform"
-    :close-on-click-modal="false"
-    :visible.sync="promotionFormVisible"
-    @open="handleOpenDialog"
-    @close="resetData"
-  >
-    <div class="dialog-body">
-      <el-form
-        ref="promotionFormRef"
-        :rules="baseRule"
-        :model="promotion"
-        label-width="auto"
-        size="medium"
-      >
-        <!-- 设置活动基本信息 -->
-        <div class="box">
-          <div class="title">
-            <span>{{ $t("label.setBasicEventInformation") }}</span>
-          </div>
-          <div class="info">
-            <!--促销名称-->
-            <el-form-item
-              :label="$t('label.promotionName') + ':'"
-              prop="promotionName"
-              style="width:418px"
-              required
-            >
-              <el-input
-                v-model.trim="promotion.promotionName"
-                :disabled="edit"
-              ></el-input>
-            </el-form-item>
-            <div class="item">
-              <!--促销开始时间-->
-              <el-form-item
-                :label="$t('label.promotionStartTime') + ':'"
-                prop="promotionStartTime"
-                required
-              >
-                <el-date-picker
-                  :disabled="edit"
-                  type="datetime"
-                  placeholder="选择日期"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  v-model="promotion.promotionStartTime"
-                ></el-date-picker>
-              </el-form-item>
-
-              <!--促销失效时间-->
-              <el-form-item
-                :label="$t('label.promotionEndTime') + ':'"
-                prop="promotionEndTime"
-                required
-              >
-                <el-date-picker
-                  :disabled="edit"
-                  type="datetime"
-                  placeholder="选择日期"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  v-model="promotion.promotionEndTime"
-                ></el-date-picker>
-              </el-form-item>
-            </div>
-            <!--应用方式-->
-            <el-form-item
-              :label="$t('label.applicationMethod') + ':'"
-              prop="mutual"
-              required
-            >
-              <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                <div class="item row">
-                  <el-radio :label="true">{{ $t("label.discount") }}</el-radio>
-                  <el-input
-                    class="codeinput"
-                    v-model.trim="promotion.promotionName"
-                    :disabled="edit"
-                  />
-                  <el-radio :label="false">{{
-                    $t("label.autoDiscount")
-                  }}</el-radio>
-                </div>
-              </el-radio-group>
-            </el-form-item>
-          </div>
-        </div>
-        <!-- 折扣设置 -->
-        <div class="box">
-          <div class="title">
-            <span>{{ $t("label.discountSetting") }}</span>
-          </div>
-          <div class="info">
-            <div class="item">
-              <!--最低购买要求-->
-              <el-form-item
-                :label="$t('label.minimumPurchaseRequirement') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <div class="item row">
-                    <el-radio :label="true">{{
-                      $t("label.discount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                    <el-radio :label="false">{{
-                      $t("label.autoDiscount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                  </div>
-                </el-radio-group>
-              </el-form-item>
-
-              <!--促销级别-->
-              <el-form-item
-                :label="$t('label.promotionLevel') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <el-radio :label="true">{{ $t("label.order") }}</el-radio>
-                  <el-radio :label="false">{{ $t("label.product") }}</el-radio>
-                </el-radio-group>
-              </el-form-item>
-            </div>
-            <div class="item">
-              <!--折扣内容-->
-              <el-form-item
-                :label="$t('label.discountValue') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <div class="item row">
-                    <el-radio :label="true">{{
-                      $t("label.discount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                    <el-radio :label="false">{{
-                      $t("label.autoDiscount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                  </div>
-                </el-radio-group>
-              </el-form-item>
-
-              <!--促销级别-->
-              <el-form-item
-                :label="$t('label.priority') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <el-radio
-                    v-for="(item, i) in $t('label.priorityValue')"
-                    :key="i"
-                    :label="item.value"
-                    >{{ item.label }}</el-radio
-                  >
-                </el-radio-group>
-              </el-form-item>
-            </div>
-            <!--可叠加类型-->
-            <el-form-item
-              :label="$t('label.stackableTypes') + ':'"
-              prop="stackableType"
-              required
-            >
-              <el-checkbox-group
-                v-model="promotion.stackableType"
-                :disabled="edit"
-              >
-                <el-checkbox
-                  v-for="(item, i) in $t('label.stackableTypesValue')"
-                  :key="i"
-                  :label="item.value"
-                  >{{ item.label }}</el-checkbox
-                >
-              </el-checkbox-group>
-            </el-form-item>
-          </div>
-        </div>
-
-        <!-- 设置商品范围 -->
-        <div class="box productbox">
-          <div class="title">
-            <span>{{ $t("label.setProductRange") }}</span>
-          </div>
-          <div class="info">
-            <!-- 指定商品标签 -->
-            <el-form-item
-              :label="$t('label.product') + ':'"
-              prop="participateType"
-              required
-            >
-              <el-select
-                multiple
-                v-model="promotion.participateType"
-                @change="handleChangeParticipateType"
-                :disabled="edit"
-              >
-                <el-option
-                  :key="index"
-                  v-for="(item, index) in $t('label.participateTypeArr')"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-            <el-form-item
-              :label="$t('label.specifyProductTag') + ':'"
-              prop="mutual"
-            >
-              <el-input
-                class="mininput"
-                v-model.trim="promotion.promotionName"
-                :disabled="edit"
-              />
-              <div class="skucon">
-                121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,
-                121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,124C2B014,132J0B06V,121J0B04B,124C2B
-              </div>
-            </el-form-item>
-          </div>
-        </div>
-      </el-form>
-    </div>
-
-    <template slot="footer">
-      <el-button
-        @click="
-          resetData();
-          promotionFormVisible = false;
-        "
-        >{{ $t("view.cancel") }}
-      </el-button>
-      <!-- 未审核时/审核驳回 状态可进行提交 -->
-      <el-button
-        type="primary"
-        @click="handleSaveOrUpdate"
-        v-if="promotion.promotionStatus !== 1"
-        :disabled="edit"
-        >{{ $t("view.confirm") }}
-      </el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-import waves from "@/directive/waves"; // 水波纹指令
-import { getById, save, storeList, update } from "@/api/oms/order/promotion";
-import i18n from "@/lang";
-import promotion from "@/views/oms/promotion/multiBuyDiscount/index.vue";
-
-export default {
-  inject: ["reload"],
-  directives: {
-    waves
-  },
-  components: {},
-  computed: {},
-  name: "multiBuyDiscountForm",
-  filters: {},
-  data() {
-    return {
-      promotionFormVisible: false,
-      title: "",
-      promotion: {
-        // 配置基本信息
-        id: "",
-        promotionName: "",
-        stackableType: [],
-        promotionInfo: "",
-        promotionStore: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        promotionStatus: "",
-        rejectCause: "",
-        participateNum: 1,
-        mutual: "",
-        isSuperposition: "",
-        participateWeight: 0,
-        participateType: "",
-        conditionType: "",
-        conditionValue: "",
-        goodsRelation: "",
-        goodsScope: "",
-        giftRelation: ""
-      },
-      edit: true,
-      storeList: [],
-      noDataText: "加载中",
-      baseRule: {
-        // 促销配置
-        promotionName: [
-          {
-            required: true,
-            message: "请输入促销名称",
-            trigger: ["change", "blur"]
-          },
-          {
-            min: 2,
-            max: 50,
-            message: "长度在 2 到 50 个字符",
-            trigger: ["change", "blur"]
-          }
-        ]
-      },
-      pageLoad: false,
-      conditionTypeArr: i18n.t("label.conditionTypeArr").map(item => {
-        return {
-          ...item,
-          disabled: false
-        };
-      })
-    };
-  },
-  mounted() {},
-  methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
-    },
-    async showDialog(id, edit) {
-      this.edit = !edit;
-      await this.getStoreList();
-      if (id) {
-        // 修改配置
-        this.promotion.id = id;
-        await this.getPromotionInfo();
-      }
-      this.title = id
-        ? i18n.t("title.updateTitle")
-        : i18n.t("title.createTitle");
-      this.promotionFormVisible = true;
-    },
-    resetData() {
-      this.promotion = {
-        id: "",
-        promotionName: "",
-        promotionInfo: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        promotionStatus: "",
-        rejectCause: "",
-        participateNum: "",
-        mutual: "",
-        participateWeight: "",
-        participateType: "",
-        conditionType: "",
-        conditionValue: "",
-        goodsRelation: "",
-        goodsScope: "",
-        giftRelation: "",
-        stackableType: []
-      };
-    },
-    handleOpenDialog() {
-      this.resetData();
-      if (this.$refs.promotionFormRef) {
-        this.$refs.promotionFormRef.clearValidate();
-      }
-    },
-    getPromotionInfo() {
-      this.pageLoad = true;
-      getById(this.promotion.id).then(res => {
-        // 促销配置信息
-        this.promotion = res.data;
-        this.pageLoad = false;
-      });
-    },
-    handleSaveOrUpdate() {
-      //创建商品
-      this.$refs["promotionFormRef"].validate(valid => {
-        //通用属性验证成功
-        if (valid) {
-          // 如果需要在促销类型买就送的情况下将条件类型和条件值改为 "0" 则可在此修改 暂时默认为空字符
-          const data = {
-            ...this.promotion
-          };
-          if (!data.id) {
-            save(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
-              }
-            });
-          } else {
-            update(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
-              }
-            });
-          }
-        }
-      });
-    },
-    handleChangeParticipateType(e) {
-      this.conditionTypeArr.forEach(item => {
-        item.disabled = false;
-      });
-      this.promotion.conditionType = "";
-      this.promotion.conditionValue = "";
-      if (e === "gift_money" || e === "gift_qty") {
-        this.conditionTypeArr[2].disabled = true;
-      } else if (e === "gift_consumer") {
-        // gift_consumer
-        this.conditionTypeArr[0].disabled = true;
-        this.conditionTypeArr[1].disabled = true;
-        this.promotion.conditionType = this.conditionTypeArr[2].value;
-      }
-    }
-  }
-};
-</script>
-<style lang="scss">
-.promotionform {
-  width: 100%;
-  height: 100%;
-  position: fixed;
-  top: 0px;
-  left: 0px;
-  .el-dialog__header {
-    padding: 36px 21px 0px 34px;
-    .el-dialog__title {
-      font-size: 18px;
-      font-weight: bold;
-      color: #ae8877;
-      line-height: 22px;
-    }
-  }
-  .el-form-item__label {
-    font-weight: 400;
-  }
-  .el-dialog__body {
-    padding: 30px 10px 30px 34px;
-  }
-  .el-dialog__headerbtn {
-    top: 14px;
-    right: 14px;
-    font-weight: bold;
-    .el-icon-close {
-      font-weight: bold;
-    }
-  }
-}
-</style>
-<style scoped rel="stylesheet/scss" lang="scss">
-.dialog-body {
-  height: 80vh;
-  overflow: auto;
-  .box {
-    border-bottom: 1px solid #d8d8d8;
-    padding-bottom: 20px;
-    margin-bottom: 42px;
-    .title {
-      color: #606266;
-      font-size: 16px;
-      line-height: 16px;
-      position: relative;
-      font-weight: bold;
-      padding-left: 6px;
-      margin-bottom: 23px;
-      &:before {
-        position: absolute;
-        left: 0px;
-        top: 0px;
-        content: "";
-        display: inline-block;
-        width: 3px;
-        height: 13px;
-        background: #ae8877;
-        border-radius: 0px 0px 0px 0px;
-      }
-    }
-  }
-  // /deep/.el-form-item__label-wrap {
-  //   margin-left: 0px !important;
-  //   .el-form-item__label {
-  //     text-align: right;
-  //   }
-  // }
-  .skucon {
-    width: 90%;
-    height: 139px;
-    overflow-y: auto;
-    border-radius: 3px 3px 3px 3px;
-    border: 1px solid #dcdfe6;
-    margin-top: 12px;
-    padding: 10px;
-    font-size: 12px;
-    line-height: 16px;
-  }
-  .productbox {
-    border-bottom: none;
-  }
-  .info {
-    .item {
-      display: flex;
-      flex-direction: row;
-      flex-wrap: wrap;
-      align-items: center;
-      &.row {
-        flex-wrap: nowrap;
-      }
-      .el-form-item {
-        margin-right: 42px !important;
-      }
-      .codeinput {
-        margin-right: 36px;
-      }
-      .mininput {
-        margin-right: 30px;
-        .el-input__inner {
-          width: 142px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 352 - 290
src/views/oms/promotion/amountOffOrder/promotionForm.vue

@@ -1,7 +1,6 @@
 <template>
-  <div>
+  <div v-loading="pageLoad">
     <el-dialog
-      v-loading="pageLoad"
       element-loading-text="loading..."
       :title="title"
       top="0"
@@ -13,9 +12,9 @@
       @open="handleOpenDialog"
       @close="resetData"
     >
-      <div class="dialog-body">
+      <div class="dialog-body" v-loading="pageLoad">
         <el-form
-          ref="promotionFormRef"
+          ref="promotionBuyXgetYDertailFormRef"
           :model="promotion"
           label-width="210px"
           size="medium"
@@ -32,7 +31,7 @@
                 prop="promotionName"
               >
                 <el-input
-                  v-model.trim="promotion.promotionName"
+                  v-model.trim="promotion.title"
                   :disabled="edit"
                 ></el-input>
               </el-form-item>
@@ -40,45 +39,49 @@
                 <!--促销开始时间-->
                 <el-form-item
                   :label="$t('label.promotionStartTime') + ':'"
-                  prop="promotionStartTime"
+                  prop="startTime"
                 >
                   <el-date-picker
                     :disabled="edit"
                     type="datetime"
                     placeholder="选择日期"
                     value-format="yyyy-MM-dd HH:mm:ss"
-                    v-model="promotion.promotionStartTime"
+                    v-model="promotion.startTime"
                   ></el-date-picker>
                 </el-form-item>
 
                 <!--促销失效时间-->
                 <el-form-item
                   :label="$t('label.promotionEndTime') + ':'"
-                  prop="promotionEndTime"
+                  prop="endTime"
                 >
                   <el-date-picker
                     :disabled="edit"
                     type="datetime"
                     placeholder="选择日期"
                     value-format="yyyy-MM-dd HH:mm:ss"
-                    v-model="promotion.promotionEndTime"
+                    v-model="promotion.endTime"
                   ></el-date-picker>
                 </el-form-item>
               </div>
               <!--应用方式-->
               <el-form-item
                 :label="$t('label.applicationMethod') + ':'"
-                prop="type"
+                prop="discountMethod"
               >
-                <el-radio-group v-model="promotion.type" :disabled="edit">
+                <el-radio-group
+                  v-model="promotion.discountMethod"
+                  :disabled="edit"
+                >
                   <div class="item row">
-                    <el-radio label="1">{{ $t("label.discount") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.discount") }}</el-radio>
                     <el-input
+                      v-show="promotion.discountMethod === 1"
                       class="codeinput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.discountCode"
                       :disabled="edit"
                     />
-                    <el-radio label="2">{{
+                    <el-radio :label="2">{{
                       $t("label.autoDiscount")
                     }}</el-radio>
                   </div>
@@ -88,123 +91,91 @@
           </div>
           <!-- 折扣设置 -->
           <div class="box discount">
-            <!-- 折扣内容 -->
+            <!-- 客户购买条件 -->
             <div class="title">
-              <span>{{ $t("label.discountValue") }}</span>
+              <span>{{ $t("label.customerPurchaseConditions") }}</span>
             </div>
             <div class="info">
+              <!--最低购买要求-->
+              <el-form-item
+                :label="$t('label.minimumPurchaseRequirement') + ':'"
+                prop="minimum"
+              >
+                <el-radio-group
+                  v-model="promotion.purchaseRequire"
+                  :disabled="edit"
+                >
+                  <div class="item row">
+                    <el-radio :label="3">{{ $t("label.numberStr") }}</el-radio>
+                    <el-radio :label="2">{{ $t("label.money") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.free") }}</el-radio>
+                  </div>
+                </el-radio-group>
+              </el-form-item>
               <!--折扣内容 数量&金额-->
               <el-form-item :label="$t('label.discountValue') + ':'">
-                <div class="item row">
-                  <el-input
-                    class="mininput"
-                    v-model.trim="promotion.minimumMoney"
-                    :disabled="edit"
-                  />
-                </div>
-                <!-- <div class="item-box">
-                    <span class="label">{{ $t("label.buyType") }}</span>
+                <div class="item">
+                  <!--最低要求 免费 不展示 -->
+                  <div class="item-box" v-if="promotion.purchaseRequire !== 1">
+                    <span class="label">{{ discountContentValue }}</span>
                     <el-input
                       class="mininput"
-                      v-model.trim="promotion.purchaseType"
+                      v-model.trim="promotion.requireValue"
                       :disabled="edit"
                     />
-                  </div> -->
-              </el-form-item>
-              <!--折扣内容 商品-->
-              <!-- <el-form-item :label="$t('label.product') + ':'">
-                <div class="item product">
+                  </div>
                   <div class="item-box">
+                    <span class="label">{{ $t("label.buyType") }}</span>
                     <el-input
                       class="mininput"
-                      v-model.trim="promotion.productType"
+                      v-model.trim="promotion.purchaseType"
                       :disabled="edit"
                     />
-                    <el-input
-                      class="collectioninput"
-                      v-model.trim="promotion.productCollection"
-                      :disabled="edit"
-                    >
-                      <template slot="append"
-                        ><span
-                          @click="
-                            handleProductDialog(promotion.productCollection)
-                          "
-                          >查看商品明细</span
-                        ></template
-                      >
-                    </el-input>
-                    <el-input
-                      class="collectioninput"
-                      v-model.trim="promotion.productCollection"
-                      :disabled="edit"
-                    >
-                      <template slot="append"
-                        ><span
-                          @click="
-                            handleProductDialog(promotion.productCollection)
-                          "
-                          >查看商品明细</span
-                        ></template
-                      >
-                    </el-input>
                   </div>
                 </div>
-              </el-form-item> -->
-            </div>
-            <!-- 最低购买要求 -->
-            <div class="title">
-              <span>{{ $t("label.minimumPurchaseRequirement") }}</span>
-            </div>
-            <div class="info info-mini">
-              <el-form-item
-                :label="$t('label.minimumPurchaseRequirement') + ':'"
-                prop="minimumPurchaseRequirement"
-              >
-                <el-radio-group
-                  v-model="promotion.minimumPurchaseRequirement"
-                  :disabled="edit"
-                >
-                  <el-radio label="1">{{
-                    $t("label.minimunPurchaseObj.noMinimun")
-                  }}</el-radio>
-
-                  <div class="item row">
-                    <el-radio label="2">{{
-                      $t("label.minimunPurchaseObj.minimunAmount")
-                    }}</el-radio>
-                    <el-input
-                      v-show="promotion.minimumPurchaseRequirement === '2'"
-                      class="mininput"
-                      v-model.trim="promotion.minimumMoney"
-                      :disabled="edit"
-                    />
-                  </div>
+                <div class="item product">
                   <div class="item row">
-                    <el-radio label="3">{{
-                      $t("label.minimunPurchaseObj.minimunQuantity")
-                    }}</el-radio>
+                    <span class="label">{{ $t("label.product") }}</span>
                     <el-input
-                      v-show="promotion.minimumPurchaseRequirement === '3'"
                       class="mininput"
-                      v-model.trim="promotion.minimumMoney"
+                      v-model.trim="promotion.productBuyType"
                       :disabled="edit"
                     />
+                    <div class="value" v-for="(data, j) in tagLists" :key="j">
+                      <p>{{ tagValue(data) }}</p>
+                      <a
+                        href="javascript:void();"
+                        @click="handleProductDialog(data)"
+                        >{{ $t("label.viewProductDetaiL") }}</a
+                      >
+                    </div>
                   </div>
-                </el-radio-group>
+                </div>
               </el-form-item>
+              <!-- 每个订单一次 获得条件为金额才可见 -->
+              <!-- <el-form-item
+                v-if="promotion.valueType === 2"
+                :label="$t('label.oncePerOrder') + ':'"
+              >
+                <el-checkbox
+                  v-model="promotion.oncePerOrder"
+                  :disabled="edit"
+                  >{{ $t("label.oncePerOrderDesc") }}</el-checkbox
+                >
+              </el-form-item> -->
             </div>
             <!-- 客户获得条件 -->
-            <!-- <div class="title">
+            <div class="title">
               <span>{{ $t("label.customerGetConditions") }}</span>
             </div>
             <div class="info">
-              <el-form-item :label="$t('label.discountValue') + ':'">
+              <!--折扣内容 数量&金额-->
+              <!-- <el-form-item :label="$t('label.discountValue') + ':'">
                 <div class="item">
                   <span class="label">{{ $t("label.numberStr") }}</span>
                   <el-input
                     class="mininput"
-                    v-model.trim="promotion.minimumMoney"
+                    v-model.trim="promotion.requireValue"
                     :disabled="edit"
                   />
                 </div>
@@ -229,7 +200,7 @@
                     </el-button>
                     <div class="skucon">
                       <span
-                        v-for="(item, i) in ProductList"
+                        v-for="(item, i) in getTagList"
                         :class="productKeys.includes(item) ? 'active' : ''"
                         :key="i"
                         >{{ item }},</span
@@ -237,111 +208,145 @@
                     </div>
                   </div>
                 </div>
-              </el-form-item>
+              </el-form-item> -->
+              <!--折扣额-->
               <el-form-item
                 :label="$t('label.discountPromotion') + ':'"
                 prop="discount"
                 class="discount"
               >
-                <el-radio-group v-model="promotion.discount" :disabled="edit">
+                <el-radio-group v-model="promotion.valueType" :disabled="edit">
                   <div class="item row">
-                    <el-radio label="1">{{ $t("label.percentage") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.percentage") }}</el-radio>
                     <el-input
-                      v-show="promotion.discount === '1'"
+                      v-if="promotion.valueType === 1"
                       class="mininput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.discountNumber"
                       :disabled="edit"
-                    />
+                    >
+                      <span class="el-input__icon" slot="suffix">%</span>
+                    </el-input>
                   </div>
                   <div class="item row">
-                    <el-radio label="2">{{
+                    <el-radio :label="2">{{
                       $t("label.discountPerItem")
                     }}</el-radio>
                     <el-input
-                      v-show="promotion.discount === '2'"
+                      v-if="promotion.valueType === 2"
                       class="mininput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.numericValue"
                       :disabled="edit"
                     />
                   </div>
-                  <el-radio label="3">{{ $t("label.free") }}</el-radio>
+                  <el-radio :label="3">{{ $t("label.free") }}</el-radio>
                 </el-radio-group>
               </el-form-item>
-            </div> -->
-            <!-- 每个订单使用次数 -->
-            <!-- <div class="title">
-              <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
             </div>
-            <div class="info">
-              <el-form-item>
-                <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.maxNumberOfTimesUsedPerOrder")
-                  }}</el-checkbox>
-                  <el-input
-                    class="mininput checkboxinput"
-                    v-model.trim="promotion.number"
-                    :disabled="edit"
-                  />
-                </div>
-              </el-form-item>
+            <!-- 每个订单使用次数 折扣码才有-->
+            <!-- <div v-if="promotion.discountMethod === 1">
+              <div class="title">
+                <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
+              </div>
+              <div class="info">
+                <el-form-item>
+                  <div class="item row">
+                    <el-checkbox v-model="usageLimitchecked" :disabled="edit">{{
+                      $t("label.maxNumberOfTimesUsedPerOrder")
+                    }}</el-checkbox>
+                    <el-input
+                      class="mininput checkboxinput"
+                      v-model.trim="promotion.customerGetOrderUsageLimit"
+                      :disabled="edit"
+                    />
+                  </div>
+                </el-form-item>
+              </div>
             </div> -->
           </div>
           <!-- 客户资格  折扣码才有-->
-          <div class="box" v-if="promotion.type === '1'">
+          <div class="box" v-if="promotion.discountMethod === 1">
             <div class="title">
               <span>{{ $t("label.customerQualification") }}</span>
             </div>
-            <div class="info">
+            <div class="info customerQualification">
               <el-form-item prop="customerQualification" required>
                 <el-radio-group
                   class="customerqualification"
-                  v-model="promotion.customerQualification"
+                  v-model="promotion.targetCustomerType"
                   :disabled="edit"
                 >
-                  <el-radio
+                  <el-radio :label="1">{{
+                    $t("label.customerQualificationList")[0].label
+                  }}</el-radio>
+                  <div class="item row">
+                    <el-radio :label="2">{{
+                      $t("label.customerQualificationList")[1].label
+                    }}</el-radio>
+                    <el-input
+                      v-if="promotion.targetCustomerType === 2"
+                      class="mininput"
+                      v-model.trim="promotion.targetCustomer"
+                      :disabled="edit"
+                    />
+                  </div>
+                  <div class="item row">
+                    <el-radio :label="3">{{
+                      $t("label.customerQualificationList")[2].label
+                    }}</el-radio>
+                    <el-input
+                      v-if="promotion.targetCustomerType === 3"
+                      class="mininput"
+                      v-model.trim="promotion.targetCustomer"
+                      :disabled="edit"
+                    />
+                  </div>
+                  <!-- <el-radio
                     v-for="(item, i) in $t('label.customerQualificationList')"
                     :key="i"
                     :label="item.value"
                     >{{ item.label }}</el-radio
-                  >
+                  > -->
                 </el-radio-group>
               </el-form-item>
             </div>
           </div>
           <!-- 最大折扣使用次数  折扣码才有-->
-          <div class="box" v-if="promotion.type === '1'">
+          <div class="box" v-if="promotion.discountMethod === 1">
             <div class="title">
               <span>{{ $t("label.maximumNumberOfDiscounts") }}</span>
             </div>
             <div class="info">
-              <!-- 指定商品标签 -->
               <el-form-item>
+                <!-- <el-checkbox-group v-model="promotion.startTime"> -->
                 <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.limitDiscountCount")
-                  }}</el-checkbox>
+                  <el-checkbox
+                    :checked="codeUsageLimitchecked"
+                    :disabled="edit"
+                    >{{ $t("label.limitDiscountCount") }}</el-checkbox
+                  >
                   <el-input
                     class="mininput checkboxinput"
-                    v-model.trim="promotion.number"
+                    v-model.trim="promotion.codeUsageLimit"
                     :disabled="edit"
                   />
                 </div>
                 <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.customerCount")
-                  }}</el-checkbox>
+                  <el-checkbox
+                    :checked="promotion.codeCustomerUsageType === 1"
+                    :disabled="edit"
+                    >{{ $t("label.customerCount") }}</el-checkbox
+                  >
                 </div>
+                <!-- </el-checkbox-group> -->
               </el-form-item>
             </div>
           </div>
           <!-- 组合 自动折扣才有 -->
-          <div class="box" v-if="promotion.type === '2'">
+          <div class="box">
             <div class="title">
               <span>{{ $t("label.combination") }}</span>
             </div>
             <div class="info">
-              <!-- 指定商品标签 -->
               <el-form-item :label="$t('label.combinationLable') + ':'">
                 <el-checkbox-group v-model="promotion.combination">
                   <el-checkbox
@@ -367,9 +372,9 @@
           >{{ $t("view.cancel") }}
         </el-button>
         <!-- 未审核时/审核驳回 状态可进行提交 -->
-        <el-button type="primary" @click="handleSaveOrUpdate" :disabled="edit"
+        <!-- <el-button type="primary" @click="handleSaveOrUpdate" :disabled="edit"
           >{{ $t("view.confirm") }}
-        </el-button>
+        </el-button> -->
       </template>
     </el-dialog>
     <product-collection ref="productCollectionRef" />
@@ -377,22 +382,25 @@
 </template>
 <script>
 import waves from "@/directive/waves"; // 水波纹指令
-import { getById, save, storeList, update } from "@/api/oms/order/promotion";
+import { fetchDetailByIdAndVersion } from "@/api/oms/order/multiBuyDiscount";
 import i18n from "@/lang";
-import productCollection from "@/views/oms/promotion/amountOffOrder/components/productCollectionDetail";
+import { isEmpty } from "@/utils/toolUtil";
+import productCollection from "@/views/oms/promotion/buyXGetYDiscount/components/productCollectionDetail";
 
 export default {
   inject: ["reload"],
   directives: {
     waves
   },
-  name: "multiBuyDiscountForm",
+  name: "buyXgetYbuyDiscountForm",
   components: {
     productCollection
   },
   computed: {
-    checked() {
-      return !!this.promotion.number;
+    discountContentValue() {
+      return this.promotion.purchaseRequire === 2
+        ? i18n.t("label.money")
+        : i18n.t("label.numberStr");
     }
   },
   data() {
@@ -401,93 +409,47 @@ export default {
       title: "",
       productSku: "",
       productKeys: [],
-      ProductList: [
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B"
-      ],
+      usageLimitchecked: false,
+      codeUsageLimitchecked: false,
+      tagLists: [],
+      getTagList: [],
       promotion: {
         // 配置基本信息
         id: "",
-        promotionName: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        type: 1,
-        promotionStatus: "",
-        priority: "",
-        participateType: "",
-        conditionType: "",
-        stackableType: [],
-        minimum: "1",
-        discountValue: "1",
+        title: "",
+        startTime: "",
+        endTime: "",
+        discountMethod: null,
+        discountNumber: null,
+        purchaseRequire: null,
         purchaseType: "",
         productType: "",
+        productBuyType: "",
         discount: "",
-        number: 1,
-        combination: [],
-        minimumPurchaseRequirement: "1",
-        oncePerOrder: 1
+        combination: []
       },
       edit: true,
-      storeList: [],
       noDataText: "加载中",
       pageLoad: false,
-      conditionTypeArr: i18n.t("label.conditionTypeArr").map(item => {
-        return {
-          ...item,
-          disabled: false
-        };
-      })
+      isEmpty
     };
   },
   methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
+    tagValue(data) {
+      return (
+        data.title +
+        i18n.t("label.productCollection") +
+        i18n.t("label.all") +
+        data.spus.length +
+        i18n.t("label.itemProduct")
+      );
     },
-    async showDialog(id, edit) {
-      this.edit = !edit;
-      await this.getStoreList();
+    async showDialog(id, edit, version) {
+      this.edit = edit;
       if (id) {
         // 修改配置
         this.promotion.id = id;
+        this.promotion.version = version;
         await this.getPromotionInfo();
         this.title = this.edit
           ? i18n.t("label.mutiPromotionDetailTitle")
@@ -495,94 +457,156 @@ export default {
       } else {
         this.title = i18n.t("label.mutiPromotionCreateTitle");
       }
+      let str = this.promotion.id ? "Detail" : "";
+      this.discountSettingTitle = i18n.t("label.discountSetting" + str);
+      this.productRangeTitle = i18n.t("label.setProductRange" + str);
       this.promotionFormVisible = true;
     },
     // 款号搜索
     handleProductSearch() {
       this.productKeys = this.productSku.split(",");
     },
-    handleProductDialog(id) {
-      this.$refs.productCollectionRef.showDialog(id);
+    handleProductDialog(data) {
+      this.$refs.productCollectionRef.showDialog(data);
     },
     resetData() {
       this.promotion = {
         id: "",
-        promotionName: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        type: 1,
-        promotionStatus: "",
-        rejectCause: "",
-        priority: "",
-        participateType: "",
-        conditionType: "",
-        stackableType: [],
-        minimum: "1"
+        title: "",
+        startTime: "",
+        endTime: "",
+        discountMethod: null,
+        discountNumber: null,
+        purchaseRequire: null,
+        purchaseType: "",
+        productType: "",
+        productBuyType: "",
+        discount: "",
+        combination: []
       };
     },
     handleOpenDialog() {
       this.resetData();
-      if (this.$refs.promotionFormRef) {
-        this.$refs.promotionFormRef.clearValidate();
+      if (this.$refs.promotionBuyXgetYDertailFormRef) {
+        this.$refs.promotionBuyXgetYDertailFormRef.clearValidate();
       }
     },
     getPromotionInfo() {
       this.pageLoad = true;
-      getById(this.promotion.id).then(res => {
-        // 促销配置信息
-        this.promotion = res.data;
-        this.pageLoad = false;
-      });
-    },
-    handleSaveOrUpdate() {
-      //创建商品
-      this.$refs["promotionFormRef"].validate(valid => {
-        //通用属性验证成功
-        if (valid) {
-          // 如果需要在促销类型买就送的情况下将条件类型和条件值改为 "0" 则可在此修改 暂时默认为空字符
-          const data = {
-            ...this.promotion
-          };
-          if (!data.id) {
-            save(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
+      let { id, version } = this.promotion;
+      fetchDetailByIdAndVersion({ id, version })
+        .then(res => {
+          // 促销配置信息
+          const { priceRule, productTags, giveProductCollects } = res.data;
+          this.promotion = { ...priceRule, productTags };
+          if (priceRule.valueType === 1) {
+            let number = priceRule.numericValue * 100;
+            // this.promotion.discountNumber = number;
+            this.$set(this.promotion, "discountNumber", number);
+          }
+          if (priceRule.purchaseRequire === 3) {
+            // this.promotion.quantity = priceRule.requireValue;
+            this.$set(this.promotion, "quantity", priceRule.requireValue);
+          } else if (priceRule.purchaseRequire === 2) {
+            // this.promotion.miniAmount = priceRule.requireValue;
+            this.$set(this.promotion, "miniAmount", priceRule.requireValue);
+          }
+          // 购买类型
+          const targetType = i18n
+            .t("label.promotionBuyTyper")
+            .find(item => item.value === priceRule.targetType);
+          if (targetType && targetType.label) {
+            this.$set(this.promotion, "purchaseType", targetType.label);
+          }
+          // 顾客购买商品类型
+          const productBuyType = i18n
+            .t("label.promotionCustomerGetType")
+            .find(item => item.value === priceRule.targetSelectionType);
+          if (productBuyType && productBuyType.label) {
+            this.$set(this.promotion, "productBuyType", productBuyType.label);
+          }
+          // 顾客得到商品类型
+          const productType = i18n
+            .t("label.promotionCustomerGetType")
+            .find(item => item.value === priceRule.customerGetType);
+          if (productType && productType.label) {
+            this.$set(this.promotion, "productType", productType.label);
+          }
+          // 组合
+          const {
+            combineWithOrder,
+            combineWithProduct,
+            combineWithShipping,
+            targetShopifyProductSpu,
+            targetShopifySku,
+            targetSelectionType,
+            customerGetType,
+            getTargetShopifyProductSpu,
+            getTargetShopifySku,
+            customerGetOrderUsageLimit,
+            codeUsageLimit
+          } = priceRule;
+          let combinationArr = [];
+          if (combineWithOrder) {
+            combinationArr.push(i18n.t("label.combinationList")[1].value);
+          }
+          if (combineWithProduct) {
+            combinationArr.push(i18n.t("label.combinationList")[0].value);
+          }
+          if (combineWithShipping) {
+            combinationArr.push(i18n.t("label.combinationList")[2].value);
+          }
+          this.usageLimitchecked = !!customerGetOrderUsageLimit;
+          this.codeUsageLimitchecked = !!codeUsageLimit;
+          this.$set(this.promotion, "combination", combinationArr);
+          // 折扣适用  1特定系列  其他2,3 特定商品
+          let tagLists = [];
+          if (targetSelectionType === 1) {
+            tagLists = productTags.map(item => {
+              let data = [];
+              if (item.spu) {
+                data = item.spu.split(",");
               }
+              item.spus = data;
+              return item;
             });
           } else {
-            update(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
+            // 特地商品
+            if (targetShopifySku) {
+              const spusSKU = targetShopifySku.split(",");
+              tagLists.push({ title: "", spus: spusSKU });
+            }
+            if (targetShopifyProductSpu) {
+              const spusId = targetShopifyProductSpu.split(",");
+              tagLists.push({ title: "", spus: spusId });
+            }
+          }
+          this.tagLists = tagLists;
+          // 折扣得到条件   1 特定系列  2 特定商品
+          let getTagList = [];
+          if (customerGetType === 1) {
+            giveProductCollects.forEach(item => {
+              if (item.spu) {
+                const arr = item.spu.split(",");
+                getTagList.push.apply(getTagList, arr);
               }
             });
+          } else {
+            // 特地商品
+            if (getTargetShopifySku) {
+              const skus = getTargetShopifySku.split(",");
+              getTagList.push.apply(getTagList, skus);
+            }
+            if (getTargetShopifyProductSpu) {
+              const spus = getTargetShopifyProductSpu.split(",");
+              getTagList.push.apply(getTagList, spus);
+            }
           }
-        }
-      });
-    },
-    handleChangeParticipateType(e) {
-      this.conditionTypeArr.forEach(item => {
-        item.disabled = false;
-      });
-      this.promotion.conditionType = "";
-      this.promotion.conditionValue = "";
-      if (e === "gift_money" || e === "gift_qty") {
-        this.conditionTypeArr[2].disabled = true;
-      } else if (e === "gift_consumer") {
-        // gift_consumer
-        this.conditionTypeArr[0].disabled = true;
-        this.conditionTypeArr[1].disabled = true;
-        this.promotion.conditionType = this.conditionTypeArr[2].value;
-      }
+          this.getTagList = getTagList;
+        })
+        .finally(() => {
+          this.pageLoad = false;
+        });
     }
   }
 };
@@ -687,11 +711,6 @@ export default {
     border-bottom: none;
   }
   .info {
-    &.info-mini {
-      .item {
-        margin-top: 20px;
-      }
-    }
     .item {
       display: flex;
       flex-direction: row;
@@ -708,7 +727,7 @@ export default {
       }
       .mininput {
         margin-right: 30px;
-        width: 142px !important;
+        width: 180px !important;
       }
       .checkboxinput {
         margin-left: 20px;
@@ -720,11 +739,21 @@ export default {
         margin-right: 12px;
       }
       &.product {
+        margin-top: 26px;
+        .label {
+          margin-bottom: 10px;
+        }
         .mininput {
           margin-right: 20px;
+          margin-bottom: 10px;
+        }
+        .row {
+          flex-wrap: wrap;
         }
         .collectioninput {
           margin-right: 20px;
+          min-width: 220px !important;
+          width: auto !important;
           /deep/.el-input-group__append {
             color: #ae8877;
             border-left: none;
@@ -739,6 +768,9 @@ export default {
             border-right: none;
           }
         }
+        .value {
+          margin-bottom: 10px;
+        }
       }
     }
     .discount {
@@ -756,5 +788,35 @@ export default {
       }
     }
   }
+  .value {
+    position: relative;
+    min-width: 300px;
+    height: 36px;
+    padding: 0px 6px;
+    font-size: 12px;
+    margin-right: 13px;
+    color: #c0c4cc;
+    background: #f5f7fa;
+    border-radius: 3px;
+    border: 1px solid #dcdfe6;
+    p {
+      line-height: 12px;
+      padding-right: 130px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+    a {
+      position: absolute;
+      right: 10px;
+      top: 0%;
+      color: #ae8877;
+    }
+  }
+  .customerQualification {
+    .mininput {
+      margin-bottom: 30px;
+    }
+  }
 }
 </style>

+ 0 - 91
src/views/oms/promotion/amountOffOrder/promotionLogList.vue

@@ -1,91 +0,0 @@
-<template>
-  <div>
-    <el-dialog append-to-body width="355px" :visible.sync="dialogFormVisible">
-      <div class="box">
-        <p>
-          <a href="javascript:void(0)" @click="handleDetail"> 查看版本V2</a>
-          更新时间 2025-01-24
-        </p>
-      </div>
-      <template slot="footer">
-        <el-button @click="dialogFormVisible = false"
-          >{{ $t("tagsView.close") }}
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import waves from "@/directive/waves"; // 水波纹指令
-import ElContainer from "element-ui/packages/container/src/main";
-import { promotionLogs } from "@/api/oms/order/promotion";
-
-export default {
-  inject: ["reload"], //刷新
-  components: {
-    ElContainer
-  },
-  name: "promotionLogList",
-  directives: {
-    waves
-  },
-  data() {
-    return {
-      dialogFormVisible: false,
-      list: [],
-      listLoading: false,
-      listQuery: {}
-    };
-  },
-  created() {},
-  computed: {},
-  methods: {
-    handleOpen(id) {
-      this.listQuery.promotionId = id;
-      this.dialogFormVisible = true;
-      this.retPage();
-    },
-    getList() {
-      this.listLoading = true;
-      promotionLogs(this.listQuery)
-        .then(response => {
-          if (response.code === 200) {
-            this.list = response.data.list;
-            setTimeout(() => {
-              this.listLoading = false;
-            }, 0.5 * 1000);
-          }
-        })
-        .catch(() => {
-          setTimeout(() => {
-            this.listLoading = false;
-          }, 0.5 * 1000);
-        });
-    },
-    handleDetail(t) {
-      let id = this.listQuery.promotionId;
-      this.$emit("show", id);
-    },
-    retPage() {
-      this.getList();
-    }
-  }
-};
-</script>
-
-<style scoped lang="scss">
-.box {
-  max-height: 350px;
-  overflow-y: auto;
-  p {
-    margin-left: 23px;
-    color: #9f9f9f;
-    line-height: 24px;
-    a {
-      color: #ae8877;
-      margin-right: 20px;
-    }
-  }
-}
-</style>

+ 0 - 425
src/views/oms/promotion/amountOffProducts/index copy.vue

@@ -1,425 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-container>
-      <el-main>
-        <div class="filter-container">
-          <el-input
-            :placeholder="$t('label.promotionName')"
-            style="width: 200px;"
-            clearable
-            class="filter-item"
-            v-model="listQuery.promotionName"
-            @keyup.enter.native="retPage"
-          />
-          <el-input
-            :placeholder="$t('label.minimumPurchaseRequirement')"
-            style="width: 200px;"
-            clearable
-            class="filter-item"
-            v-model="listQuery.minimumPurchaseRequirement"
-            @keyup.enter.native="retPage"
-          />
-          <el-select
-            v-model="listQuery.applicationMethod"
-            clearable
-            class="filter-item"
-            style="width: 200px;"
-            :placeholder="$t('label.applicationMethod')"
-            @keyup.enter.native="retPage"
-          >
-            <el-option
-              :key="index"
-              v-for="(item, index) in storeList"
-              :label="item.storeName"
-              :value="item.storeId"
-            />
-          </el-select>
-          <el-button
-            v-waves
-            v-has="'promotion:list'"
-            class="filter-item"
-            type="primary"
-            icon="el-icon-search"
-            @click="retPage"
-            >{{ $t("view.search") }}
-          </el-button>
-        </div>
-        <el-table
-          v-loading="listLoading"
-          :key="tableKey"
-          :data="list"
-          stripe
-          border
-          fit
-          highlight-current-row
-          style="width: 100%;"
-        >
-          <el-table-column type="index" width="40"></el-table-column>
-
-          <el-table-column
-            :label="$t('label.promotionEventName')"
-            width="220"
-            show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionName }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.promotionId')"
-            align="center"
-            width="220"
-            show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionInfo }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.participateType')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{
-                $t("label.participateTypeArr").find(
-                  item => item.value === row.participateType
-                )
-                  ? $t("label.participateTypeArr").find(
-                      item => item.value === row.participateType
-                    ).label
-                  : ""
-              }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.promotionLevel')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.applicationMethod')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.participateNum }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.minimumPurchaseRequirement')"
-            align="center"
-            width="160"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
-          </el-table-column>
-
-          <el-table-column
-            :label="$t('label.discountValue')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{
-                $t("label.conditionTypeArr").find(
-                  item => item.value === row.conditionType
-                )
-                  ? $t("label.conditionTypeArr").find(
-                      item => item.value === row.conditionType
-                    ).label
-                  : ""
-              }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.priority')"
-            align="center"
-            width="120"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.stackableType')"
-            align="center"
-            width="150"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.promotionStartTime')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.promotionEndTime')"
-            align="center"
-            width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionEndTime }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.version')"
-            align="center"
-            width="120"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="$t('label.operation')"
-            min-width="180"
-            align="center"
-            fixed="right"
-          >
-            <template v-slot="{ row }">
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.edit')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:update'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-edit"
-                  circle
-                  @click="showDialog(row.id, false)"
-                >
-                </el-button>
-              </el-tooltip> -->
-
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.details')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:list'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-more"
-                  circle
-                  @click="showDialog(row.id, true)"
-                >
-                </el-button>
-              </el-tooltip>
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.delete')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:delete'"
-                  type="danger"
-                  circle
-                  size="mini"
-                  icon="el-icon-delete"
-                  @click="handleDelete(row.id)"
-                >
-                </el-button>
-              </el-tooltip>
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('label.version')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:status'"
-                  type="primary"
-                  circle
-                  size="mini"
-                  icon="el-icon-notebook-1"
-                  @click="handleLog(row.id)"
-                >
-                </el-button>
-              </el-tooltip>
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('title.operationLog')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotionLog:list'"
-                  type="primary"
-                  circle
-                  size="mini"
-                  icon="el-icon-notebook-1"
-                  @click="handleLog(row.id)"
-                >
-                </el-button>
-              </el-tooltip> -->
-            </template>
-          </el-table-column>
-        </el-table>
-        <!-- 分页 -->
-        <swPage
-          v-if="total > 0"
-          key="2"
-          :listQuery="listQuery"
-          :total="total"
-          pos="btmRight"
-          @retPage="getList"
-        />
-      </el-main>
-    </el-container>
-
-    <promotion-form ref="promotionFormRef" @refresh-table="getList" />
-    <promotion-log-list ref="logListRef" @show="id => showDialog(id, true)" />
-  </div>
-</template>
-
-<script>
-import waves from "@/directive/waves"; // 水波纹指令
-import SwPage from "@/views/common/swPage.vue";
-import ElContainer from "element-ui/packages/container/src/main";
-import PromotionForm from "@/views/oms/promotion/amountOffProducts/promotionForm.vue";
-import PromotionLogList from "@/views/oms/promotion/amountOffProducts/promotionLogList.vue";
-import {
-  fetchList,
-  deleteById,
-  storeList,
-  checkPromotion,
-  changeStatus
-} from "@/api/oms/order/promotion";
-import { getToken } from "@/utils/auth";
-
-export default {
-  inject: ["reload"], //刷新
-  components: {
-    SwPage,
-    ElContainer,
-    PromotionForm,
-    PromotionLogList
-  },
-  name: "multiBuyDiscount",
-  directives: {
-    waves
-  },
-  data() {
-    return {
-      activeName: "productIndex",
-      iconSize: "mini",
-      //右侧列表
-      tableKey: 0,
-      list: null,
-      total: null,
-      listLoading: false,
-      listQuery: {
-        applicationMethod: null,
-        promotionName: null,
-        minimumPurchaseRequirement: null,
-        page: 1,
-        limit: 10
-      },
-      storeList: []
-    };
-  },
-  created() {
-    this.getList();
-    this.getStoreList();
-  },
-  computed: {
-    headers: function() {
-      return { "X-Token": getToken() };
-    }
-  },
-  methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
-    },
-    getList() {
-      this.listLoading = true;
-      fetchList(this.listQuery)
-        .then(response => {
-          if (response.code === 200) {
-            this.list = response.data.list;
-            this.total = response.data.total;
-            setTimeout(() => {
-              this.listLoading = false;
-            }, 0.5 * 1000);
-          }
-        })
-        .catch(() => {
-          setTimeout(() => {
-            this.listLoading = false;
-          }, 0.5 * 1000);
-        });
-    },
-    retPage() {
-      this.listQuery.page = 1;
-      this.getList();
-    },
-    handleDelete(id) {
-      this.$confirm("是否删除该记录?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      }).then(() => {
-        deleteById(id).then(res => {
-          if (res.code === 200) {
-            this.$message({
-              message: "操作成功",
-              type: "success"
-            });
-            this.getList();
-          }
-        });
-      });
-    },
-    showDialog(id, edit) {
-      this.$refs.promotionFormRef.showDialog(id, edit);
-    },
-    handleDetail(id) {
-      console.log(id, "detail");
-    },
-    // changePromotionStatus(id, status) {
-    //   this.$confirm(status ? "是否确认禁用?" : "是否确认启用?", "提示", {
-    //     confirmButtonText: "确定",
-    //     cancelButtonText: "取消",
-    //     type: "warning"
-    //   }).then(() => {
-    //     changeStatus(id).then(res => {
-    //       if (res.code === 200) {
-    //         this.$message({
-    //           message: "操作成功",
-    //           type: "success"
-    //         });
-    //         this.getList();
-    //       }
-    //     });
-    //   });
-    // },
-    handleLog(id) {
-      this.$refs.logListRef.handleOpen(id);
-    }
-  }
-};
-</script>
-
-<style scoped></style>

+ 0 - 22
src/views/oms/promotion/amountOffProducts/index.vue

@@ -306,11 +306,6 @@ export default {
       const obj = i18n.t("label.ruleTypeList").find(item => item.value === val);
       return val && obj ? obj.label : "";
     },
-    // 状态
-    // statusVal(val) {
-    //   const data = i18n.t("label.statusList").find(item => item.value === val);
-    //   return val && data ? data.label : "";
-    // },
     getList() {
       this.listLoading = true;
       fetchList(this.listQuery)
@@ -336,23 +331,6 @@ export default {
     showDialog(id, edit, version) {
       this.$refs.promotionBuyXgetYFormRef.showDialog(id, edit, version);
     },
-    // changePromotionStatus(id, status) {
-    //   this.$confirm(status ? "是否确认禁用?" : "是否确认启用?", "提示", {
-    //     confirmButtonText: "确定",
-    //     cancelButtonText: "取消",
-    //     type: "warning"
-    //   }).then(() => {
-    //     changeStatus(id).then(res => {
-    //       if (res.code === 200) {
-    //         this.$message({
-    //           message: "操作成功",
-    //           type: "success"
-    //         });
-    //         this.getList();
-    //       }
-    //     });
-    //   });
-    // },
     handleLog(id) {
       this.$refs.logListRef.handleOpen(id);
     }

+ 29 - 21
src/views/oms/promotion/amountOffProducts/promotionForm.vue

@@ -152,7 +152,11 @@
                   </div>
                 </div>
               </el-form-item>
-              <el-form-item :label="$t('label.oncePerOrder') + ':'">
+              <!-- 每个订单一次 获得条件为金额才可见 -->
+              <el-form-item
+                v-if="promotion.valueType === 2"
+                :label="$t('label.oncePerOrder') + ':'"
+              >
                 <el-checkbox
                   v-model="promotion.oncePerOrder"
                   :disabled="edit"
@@ -219,7 +223,9 @@
                       class="mininput"
                       v-model.trim="promotion.discountNumber"
                       :disabled="edit"
-                    />
+                    >
+                      <span class="el-input__icon" slot="suffix">%</span>
+                    </el-input>
                   </div>
                   <div class="item row">
                     <el-radio :label="2">{{
@@ -236,24 +242,26 @@
                 </el-radio-group>
               </el-form-item>
             </div>
-            <!-- 每个订单使用次数 自动折扣才有-->
-            <div class="title" v-if="promotion.discountMethod === 2">
-              <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
-            </div>
-            <div class="info">
-              <el-form-item>
-                <div class="item row">
-                  <el-checkbox v-model="usageLimitchecked" :disabled="edit">{{
-                    $t("label.maxNumberOfTimesUsedPerOrder")
-                  }}</el-checkbox>
-                  <el-input
-                    class="mininput checkboxinput"
-                    v-model.trim="promotion.customerGetOrderUsageLimit"
-                    :disabled="edit"
-                  />
-                </div>
-              </el-form-item>
-            </div>
+            <!-- 每个订单使用次数 折扣码才有-->
+            <!-- <div v-if="promotion.discountMethod === 1">
+              <div class="title">
+                <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
+              </div>
+              <div class="info">
+                <el-form-item>
+                  <div class="item row">
+                    <el-checkbox v-model="usageLimitchecked" :disabled="edit">{{
+                      $t("label.maxNumberOfTimesUsedPerOrder")
+                    }}</el-checkbox>
+                    <el-input
+                      class="mininput checkboxinput"
+                      v-model.trim="promotion.customerGetOrderUsageLimit"
+                      :disabled="edit"
+                    />
+                  </div>
+                </el-form-item>
+              </div>
+            </div> -->
           </div>
           <!-- 客户资格  折扣码才有-->
           <div class="box" v-if="promotion.discountMethod === 1">
@@ -334,7 +342,7 @@
             </div>
           </div>
           <!-- 组合 自动折扣才有 -->
-          <div class="box" v-if="promotion.discountMethod === 2">
+          <div class="box">
             <div class="title">
               <span>{{ $t("label.combination") }}</span>
             </div>

+ 3 - 1
src/views/oms/promotion/buyXGetYDiscount/promotionForm.vue

@@ -211,7 +211,9 @@
                       class="mininput"
                       v-model.trim="promotion.discountNumber"
                       :disabled="edit"
-                    />
+                    >
+                      <span class="el-input__icon" slot="suffix">%</span>
+                    </el-input>
                   </div>
                   <div class="item row">
                     <el-radio :label="2">{{

+ 100 - 184
src/views/oms/promotion/freeShipping/index.vue

@@ -8,19 +8,19 @@
             style="width: 200px;"
             clearable
             class="filter-item"
-            v-model="listQuery.promotionName"
+            v-model="listQuery.title"
             @keyup.enter.native="retPage"
           />
           <el-input
             :placeholder="$t('label.minimumPurchaseRequirement')"
-            style="width: 200px;"
+            style="width: 220px;"
             clearable
             class="filter-item"
-            v-model="listQuery.minimumPurchaseRequirement"
+            v-model="listQuery.requireValue"
             @keyup.enter.native="retPage"
           />
           <el-select
-            v-model="listQuery.applicationMethod"
+            v-model="listQuery.discountMethod"
             clearable
             class="filter-item"
             style="width: 200px;"
@@ -29,9 +29,9 @@
           >
             <el-option
               :key="index"
-              v-for="(item, index) in storeList"
-              :label="item.storeName"
-              :value="item.storeId"
+              v-for="(item, index) in $t('label.applicationMethodList')"
+              :label="item.label"
+              :value="item.value"
             />
           </el-select>
           <el-button
@@ -60,36 +60,22 @@
             :label="$t('label.promotionEventName')"
             width="220"
             show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionName }}</span>
-            </template>
-          </el-table-column>
+            prop="title"
+          />
           <el-table-column
             :label="$t('label.promotionId')"
             align="center"
             width="220"
             show-overflow-tooltip
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionInfo }}</span>
-            </template>
-          </el-table-column>
+            prop="id"
+          />
           <el-table-column
             :label="$t('label.participateType')"
             align="center"
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{
-                $t("label.participateTypeArr").find(
-                  item => item.value === row.participateType
-                )
-                  ? $t("label.participateTypeArr").find(
-                      item => item.value === row.participateType
-                    ).label
-                  : ""
-              }}</span>
+              <span>{{ ruleTypeLabel(row.ruleType) }}</span>
             </template>
           </el-table-column>
           <el-table-column
@@ -97,9 +83,7 @@
             align="center"
             width="220"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
+            <span>{{ $t("label.product") }}</span>
           </el-table-column>
           <el-table-column
             :label="$t('label.applicationMethod')"
@@ -107,7 +91,7 @@
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateNum }}</span>
+              <span>{{ applicationMethod(row.discountMethod) }}</span>
             </template>
           </el-table-column>
           <el-table-column
@@ -116,7 +100,7 @@
             width="160"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
+              <span>{{ purchaseRequire(row) }}</span>
             </template>
           </el-table-column>
 
@@ -126,18 +110,10 @@
             width="220"
           >
             <template v-slot="{ row }">
-              <span>{{
-                $t("label.conditionTypeArr").find(
-                  item => item.value === row.conditionType
-                )
-                  ? $t("label.conditionTypeArr").find(
-                      item => item.value === row.conditionType
-                    ).label
-                  : ""
-              }}</span>
+              {{ discountVal(row) }}
             </template>
           </el-table-column>
-          <el-table-column
+          <!-- <el-table-column
             :label="$t('label.priority')"
             align="center"
             width="120"
@@ -145,42 +121,44 @@
             <template v-slot="{ row }">
               <span>{{ row.participateWeight }}</span>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             :label="$t('label.stackableType')"
             align="center"
             width="150"
           >
             <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
+              <span>{{ stackableType(row) }}</span>
             </template>
           </el-table-column>
           <el-table-column
             :label="$t('label.promotionStartTime')"
             align="center"
+            prop="startTime"
             width="220"
-          >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionStartTime }}</span>
-            </template>
-          </el-table-column>
+          />
           <el-table-column
             :label="$t('label.promotionEndTime')"
             align="center"
             width="220"
+            prop="endTime"
+          />
+          <!-- <el-table-column
+            :label="$t('label.status')"
+            align="center"
+            width="120"
+            prop="status"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.promotionEndTime }}</span>
-            </template>
-          </el-table-column>
+            <template v-slot="{ row }">{{ statusVal(row.status) }}</template>
+          </el-table-column> -->
           <el-table-column
             :label="$t('label.version')"
             align="center"
             width="120"
           >
-            <template v-slot="{ row }">
-              <span>{{ row.participateWeight }}</span>
-            </template>
+            <template v-slot="{ row }">{{
+              row.version ? "V" + row.version : ""
+            }}</template>
           </el-table-column>
           <el-table-column
             :label="$t('label.operation')"
@@ -189,55 +167,6 @@
             fixed="right"
           >
             <template v-slot="{ row }">
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.edit')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:update'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-edit"
-                  circle
-                  @click="showDialog(row.id, false)"
-                >
-                </el-button>
-              </el-tooltip> -->
-
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.details')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:list'"
-                  type="primary"
-                  size="mini"
-                  icon="el-icon-more"
-                  circle
-                  @click="showDialog(row.id, true)"
-                >
-                </el-button>
-              </el-tooltip>
-              <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('view.delete')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotion:delete'"
-                  type="danger"
-                  circle
-                  size="mini"
-                  icon="el-icon-delete"
-                  @click="handleDelete(row.id)"
-                >
-                </el-button>
-              </el-tooltip>
               <el-tooltip
                 class="item"
                 effect="dark"
@@ -245,31 +174,15 @@
                 placement="top-start"
               >
                 <el-button
-                  v-has="'promotion:status'"
+                  v-has="'priceRule:version'"
                   type="primary"
                   circle
                   size="mini"
-                  icon="el-icon-notebook-1"
+                  icon="el-icon-more"
                   @click="handleLog(row.id)"
                 >
                 </el-button>
               </el-tooltip>
-              <!-- <el-tooltip
-                class="item"
-                effect="dark"
-                :content="$t('title.operationLog')"
-                placement="top-start"
-              >
-                <el-button
-                  v-has="'promotionLog:list'"
-                  type="primary"
-                  circle
-                  size="mini"
-                  icon="el-icon-notebook-1"
-                  @click="handleLog(row.id)"
-                >
-                </el-button>
-              </el-tooltip> -->
             </template>
           </el-table-column>
         </el-table>
@@ -285,8 +198,11 @@
       </el-main>
     </el-container>
 
-    <promotion-form ref="promotionFormRef" @refresh-table="getList" />
-    <promotion-log-list ref="logListRef" @show="id => showDialog(id, true)" />
+    <promotion-form ref="promotionBuyXgetYFormRef" @refresh-table="getList" />
+    <promotion-log-list
+      ref="logListRef"
+      @show="({ id, version }) => showDialog(id, true, version)"
+    />
   </div>
 </template>
 
@@ -294,16 +210,11 @@
 import waves from "@/directive/waves"; // 水波纹指令
 import SwPage from "@/views/common/swPage.vue";
 import ElContainer from "element-ui/packages/container/src/main";
-import PromotionForm from "@/views/oms/promotion/freeShipping/promotionForm.vue";
-import PromotionLogList from "@/views/oms/promotion/freeShipping/promotionLogList.vue";
-import {
-  fetchList,
-  deleteById,
-  storeList,
-  checkPromotion,
-  changeStatus
-} from "@/api/oms/order/promotion";
+import PromotionForm from "@/views/oms/promotion/amountOffOrder/promotionForm.vue";
+import PromotionLogList from "@/views/oms/promotion/multiBuyDiscount/promotionLogList.vue";
+import { fetchList } from "@/api/oms/order/multiBuyDiscount";
 import { getToken } from "@/utils/auth";
+import i18n from "@/lang";
 
 export default {
   inject: ["reload"], //刷新
@@ -313,7 +224,7 @@ export default {
     PromotionForm,
     PromotionLogList
   },
-  name: "multiBuyDiscount",
+  name: "buyXgetYDiscount",
   directives: {
     waves
   },
@@ -327,18 +238,18 @@ export default {
       total: null,
       listLoading: false,
       listQuery: {
-        applicationMethod: null,
-        promotionName: null,
-        minimumPurchaseRequirement: null,
+        discountMethod: null,
+        title: null,
+        requireValue: null,
         page: 1,
-        limit: 10
+        limit: 10,
+        ruleType: 4 //折扣类型 1 产品降价 2 订单降价 3 买X得Y 4免运费 5 多件多扣'
       },
       storeList: []
     };
   },
   created() {
     this.getList();
-    this.getStoreList();
   },
   computed: {
     headers: function() {
@@ -346,12 +257,54 @@ export default {
     }
   },
   methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
+    // 可叠加类型
+    stackableType(row) {
+      const { combineWithOrder, combineWithProduct, combineWithShipping } = row;
+      let arr = [];
+      if (combineWithOrder) {
+        arr.push(i18n.t("label.combinationList")[1].label);
+      }
+      if (combineWithProduct) {
+        arr.push(i18n.t("label.combinationList")[0].label);
+      }
+      if (combineWithShipping) {
+        arr.push(i18n.t("label.combinationList")[2].label);
+      }
+      return arr.join(",");
+    },
+    // 折扣类型
+    applicationMethod(val) {
+      const data = i18n
+        .t("label.applicationMethodList")
+        .find(item => item.value === val);
+      return val && data ? data.label : "";
+    },
+    // 最低购买条件
+    purchaseRequire(row) {
+      let { purchaseRequire, requireValue } = row;
+      if (purchaseRequire === 2) {
+        return "$ " + requireValue;
+      } else if (purchaseRequire === 3) {
+        return requireValue + " " + i18n.t("label.item");
+      } else {
+        return i18n.t("label.noRequirement");
+      }
+    },
+    // 折扣内容
+    discountVal(row) {
+      let { valueType, numericValue } = row;
+      if (valueType === 1) {
+        return numericValue * 100 + "% off";
+      } else if (valueType === 2) {
+        return numericValue;
+      } else {
+        return i18n.t("label.free");
+      }
+    },
+    // 折扣类型
+    ruleTypeLabel(val) {
+      const obj = i18n.t("label.ruleTypeList").find(item => item.value === val);
+      return val && obj ? obj.label : "";
     },
     getList() {
       this.listLoading = true;
@@ -375,46 +328,9 @@ export default {
       this.listQuery.page = 1;
       this.getList();
     },
-    handleDelete(id) {
-      this.$confirm("是否删除该记录?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning"
-      }).then(() => {
-        deleteById(id).then(res => {
-          if (res.code === 200) {
-            this.$message({
-              message: "操作成功",
-              type: "success"
-            });
-            this.getList();
-          }
-        });
-      });
-    },
-    showDialog(id, edit) {
-      this.$refs.promotionFormRef.showDialog(id, edit);
-    },
-    handleDetail(id) {
-      console.log(id, "detail");
+    showDialog(id, edit, version) {
+      this.$refs.promotionBuyXgetYFormRef.showDialog(id, edit, version);
     },
-    // changePromotionStatus(id, status) {
-    //   this.$confirm(status ? "是否确认禁用?" : "是否确认启用?", "提示", {
-    //     confirmButtonText: "确定",
-    //     cancelButtonText: "取消",
-    //     type: "warning"
-    //   }).then(() => {
-    //     changeStatus(id).then(res => {
-    //       if (res.code === 200) {
-    //         this.$message({
-    //           message: "操作成功",
-    //           type: "success"
-    //         });
-    //         this.getList();
-    //       }
-    //     });
-    //   });
-    // },
     handleLog(id) {
       this.$refs.logListRef.handleOpen(id);
     }

+ 0 - 556
src/views/oms/promotion/freeShipping/promotionForm copy.vue

@@ -1,556 +0,0 @@
-<template>
-  <el-dialog
-    v-loading="pageLoad"
-    element-loading-text="loading..."
-    :title="title"
-    top="0"
-    width="100%"
-    lock-scroll
-    custom-class="promotionform"
-    :close-on-click-modal="false"
-    :visible.sync="promotionFormVisible"
-    @open="handleOpenDialog"
-    @close="resetData"
-  >
-    <div class="dialog-body">
-      <el-form
-        ref="promotionFormRef"
-        :rules="baseRule"
-        :model="promotion"
-        label-width="auto"
-        size="medium"
-      >
-        <!-- 设置活动基本信息 -->
-        <div class="box">
-          <div class="title">
-            <span>{{ $t("label.setBasicEventInformation") }}</span>
-          </div>
-          <div class="info">
-            <!--促销名称-->
-            <el-form-item
-              :label="$t('label.promotionName') + ':'"
-              prop="promotionName"
-              style="width:418px"
-              required
-            >
-              <el-input
-                v-model.trim="promotion.promotionName"
-                :disabled="edit"
-              ></el-input>
-            </el-form-item>
-            <div class="item">
-              <!--促销开始时间-->
-              <el-form-item
-                :label="$t('label.promotionStartTime') + ':'"
-                prop="promotionStartTime"
-                required
-              >
-                <el-date-picker
-                  :disabled="edit"
-                  type="datetime"
-                  placeholder="选择日期"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  v-model="promotion.promotionStartTime"
-                ></el-date-picker>
-              </el-form-item>
-
-              <!--促销失效时间-->
-              <el-form-item
-                :label="$t('label.promotionEndTime') + ':'"
-                prop="promotionEndTime"
-                required
-              >
-                <el-date-picker
-                  :disabled="edit"
-                  type="datetime"
-                  placeholder="选择日期"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  v-model="promotion.promotionEndTime"
-                ></el-date-picker>
-              </el-form-item>
-            </div>
-            <!--应用方式-->
-            <el-form-item
-              :label="$t('label.applicationMethod') + ':'"
-              prop="mutual"
-              required
-            >
-              <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                <div class="item row">
-                  <el-radio :label="true">{{ $t("label.discount") }}</el-radio>
-                  <el-input
-                    class="codeinput"
-                    v-model.trim="promotion.promotionName"
-                    :disabled="edit"
-                  />
-                  <el-radio :label="false">{{
-                    $t("label.autoDiscount")
-                  }}</el-radio>
-                </div>
-              </el-radio-group>
-            </el-form-item>
-          </div>
-        </div>
-        <!-- 折扣设置 -->
-        <div class="box">
-          <div class="title">
-            <span>{{ $t("label.discountSetting") }}</span>
-          </div>
-          <div class="info">
-            <div class="item">
-              <!--最低购买要求-->
-              <el-form-item
-                :label="$t('label.minimumPurchaseRequirement') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <div class="item row">
-                    <el-radio :label="true">{{
-                      $t("label.discount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                    <el-radio :label="false">{{
-                      $t("label.autoDiscount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                  </div>
-                </el-radio-group>
-              </el-form-item>
-
-              <!--促销级别-->
-              <el-form-item
-                :label="$t('label.promotionLevel') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <el-radio :label="true">{{ $t("label.order") }}</el-radio>
-                  <el-radio :label="false">{{ $t("label.product") }}</el-radio>
-                </el-radio-group>
-              </el-form-item>
-            </div>
-            <div class="item">
-              <!--折扣内容-->
-              <el-form-item
-                :label="$t('label.discountValue') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <div class="item row">
-                    <el-radio :label="true">{{
-                      $t("label.discount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                    <el-radio :label="false">{{
-                      $t("label.autoDiscount")
-                    }}</el-radio>
-                    <el-input
-                      class="mininput"
-                      v-model.trim="promotion.promotionName"
-                      :disabled="edit"
-                    />
-                  </div>
-                </el-radio-group>
-              </el-form-item>
-
-              <!--促销级别-->
-              <el-form-item
-                :label="$t('label.priority') + ':'"
-                prop="mutual"
-                required
-              >
-                <el-radio-group v-model="promotion.mutual" :disabled="edit">
-                  <el-radio
-                    v-for="(item, i) in $t('label.priorityValue')"
-                    :key="i"
-                    :label="item.value"
-                    >{{ item.label }}</el-radio
-                  >
-                </el-radio-group>
-              </el-form-item>
-            </div>
-            <!--可叠加类型-->
-            <el-form-item
-              :label="$t('label.stackableTypes') + ':'"
-              prop="stackableType"
-              required
-            >
-              <el-checkbox-group
-                v-model="promotion.stackableType"
-                :disabled="edit"
-              >
-                <el-checkbox
-                  v-for="(item, i) in $t('label.stackableTypesValue')"
-                  :key="i"
-                  :label="item.value"
-                  >{{ item.label }}</el-checkbox
-                >
-              </el-checkbox-group>
-            </el-form-item>
-          </div>
-        </div>
-
-        <!-- 设置商品范围 -->
-        <div class="box productbox">
-          <div class="title">
-            <span>{{ $t("label.setProductRange") }}</span>
-          </div>
-          <div class="info">
-            <!-- 指定商品标签 -->
-            <el-form-item
-              :label="$t('label.product') + ':'"
-              prop="participateType"
-              required
-            >
-              <el-select
-                multiple
-                v-model="promotion.participateType"
-                @change="handleChangeParticipateType"
-                :disabled="edit"
-              >
-                <el-option
-                  :key="index"
-                  v-for="(item, index) in $t('label.participateTypeArr')"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-            <el-form-item
-              :label="$t('label.specifyProductTag') + ':'"
-              prop="mutual"
-            >
-              <el-input
-                class="mininput"
-                v-model.trim="promotion.promotionName"
-                :disabled="edit"
-              />
-              <div class="skucon">
-                121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,
-                121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,121J0B04B,124C2B014,132J0B06V,124C2B014,132J0B06V,121J0B04B,124C2B
-              </div>
-            </el-form-item>
-          </div>
-        </div>
-      </el-form>
-    </div>
-
-    <template slot="footer">
-      <el-button
-        @click="
-          resetData();
-          promotionFormVisible = false;
-        "
-        >{{ $t("view.cancel") }}
-      </el-button>
-      <!-- 未审核时/审核驳回 状态可进行提交 -->
-      <el-button
-        type="primary"
-        @click="handleSaveOrUpdate"
-        v-if="promotion.promotionStatus !== 1"
-        :disabled="edit"
-        >{{ $t("view.confirm") }}
-      </el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-import waves from "@/directive/waves"; // 水波纹指令
-import { getById, save, storeList, update } from "@/api/oms/order/promotion";
-import i18n from "@/lang";
-import promotion from "@/views/oms/promotion/multiBuyDiscount/index.vue";
-
-export default {
-  inject: ["reload"],
-  directives: {
-    waves
-  },
-  components: {},
-  computed: {},
-  name: "multiBuyDiscountForm",
-  filters: {},
-  data() {
-    return {
-      promotionFormVisible: false,
-      title: "",
-      promotion: {
-        // 配置基本信息
-        id: "",
-        promotionName: "",
-        stackableType: [],
-        promotionInfo: "",
-        promotionStore: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        promotionStatus: "",
-        rejectCause: "",
-        participateNum: 1,
-        mutual: "",
-        isSuperposition: "",
-        participateWeight: 0,
-        participateType: "",
-        conditionType: "",
-        conditionValue: "",
-        goodsRelation: "",
-        goodsScope: "",
-        giftRelation: ""
-      },
-      edit: true,
-      storeList: [],
-      noDataText: "加载中",
-      baseRule: {
-        // 促销配置
-        promotionName: [
-          {
-            required: true,
-            message: "请输入促销名称",
-            trigger: ["change", "blur"]
-          },
-          {
-            min: 2,
-            max: 50,
-            message: "长度在 2 到 50 个字符",
-            trigger: ["change", "blur"]
-          }
-        ]
-      },
-      pageLoad: false,
-      conditionTypeArr: i18n.t("label.conditionTypeArr").map(item => {
-        return {
-          ...item,
-          disabled: false
-        };
-      })
-    };
-  },
-  mounted() {},
-  methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
-    },
-    async showDialog(id, edit) {
-      this.edit = !edit;
-      await this.getStoreList();
-      if (id) {
-        // 修改配置
-        this.promotion.id = id;
-        await this.getPromotionInfo();
-      }
-      this.title = id
-        ? i18n.t("title.updateTitle")
-        : i18n.t("title.createTitle");
-      this.promotionFormVisible = true;
-    },
-    resetData() {
-      this.promotion = {
-        id: "",
-        promotionName: "",
-        promotionInfo: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        promotionStatus: "",
-        rejectCause: "",
-        participateNum: "",
-        mutual: "",
-        participateWeight: "",
-        participateType: "",
-        conditionType: "",
-        conditionValue: "",
-        goodsRelation: "",
-        goodsScope: "",
-        giftRelation: "",
-        stackableType: []
-      };
-    },
-    handleOpenDialog() {
-      this.resetData();
-      if (this.$refs.promotionFormRef) {
-        this.$refs.promotionFormRef.clearValidate();
-      }
-    },
-    getPromotionInfo() {
-      this.pageLoad = true;
-      getById(this.promotion.id).then(res => {
-        // 促销配置信息
-        this.promotion = res.data;
-        this.pageLoad = false;
-      });
-    },
-    handleSaveOrUpdate() {
-      //创建商品
-      this.$refs["promotionFormRef"].validate(valid => {
-        //通用属性验证成功
-        if (valid) {
-          // 如果需要在促销类型买就送的情况下将条件类型和条件值改为 "0" 则可在此修改 暂时默认为空字符
-          const data = {
-            ...this.promotion
-          };
-          if (!data.id) {
-            save(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
-              }
-            });
-          } else {
-            update(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
-              }
-            });
-          }
-        }
-      });
-    },
-    handleChangeParticipateType(e) {
-      this.conditionTypeArr.forEach(item => {
-        item.disabled = false;
-      });
-      this.promotion.conditionType = "";
-      this.promotion.conditionValue = "";
-      if (e === "gift_money" || e === "gift_qty") {
-        this.conditionTypeArr[2].disabled = true;
-      } else if (e === "gift_consumer") {
-        // gift_consumer
-        this.conditionTypeArr[0].disabled = true;
-        this.conditionTypeArr[1].disabled = true;
-        this.promotion.conditionType = this.conditionTypeArr[2].value;
-      }
-    }
-  }
-};
-</script>
-<style lang="scss">
-.promotionform {
-  width: 100%;
-  height: 100%;
-  position: fixed;
-  top: 0px;
-  left: 0px;
-  .el-dialog__header {
-    padding: 36px 21px 0px 34px;
-    .el-dialog__title {
-      font-size: 18px;
-      font-weight: bold;
-      color: #ae8877;
-      line-height: 22px;
-    }
-  }
-  .el-form-item__label {
-    font-weight: 400;
-  }
-  .el-dialog__body {
-    padding: 30px 10px 30px 34px;
-  }
-  .el-dialog__headerbtn {
-    top: 14px;
-    right: 14px;
-    font-weight: bold;
-    .el-icon-close {
-      font-weight: bold;
-    }
-  }
-}
-</style>
-<style scoped rel="stylesheet/scss" lang="scss">
-.dialog-body {
-  height: 80vh;
-  overflow: auto;
-  .box {
-    border-bottom: 1px solid #d8d8d8;
-    padding-bottom: 20px;
-    margin-bottom: 42px;
-    .title {
-      color: #606266;
-      font-size: 16px;
-      line-height: 16px;
-      position: relative;
-      font-weight: bold;
-      padding-left: 6px;
-      margin-bottom: 23px;
-      &:before {
-        position: absolute;
-        left: 0px;
-        top: 0px;
-        content: "";
-        display: inline-block;
-        width: 3px;
-        height: 13px;
-        background: #ae8877;
-        border-radius: 0px 0px 0px 0px;
-      }
-    }
-  }
-  // /deep/.el-form-item__label-wrap {
-  //   margin-left: 0px !important;
-  //   .el-form-item__label {
-  //     text-align: right;
-  //   }
-  // }
-  .skucon {
-    width: 90%;
-    height: 139px;
-    overflow-y: auto;
-    border-radius: 3px 3px 3px 3px;
-    border: 1px solid #dcdfe6;
-    margin-top: 12px;
-    padding: 10px;
-    font-size: 12px;
-    line-height: 16px;
-  }
-  .productbox {
-    border-bottom: none;
-  }
-  .info {
-    .item {
-      display: flex;
-      flex-direction: row;
-      flex-wrap: wrap;
-      align-items: center;
-      &.row {
-        flex-wrap: nowrap;
-      }
-      .el-form-item {
-        margin-right: 42px !important;
-      }
-      .codeinput {
-        margin-right: 36px;
-      }
-      .mininput {
-        margin-right: 30px;
-        .el-input__inner {
-          width: 142px;
-        }
-      }
-    }
-  }
-}
-</style>

+ 359 - 338
src/views/oms/promotion/freeShipping/promotionForm.vue

@@ -1,7 +1,6 @@
 <template>
-  <div>
+  <div v-loading="pageLoad">
     <el-dialog
-      v-loading="pageLoad"
       element-loading-text="loading..."
       :title="title"
       top="0"
@@ -13,9 +12,9 @@
       @open="handleOpenDialog"
       @close="resetData"
     >
-      <div class="dialog-body">
+      <div class="dialog-body" v-loading="pageLoad">
         <el-form
-          ref="promotionFormRef"
+          ref="promotionBuyXgetYDertailFormRef"
           :model="promotion"
           label-width="210px"
           size="medium"
@@ -32,7 +31,7 @@
                 prop="promotionName"
               >
                 <el-input
-                  v-model.trim="promotion.promotionName"
+                  v-model.trim="promotion.title"
                   :disabled="edit"
                 ></el-input>
               </el-form-item>
@@ -40,45 +39,49 @@
                 <!--促销开始时间-->
                 <el-form-item
                   :label="$t('label.promotionStartTime') + ':'"
-                  prop="promotionStartTime"
+                  prop="startTime"
                 >
                   <el-date-picker
                     :disabled="edit"
                     type="datetime"
                     placeholder="选择日期"
                     value-format="yyyy-MM-dd HH:mm:ss"
-                    v-model="promotion.promotionStartTime"
+                    v-model="promotion.startTime"
                   ></el-date-picker>
                 </el-form-item>
 
                 <!--促销失效时间-->
                 <el-form-item
                   :label="$t('label.promotionEndTime') + ':'"
-                  prop="promotionEndTime"
+                  prop="endTime"
                 >
                   <el-date-picker
                     :disabled="edit"
                     type="datetime"
                     placeholder="选择日期"
                     value-format="yyyy-MM-dd HH:mm:ss"
-                    v-model="promotion.promotionEndTime"
+                    v-model="promotion.endTime"
                   ></el-date-picker>
                 </el-form-item>
               </div>
               <!--应用方式-->
               <el-form-item
                 :label="$t('label.applicationMethod') + ':'"
-                prop="type"
+                prop="discountMethod"
               >
-                <el-radio-group v-model="promotion.type" :disabled="edit">
+                <el-radio-group
+                  v-model="promotion.discountMethod"
+                  :disabled="edit"
+                >
                   <div class="item row">
-                    <el-radio label="1">{{ $t("label.discount") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.discount") }}</el-radio>
                     <el-input
+                      v-show="promotion.discountMethod === 1"
                       class="codeinput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.discountCode"
                       :disabled="edit"
                     />
-                    <el-radio label="2">{{
+                    <el-radio :label="2">{{
                       $t("label.autoDiscount")
                     }}</el-radio>
                   </div>
@@ -86,152 +89,93 @@
               </el-form-item>
             </div>
           </div>
-          <!-- 国家/地区 -->
-          <div class="box countries">
+          <!-- 折扣设置 -->
+          <div class="box discount">
+            <!-- 客户购买条件 -->
             <div class="title">
-              <span>{{ $t("label.countries") }}</span>
+              <span>{{ $t("label.customerPurchaseConditions") }}</span>
             </div>
-            <div class="info info-countries">
-              <el-form-item :label="$t('label.countries') + ':'">
-                <el-radio-group v-model="promotion.countries" :disabled="edit">
-                  <el-radio label="1">{{ $t("label.allCountries") }}</el-radio>
-
+            <div class="info">
+              <!--最低购买要求-->
+              <el-form-item
+                :label="$t('label.minimumPurchaseRequirement') + ':'"
+                prop="minimum"
+              >
+                <el-radio-group
+                  v-model="promotion.purchaseRequire"
+                  :disabled="edit"
+                >
                   <div class="item row">
-                    <el-radio label="2">{{
-                      $t("label.selectedCountries")
-                    }}</el-radio>
+                    <el-radio :label="3">{{ $t("label.numberStr") }}</el-radio>
+                    <el-radio :label="2">{{ $t("label.money") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.free") }}</el-radio>
+                  </div>
+                </el-radio-group>
+              </el-form-item>
+              <!--折扣内容 数量&金额-->
+              <el-form-item :label="$t('label.discountValue') + ':'">
+                <div class="item">
+                  <!--最低要求 免费 不展示 -->
+                  <div class="item-box" v-if="promotion.purchaseRequire !== 1">
+                    <span class="label">{{ discountContentValue }}</span>
                     <el-input
-                      v-show="promotion.countries === '2'"
                       class="mininput"
-                      v-model.trim="promotion.minimumMoney"
+                      v-model.trim="promotion.requireValue"
                       :disabled="edit"
                     />
                   </div>
-                </el-radio-group>
-                <!-- <div class="item row">
-                  <el-input
-                    class="mininput"
-                    v-model.trim="promotion.minimumMoney"
-                    :disabled="edit"
-                  />
-                </div> -->
-                <!-- <div class="item-box">
+                  <div class="item-box">
                     <span class="label">{{ $t("label.buyType") }}</span>
                     <el-input
                       class="mininput"
                       v-model.trim="promotion.purchaseType"
                       :disabled="edit"
                     />
-                  </div> -->
-              </el-form-item>
-              <el-form-item :label="$t('label.shippingRates') + ':'">
-                <div class="item row">
-                  <el-checkbox
-                    v-model.trim="promotion.minimumMoney"
-                    :disabled="edit"
-                    >{{ $t("label.shippingRatesValue") }}</el-checkbox
-                  >
-                  <el-input
-                    class="mininput"
-                    v-model.trim="promotion.productType"
-                    :disabled="edit"
-                  />
+                  </div>
                 </div>
-              </el-form-item>
-              <!--折扣内容 商品-->
-              <!-- <el-form-item :label="$t('label.product') + ':'">
                 <div class="item product">
-                  <div class="item-box">
+                  <div class="item row">
+                    <span class="label">{{ $t("label.product") }}</span>
                     <el-input
                       class="mininput"
-                      v-model.trim="promotion.productType"
+                      v-model.trim="promotion.productBuyType"
                       :disabled="edit"
                     />
-                    <el-input
-                      class="collectioninput"
-                      v-model.trim="promotion.productCollection"
-                      :disabled="edit"
-                    >
-                      <template slot="append"
-                        ><span
-                          @click="
-                            handleProductDialog(promotion.productCollection)
-                          "
-                          >查看商品明细</span
-                        ></template
-                      >
-                    </el-input>
-                    <el-input
-                      class="collectioninput"
-                      v-model.trim="promotion.productCollection"
-                      :disabled="edit"
-                    >
-                      <template slot="append"
-                        ><span
-                          @click="
-                            handleProductDialog(promotion.productCollection)
-                          "
-                          >查看商品明细</span
-                        ></template
+                    <div class="value" v-for="(data, j) in tagLists" :key="j">
+                      <p>{{ tagValue(data) }}</p>
+                      <a
+                        href="javascript:void();"
+                        @click="handleProductDialog(data)"
+                        >{{ $t("label.viewProductDetaiL") }}</a
                       >
-                    </el-input>
+                    </div>
                   </div>
                 </div>
-              </el-form-item> -->
-            </div>
-            <!-- 最低购买要求 -->
-            <div class="title">
-              <span>{{ $t("label.minimumPurchaseRequirement") }}</span>
-            </div>
-            <div class="info info-mini">
-              <el-form-item
-                :label="$t('label.minimumPurchaseRequirement') + ':'"
-                prop="minimumPurchaseRequirement"
+              </el-form-item>
+              <!-- 每个订单一次 获得条件为金额才可见 -->
+              <!-- <el-form-item
+                v-if="promotion.valueType === 2"
+                :label="$t('label.oncePerOrder') + ':'"
               >
-                <el-radio-group
-                  v-model="promotion.minimumPurchaseRequirement"
+                <el-checkbox
+                  v-model="promotion.oncePerOrder"
                   :disabled="edit"
+                  >{{ $t("label.oncePerOrderDesc") }}</el-checkbox
                 >
-                  <el-radio label="1">{{
-                    $t("label.minimunPurchaseObj.noMinimun")
-                  }}</el-radio>
-
-                  <div class="item row">
-                    <el-radio label="2">{{
-                      $t("label.minimunPurchaseObj.minimunAmount")
-                    }}</el-radio>
-                    <el-input
-                      v-show="promotion.minimumPurchaseRequirement === '2'"
-                      class="mininput"
-                      v-model.trim="promotion.minimumMoney"
-                      :disabled="edit"
-                    />
-                  </div>
-                  <div class="item row">
-                    <el-radio label="3">{{
-                      $t("label.minimunPurchaseObj.minimunQuantity")
-                    }}</el-radio>
-                    <el-input
-                      v-show="promotion.minimumPurchaseRequirement === '3'"
-                      class="mininput"
-                      v-model.trim="promotion.minimumMoney"
-                      :disabled="edit"
-                    />
-                  </div>
-                </el-radio-group>
-              </el-form-item>
+              </el-form-item> -->
             </div>
             <!-- 客户获得条件 -->
-            <!-- <div class="title">
+            <div class="title">
               <span>{{ $t("label.customerGetConditions") }}</span>
             </div>
             <div class="info">
-              <el-form-item :label="$t('label.discountValue') + ':'">
+              <!--折扣内容 数量&金额-->
+              <!-- <el-form-item :label="$t('label.discountValue') + ':'">
                 <div class="item">
                   <span class="label">{{ $t("label.numberStr") }}</span>
                   <el-input
                     class="mininput"
-                    v-model.trim="promotion.minimumMoney"
+                    v-model.trim="promotion.requireValue"
                     :disabled="edit"
                   />
                 </div>
@@ -256,7 +200,7 @@
                     </el-button>
                     <div class="skucon">
                       <span
-                        v-for="(item, i) in ProductList"
+                        v-for="(item, i) in getTagList"
                         :class="productKeys.includes(item) ? 'active' : ''"
                         :key="i"
                         >{{ item }},</span
@@ -264,122 +208,153 @@
                     </div>
                   </div>
                 </div>
-              </el-form-item>
+              </el-form-item> -->
+              <!--折扣额-->
               <el-form-item
                 :label="$t('label.discountPromotion') + ':'"
                 prop="discount"
                 class="discount"
               >
-                <el-radio-group v-model="promotion.discount" :disabled="edit">
+                <el-radio-group v-model="promotion.valueType" :disabled="edit">
                   <div class="item row">
-                    <el-radio label="1">{{ $t("label.percentage") }}</el-radio>
+                    <el-radio :label="1">{{ $t("label.percentage") }}</el-radio>
                     <el-input
-                      v-show="promotion.discount === '1'"
+                      v-if="promotion.valueType === 1"
                       class="mininput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.discountNumber"
                       :disabled="edit"
-                    />
+                    >
+                      <span class="el-input__icon" slot="suffix">%</span>
+                    </el-input>
                   </div>
                   <div class="item row">
-                    <el-radio label="2">{{
+                    <el-radio :label="2">{{
                       $t("label.discountPerItem")
                     }}</el-radio>
                     <el-input
-                      v-show="promotion.discount === '2'"
+                      v-if="promotion.valueType === 2"
                       class="mininput"
-                      v-model.trim="promotion.promotionName"
+                      v-model.trim="promotion.numericValue"
                       :disabled="edit"
                     />
                   </div>
-                  <el-radio label="3">{{ $t("label.free") }}</el-radio>
+                  <el-radio :label="3">{{ $t("label.free") }}</el-radio>
                 </el-radio-group>
               </el-form-item>
-            </div> -->
-            <!-- 每个订单使用次数 -->
-            <!-- <div class="title">
-              <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
             </div>
-            <div class="info">
-              <el-form-item>
-                <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.maxNumberOfTimesUsedPerOrder")
-                  }}</el-checkbox>
-                  <el-input
-                    class="mininput checkboxinput"
-                    v-model.trim="promotion.number"
-                    :disabled="edit"
-                  />
-                </div>
-              </el-form-item>
+            <!-- 每个订单使用次数 折扣码才有-->
+            <!-- <div v-if="promotion.discountMethod === 1">
+              <div class="title">
+                <span>{{ $t("label.numberOfTimesUsedPerOrder") }}</span>
+              </div>
+              <div class="info">
+                <el-form-item>
+                  <div class="item row">
+                    <el-checkbox v-model="usageLimitchecked" :disabled="edit">{{
+                      $t("label.maxNumberOfTimesUsedPerOrder")
+                    }}</el-checkbox>
+                    <el-input
+                      class="mininput checkboxinput"
+                      v-model.trim="promotion.customerGetOrderUsageLimit"
+                      :disabled="edit"
+                    />
+                  </div>
+                </el-form-item>
+              </div>
             </div> -->
           </div>
           <!-- 客户资格  折扣码才有-->
-          <div class="box" v-if="promotion.type === '1'">
+          <div class="box" v-if="promotion.discountMethod === 1">
             <div class="title">
               <span>{{ $t("label.customerQualification") }}</span>
             </div>
-            <div class="info">
+            <div class="info customerQualification">
               <el-form-item prop="customerQualification" required>
                 <el-radio-group
                   class="customerqualification"
-                  v-model="promotion.customerQualification"
+                  v-model="promotion.targetCustomerType"
                   :disabled="edit"
                 >
-                  <el-radio
+                  <el-radio :label="1">{{
+                    $t("label.customerQualificationList")[0].label
+                  }}</el-radio>
+                  <div class="item row">
+                    <el-radio :label="2">{{
+                      $t("label.customerQualificationList")[1].label
+                    }}</el-radio>
+                    <el-input
+                      v-if="promotion.targetCustomerType === 2"
+                      class="mininput"
+                      v-model.trim="promotion.targetCustomer"
+                      :disabled="edit"
+                    />
+                  </div>
+                  <div class="item row">
+                    <el-radio :label="3">{{
+                      $t("label.customerQualificationList")[2].label
+                    }}</el-radio>
+                    <el-input
+                      v-if="promotion.targetCustomerType === 3"
+                      class="mininput"
+                      v-model.trim="promotion.targetCustomer"
+                      :disabled="edit"
+                    />
+                  </div>
+                  <!-- <el-radio
                     v-for="(item, i) in $t('label.customerQualificationList')"
                     :key="i"
                     :label="item.value"
                     >{{ item.label }}</el-radio
-                  >
+                  > -->
                 </el-radio-group>
               </el-form-item>
             </div>
           </div>
           <!-- 最大折扣使用次数  折扣码才有-->
-          <div class="box" v-if="promotion.type === '1'">
+          <div class="box" v-if="promotion.discountMethod === 1">
             <div class="title">
               <span>{{ $t("label.maximumNumberOfDiscounts") }}</span>
             </div>
             <div class="info">
-              <!-- 指定商品标签 -->
               <el-form-item>
+                <!-- <el-checkbox-group v-model="promotion.startTime"> -->
                 <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.limitDiscountCount")
-                  }}</el-checkbox>
+                  <el-checkbox
+                    :checked="codeUsageLimitchecked"
+                    :disabled="edit"
+                    >{{ $t("label.limitDiscountCount") }}</el-checkbox
+                  >
                   <el-input
                     class="mininput checkboxinput"
-                    v-model.trim="promotion.number"
+                    v-model.trim="promotion.codeUsageLimit"
                     :disabled="edit"
                   />
                 </div>
                 <div class="item row">
-                  <el-checkbox v-model="checked" :disabled="edit">{{
-                    $t("label.customerCount")
-                  }}</el-checkbox>
+                  <el-checkbox
+                    :checked="promotion.codeCustomerUsageType === 1"
+                    :disabled="edit"
+                    >{{ $t("label.customerCount") }}</el-checkbox
+                  >
                 </div>
+                <!-- </el-checkbox-group> -->
               </el-form-item>
             </div>
           </div>
           <!-- 组合 自动折扣才有 -->
-          <div class="box" v-if="promotion.type === '2'">
+          <div class="box">
             <div class="title">
               <span>{{ $t("label.combination") }}</span>
             </div>
             <div class="info">
-              <!-- 指定商品标签 -->
               <el-form-item :label="$t('label.combinationLable') + ':'">
                 <el-checkbox-group v-model="promotion.combination">
                   <el-checkbox
-                    :label="$t('label.combinationList')[0].value"
-                    :disabled="edit"
-                    >{{ $t("label.combinationList")[0].label }}
-                  </el-checkbox>
-                  <el-checkbox
-                    :label="$t('label.combinationList')[1].value"
+                    v-for="(item, i) in $t('label.combinationList')"
+                    :key="i"
+                    :label="item.value"
                     :disabled="edit"
-                    >{{ $t("label.combinationList")[1].label }}
+                    >{{ item.label }}
                   </el-checkbox>
                 </el-checkbox-group>
               </el-form-item>
@@ -397,9 +372,9 @@
           >{{ $t("view.cancel") }}
         </el-button>
         <!-- 未审核时/审核驳回 状态可进行提交 -->
-        <el-button type="primary" @click="handleSaveOrUpdate" :disabled="edit"
+        <!-- <el-button type="primary" @click="handleSaveOrUpdate" :disabled="edit"
           >{{ $t("view.confirm") }}
-        </el-button>
+        </el-button> -->
       </template>
     </el-dialog>
     <product-collection ref="productCollectionRef" />
@@ -407,22 +382,25 @@
 </template>
 <script>
 import waves from "@/directive/waves"; // 水波纹指令
-import { getById, save, storeList, update } from "@/api/oms/order/promotion";
+import { fetchDetailByIdAndVersion } from "@/api/oms/order/multiBuyDiscount";
 import i18n from "@/lang";
-import productCollection from "@/views/oms/promotion/freeShipping/components/productCollectionDetail";
+import { isEmpty } from "@/utils/toolUtil";
+import productCollection from "@/views/oms/promotion/buyXGetYDiscount/components/productCollectionDetail";
 
 export default {
   inject: ["reload"],
   directives: {
     waves
   },
-  name: "multiBuyDiscountForm",
+  name: "buyXgetYbuyDiscountForm",
   components: {
     productCollection
   },
   computed: {
-    checked() {
-      return !!this.promotion.number;
+    discountContentValue() {
+      return this.promotion.purchaseRequire === 2
+        ? i18n.t("label.money")
+        : i18n.t("label.numberStr");
     }
   },
   data() {
@@ -431,94 +409,47 @@ export default {
       title: "",
       productSku: "",
       productKeys: [],
-      ProductList: [
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B014",
-        "132J0B06V",
-        "124C2B014",
-        "132J0B06V",
-        "121J0B04B",
-        "124C2B"
-      ],
+      usageLimitchecked: false,
+      codeUsageLimitchecked: false,
+      tagLists: [],
+      getTagList: [],
       promotion: {
         // 配置基本信息
         id: "",
-        promotionName: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        type: 1,
-        promotionStatus: "",
-        priority: "",
-        participateType: "",
-        conditionType: "",
-        stackableType: [],
-        minimum: "1",
-        discountValue: "1",
+        title: "",
+        startTime: "",
+        endTime: "",
+        discountMethod: null,
+        discountNumber: null,
+        purchaseRequire: null,
         purchaseType: "",
         productType: "",
+        productBuyType: "",
         discount: "",
-        number: 1,
-        combination: [],
-        minimumPurchaseRequirement: "1",
-        oncePerOrder: 1,
-        countries: "1"
+        combination: []
       },
       edit: true,
-      storeList: [],
       noDataText: "加载中",
       pageLoad: false,
-      conditionTypeArr: i18n.t("label.conditionTypeArr").map(item => {
-        return {
-          ...item,
-          disabled: false
-        };
-      })
+      isEmpty
     };
   },
   methods: {
-    getStoreList() {
-      storeList().then(res => {
-        if (res.code === 200) {
-          this.storeList = res.data;
-        }
-      });
+    tagValue(data) {
+      return (
+        data.title +
+        i18n.t("label.productCollection") +
+        i18n.t("label.all") +
+        data.spus.length +
+        i18n.t("label.itemProduct")
+      );
     },
-    async showDialog(id, edit) {
-      this.edit = !edit;
-      await this.getStoreList();
+    async showDialog(id, edit, version) {
+      this.edit = edit;
       if (id) {
         // 修改配置
         this.promotion.id = id;
+        this.promotion.version = version;
         await this.getPromotionInfo();
         this.title = this.edit
           ? i18n.t("label.mutiPromotionDetailTitle")
@@ -526,94 +457,156 @@ export default {
       } else {
         this.title = i18n.t("label.mutiPromotionCreateTitle");
       }
+      let str = this.promotion.id ? "Detail" : "";
+      this.discountSettingTitle = i18n.t("label.discountSetting" + str);
+      this.productRangeTitle = i18n.t("label.setProductRange" + str);
       this.promotionFormVisible = true;
     },
     // 款号搜索
     handleProductSearch() {
       this.productKeys = this.productSku.split(",");
     },
-    handleProductDialog(id) {
-      this.$refs.productCollectionRef.showDialog(id);
+    handleProductDialog(data) {
+      this.$refs.productCollectionRef.showDialog(data);
     },
     resetData() {
       this.promotion = {
         id: "",
-        promotionName: "",
-        promotionStartTime: "",
-        promotionEndTime: "",
-        type: 1,
-        promotionStatus: "",
-        rejectCause: "",
-        priority: "",
-        participateType: "",
-        conditionType: "",
-        stackableType: [],
-        minimum: "1"
+        title: "",
+        startTime: "",
+        endTime: "",
+        discountMethod: null,
+        discountNumber: null,
+        purchaseRequire: null,
+        purchaseType: "",
+        productType: "",
+        productBuyType: "",
+        discount: "",
+        combination: []
       };
     },
     handleOpenDialog() {
       this.resetData();
-      if (this.$refs.promotionFormRef) {
-        this.$refs.promotionFormRef.clearValidate();
+      if (this.$refs.promotionBuyXgetYDertailFormRef) {
+        this.$refs.promotionBuyXgetYDertailFormRef.clearValidate();
       }
     },
     getPromotionInfo() {
       this.pageLoad = true;
-      getById(this.promotion.id).then(res => {
-        // 促销配置信息
-        this.promotion = res.data;
-        this.pageLoad = false;
-      });
-    },
-    handleSaveOrUpdate() {
-      //创建商品
-      this.$refs["promotionFormRef"].validate(valid => {
-        //通用属性验证成功
-        if (valid) {
-          // 如果需要在促销类型买就送的情况下将条件类型和条件值改为 "0" 则可在此修改 暂时默认为空字符
-          const data = {
-            ...this.promotion
-          };
-          if (!data.id) {
-            save(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
+      let { id, version } = this.promotion;
+      fetchDetailByIdAndVersion({ id, version })
+        .then(res => {
+          // 促销配置信息
+          const { priceRule, productTags, giveProductCollects } = res.data;
+          this.promotion = { ...priceRule, productTags };
+          if (priceRule.valueType === 1) {
+            let number = priceRule.numericValue * 100;
+            // this.promotion.discountNumber = number;
+            this.$set(this.promotion, "discountNumber", number);
+          }
+          if (priceRule.purchaseRequire === 3) {
+            // this.promotion.quantity = priceRule.requireValue;
+            this.$set(this.promotion, "quantity", priceRule.requireValue);
+          } else if (priceRule.purchaseRequire === 2) {
+            // this.promotion.miniAmount = priceRule.requireValue;
+            this.$set(this.promotion, "miniAmount", priceRule.requireValue);
+          }
+          // 购买类型
+          const targetType = i18n
+            .t("label.promotionBuyTyper")
+            .find(item => item.value === priceRule.targetType);
+          if (targetType && targetType.label) {
+            this.$set(this.promotion, "purchaseType", targetType.label);
+          }
+          // 顾客购买商品类型
+          const productBuyType = i18n
+            .t("label.promotionCustomerGetType")
+            .find(item => item.value === priceRule.targetSelectionType);
+          if (productBuyType && productBuyType.label) {
+            this.$set(this.promotion, "productBuyType", productBuyType.label);
+          }
+          // 顾客得到商品类型
+          const productType = i18n
+            .t("label.promotionCustomerGetType")
+            .find(item => item.value === priceRule.customerGetType);
+          if (productType && productType.label) {
+            this.$set(this.promotion, "productType", productType.label);
+          }
+          // 组合
+          const {
+            combineWithOrder,
+            combineWithProduct,
+            combineWithShipping,
+            targetShopifyProductSpu,
+            targetShopifySku,
+            targetSelectionType,
+            customerGetType,
+            getTargetShopifyProductSpu,
+            getTargetShopifySku,
+            customerGetOrderUsageLimit,
+            codeUsageLimit
+          } = priceRule;
+          let combinationArr = [];
+          if (combineWithOrder) {
+            combinationArr.push(i18n.t("label.combinationList")[1].value);
+          }
+          if (combineWithProduct) {
+            combinationArr.push(i18n.t("label.combinationList")[0].value);
+          }
+          if (combineWithShipping) {
+            combinationArr.push(i18n.t("label.combinationList")[2].value);
+          }
+          this.usageLimitchecked = !!customerGetOrderUsageLimit;
+          this.codeUsageLimitchecked = !!codeUsageLimit;
+          this.$set(this.promotion, "combination", combinationArr);
+          // 折扣适用  1特定系列  其他2,3 特定商品
+          let tagLists = [];
+          if (targetSelectionType === 1) {
+            tagLists = productTags.map(item => {
+              let data = [];
+              if (item.spu) {
+                data = item.spu.split(",");
               }
+              item.spus = data;
+              return item;
             });
           } else {
-            update(data).then(res => {
-              if (res.code === 200) {
-                this.$message({
-                  message: "操作成功",
-                  type: "success"
-                });
-                this.$emit("refresh-table");
-                this.promotionFormVisible = false;
+            // 特地商品
+            if (targetShopifySku) {
+              const spusSKU = targetShopifySku.split(",");
+              tagLists.push({ title: "", spus: spusSKU });
+            }
+            if (targetShopifyProductSpu) {
+              const spusId = targetShopifyProductSpu.split(",");
+              tagLists.push({ title: "", spus: spusId });
+            }
+          }
+          this.tagLists = tagLists;
+          // 折扣得到条件   1 特定系列  2 特定商品
+          let getTagList = [];
+          if (customerGetType === 1) {
+            giveProductCollects.forEach(item => {
+              if (item.spu) {
+                const arr = item.spu.split(",");
+                getTagList.push.apply(getTagList, arr);
               }
             });
+          } else {
+            // 特地商品
+            if (getTargetShopifySku) {
+              const skus = getTargetShopifySku.split(",");
+              getTagList.push.apply(getTagList, skus);
+            }
+            if (getTargetShopifyProductSpu) {
+              const spus = getTargetShopifyProductSpu.split(",");
+              getTagList.push.apply(getTagList, spus);
+            }
           }
-        }
-      });
-    },
-    handleChangeParticipateType(e) {
-      this.conditionTypeArr.forEach(item => {
-        item.disabled = false;
-      });
-      this.promotion.conditionType = "";
-      this.promotion.conditionValue = "";
-      if (e === "gift_money" || e === "gift_qty") {
-        this.conditionTypeArr[2].disabled = true;
-      } else if (e === "gift_consumer") {
-        // gift_consumer
-        this.conditionTypeArr[0].disabled = true;
-        this.conditionTypeArr[1].disabled = true;
-        this.promotion.conditionType = this.conditionTypeArr[2].value;
-      }
+          this.getTagList = getTagList;
+        })
+        .finally(() => {
+          this.pageLoad = false;
+        });
     }
   }
 };
@@ -667,7 +660,7 @@ export default {
         width: 25%;
       }
     }
-    &.countries {
+    &.discount {
       .info {
         margin-bottom: 60px;
       }
@@ -718,21 +711,6 @@ export default {
     border-bottom: none;
   }
   .info {
-    &.info-countries {
-      /deep/.el-radio-group {
-        .item {
-          margin-top: 20px;
-        }
-        .mininput {
-          margin-left: 20px;
-        }
-      }
-    }
-    &.info-mini {
-      .item {
-        margin-top: 20px;
-      }
-    }
     .item {
       display: flex;
       flex-direction: row;
@@ -748,8 +726,8 @@ export default {
         margin-right: 36px;
       }
       .mininput {
-        width: 142px !important;
-        margin-left: 10px;
+        margin-right: 30px;
+        width: 180px !important;
       }
       .checkboxinput {
         margin-left: 20px;
@@ -761,11 +739,21 @@ export default {
         margin-right: 12px;
       }
       &.product {
+        margin-top: 26px;
+        .label {
+          margin-bottom: 10px;
+        }
         .mininput {
           margin-right: 20px;
+          margin-bottom: 10px;
+        }
+        .row {
+          flex-wrap: wrap;
         }
         .collectioninput {
           margin-right: 20px;
+          min-width: 220px !important;
+          width: auto !important;
           /deep/.el-input-group__append {
             color: #ae8877;
             border-left: none;
@@ -780,16 +768,19 @@ export default {
             border-right: none;
           }
         }
+        .value {
+          margin-bottom: 10px;
+        }
       }
     }
-    .countries {
+    .discount {
       .item {
+        margin-bottom: 20px;
         /deep/.el-radio {
           min-width: 135px;
         }
       }
     }
-
     .customerqualification {
       .el-radio {
         display: block;
@@ -797,5 +788,35 @@ export default {
       }
     }
   }
+  .value {
+    position: relative;
+    min-width: 300px;
+    height: 36px;
+    padding: 0px 6px;
+    font-size: 12px;
+    margin-right: 13px;
+    color: #c0c4cc;
+    background: #f5f7fa;
+    border-radius: 3px;
+    border: 1px solid #dcdfe6;
+    p {
+      line-height: 12px;
+      padding-right: 130px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+    a {
+      position: absolute;
+      right: 10px;
+      top: 0%;
+      color: #ae8877;
+    }
+  }
+  .customerQualification {
+    .mininput {
+      margin-bottom: 30px;
+    }
+  }
 }
 </style>

+ 0 - 91
src/views/oms/promotion/freeShipping/promotionLogList.vue

@@ -1,91 +0,0 @@
-<template>
-  <div>
-    <el-dialog append-to-body width="355px" :visible.sync="dialogFormVisible">
-      <div class="box">
-        <p>
-          <a href="javascript:void(0)" @click="handleDetail"> 查看版本V2</a>
-          更新时间 2025-01-24
-        </p>
-      </div>
-      <template slot="footer">
-        <el-button @click="dialogFormVisible = false"
-          >{{ $t("tagsView.close") }}
-        </el-button>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import waves from "@/directive/waves"; // 水波纹指令
-import ElContainer from "element-ui/packages/container/src/main";
-import { promotionLogs } from "@/api/oms/order/promotion";
-
-export default {
-  inject: ["reload"], //刷新
-  components: {
-    ElContainer
-  },
-  name: "promotionLogList",
-  directives: {
-    waves
-  },
-  data() {
-    return {
-      dialogFormVisible: false,
-      list: [],
-      listLoading: false,
-      listQuery: {}
-    };
-  },
-  created() {},
-  computed: {},
-  methods: {
-    handleOpen(id) {
-      this.listQuery.promotionId = id;
-      this.dialogFormVisible = true;
-      this.retPage();
-    },
-    getList() {
-      this.listLoading = true;
-      promotionLogs(this.listQuery)
-        .then(response => {
-          if (response.code === 200) {
-            this.list = response.data.list;
-            setTimeout(() => {
-              this.listLoading = false;
-            }, 0.5 * 1000);
-          }
-        })
-        .catch(() => {
-          setTimeout(() => {
-            this.listLoading = false;
-          }, 0.5 * 1000);
-        });
-    },
-    handleDetail(t) {
-      let id = this.listQuery.promotionId;
-      this.$emit("show", id);
-    },
-    retPage() {
-      this.getList();
-    }
-  }
-};
-</script>
-
-<style scoped lang="scss">
-.box {
-  max-height: 350px;
-  overflow-y: auto;
-  p {
-    margin-left: 23px;
-    color: #9f9f9f;
-    line-height: 24px;
-    a {
-      color: #ae8877;
-      margin-right: 20px;
-    }
-  }
-}
-</style>

+ 187 - 128
src/views/oms/refund/components/createRefundDialog.vue

@@ -578,7 +578,7 @@
                       size="mini"
                       @change="refundAmountChange"
                       :min="0.0"
-                      :max="scope.row.totalFee"
+                      :max="scope.row.originRefundAmount"
                     ></el-input-number>
                   </div>
                 </template>
@@ -594,10 +594,11 @@
                   </div>
                   <div v-else>
                     <el-input-number
-                      v-model="scope.row.paidAmount"
+                      v-model="scope.row.differenceAmount"
                       size="mini"
                       :min="0.0"
-                      :max="scope.row.totalFee"
+                      :max="scope.row.originPaidAmount"
+                      @change="refundAmountChange"
                     ></el-input-number>
                   </div>
                 </template>
@@ -736,11 +737,7 @@
                 :label="$t('multipleDiscountInfo.OriginalMoneny')"
                 align="center"
                 prop="originalOrderAmount"
-              >
-                <template slot-scope="scope">
-                  {{ scope.row.currency }} {{ scope.row.originalOrderAmount }}
-                </template>
-              </el-table-column>
+              />
               <el-table-column
                 :label="$t('multipleDiscountInfo.afterReturnDiscount')"
                 align="center"
@@ -749,28 +746,24 @@
               <el-table-column
                 :label="$t('multipleDiscountInfo.afterReturnMoney')"
                 align="center"
-                prop="CurrentOrderAmount"
-              >
-                <template slot-scope="scope">
-                  {{ scope.row.currency }} {{ scope.row.CurrentOrderAmount }}
-                </template>
-              </el-table-column>
+                prop="currentOrderAmount"
+              />
               <el-table-column
                 :label="$t('multipleDiscountInfo.returnMoney')"
                 align="center"
-                prop="returnMoney"
+                prop="refundAmount"
               >
                 <template slot-scope="scope">
-                  {{ returnAmount(scope.row) }}
+                  {{ scope.row.refundAmount || 0 }}
                 </template>
               </el-table-column>
               <el-table-column
                 :label="$t('multipleDiscountInfo.needPayMoney')"
                 align="center"
-                prop="needPayMoney"
+                prop="differenceAmount"
               >
                 <template slot-scope="scope">
-                  {{ needPayMoney(scope.row) }}
+                  {{ scope.row.differenceAmount || 0 }}
                 </template>
               </el-table-column>
             </el-table>
@@ -809,15 +802,14 @@ import { getToken } from "@/utils/auth";
 import { dcmSub } from "@/utils/toolUtil";
 import { getDetailListForRefund, statusKeyValue } from "@/api/oms/order/order";
 import {
-  saveRefundNew,
   validPromotionReq,
   warehouseList,
-  checkRefundVersions,
-  checkSubmitRefund
+  checkSubmitRefund,
+  backstageSubmitRefund
 } from "@/api/oms/refund/refund";
 import { BigNumber } from "bignumber.js";
-import { write } from "xlsx";
 import tableEdit from "./tableEdit";
+import i18n from "@/lang";
 
 export default {
   name: "createRefundDialog",
@@ -857,6 +849,7 @@ export default {
       tableOrderDeatils: [],
       multipleSelection: [],
       returnPreviewDatas: [], // 勾选后,退款预览数据
+      originReturnPreviewDatas: {}, //记录下来的,退款原来预览数据
       addRefundForm: {
         refundMethod: "system",
         refundAccountType: "PayPal",
@@ -864,6 +857,7 @@ export default {
         refundType: "",
         refundPostage: "0",
         refundAmount: 0.0, //商品退款金额
+        differenceAmount: 0, // 补款金额
         refundPostageAmount: 0.0,
         warehouseCode: "",
         annexPath: "",
@@ -893,7 +887,7 @@ export default {
       refundOtherReasonAss: "",
       otherReasonFlag: "",
       tableKey: Math.random(),
-      refundVersion: 1 //默认新版本
+      isRefund: true //是否是退款 true:退款 false:补款
     };
   },
   created() {
@@ -906,30 +900,11 @@ export default {
       return {
         "X-Token": getToken()
       };
-    },
-    returnAmount(row) {
-      const { originalOrderAmount, CurrentOrderAmount } = row;
-      const val = originalOrderAmount - CurrentOrderAmount;
-      return val > 0 ? val : 0;
-    },
-    needPayMoney(row) {
-      const { originalOrderAmount, CurrentOrderAmount } = row;
-      const val = originalOrderAmount - CurrentOrderAmount;
-      return val < 0 ? Math.abs(val) : 0;
     }
   },
   methods: {
-    // 获取退款版本
-    getRefundVersion() {
-      checkRefundVersions().then(res => {
-        if (res.code === 200) {
-          this.refundVersion = res.data.RefundVersionsEntity.versions;
-        }
-      });
-    },
     getDetail(idList) {
       this.ShippingLabelOption();
-      this.getRefundVersion();
       //非空判断
       if (!this.listQuery.ormorder && !this.listQuery.shopify) {
         this.$message.error("网店单号和shopify单号不能同时为空");
@@ -941,6 +916,9 @@ export default {
       }
       //初始化数据
       this.addRefundForm.refundAmount = 0.0;
+      this.addRefundForm.differenceAmount = 0.0;
+      this.addRefundForm.noTaxRefundAmount = 0.0;
+      this.addRefundForm.noTaxDifferenceAmount = 0.0;
       this.addRefundForm.refundPostage = "0";
       this.addRefundForm.refundPostageAmount = 0.0;
       this.addRefundForm.warehouseCode = "";
@@ -975,38 +953,44 @@ export default {
       this.listLoading = true;
       getDetailListForRefund(this.listQuery).then(res => {
         if (200 == res.code) {
-          this.show = true;
-          //第一次查询的退款类型
-          this.queryRefundType = res.data.refundType;
-          this.queryOrmorder = res.data.ormorder;
-          this.queryShopify = res.data.shopify;
-          this.tableOrderDeatils = res.data.list;
-          this.addRefundForm.currency = res.data.currency;
-          this.addressInfo = res.data.addressList;
+          if (res.data.isPayment) {
+            //true:存在未支付订单 ,false:不存在未支付
+            this.$message.error(i18n.t("label.paidTips"));
+            this.show = false;
+          } else {
+            this.show = true;
+            //第一次查询的退款类型
+            this.queryRefundType = res.data.refundType;
+            this.queryOrmorder = res.data.ormorder;
+            this.queryShopify = res.data.shopify;
+            this.tableOrderDeatils = res.data.list;
+            this.addRefundForm.currency = res.data.currency;
+            this.addressInfo = res.data.addressList;
 
-          this.reasonListAll = res.data.refundReasonList;
+            this.reasonListAll = res.data.refundReasonList;
 
-          let goodsRefundAmount = BigNumber(0);
+            let goodsRefundAmount = BigNumber(0);
 
-          if (this.tableOrderDeatils) {
-            for (let ind in this.tableOrderDeatils) {
-              if (this.tableOrderDeatils[ind].refundFlag == "0") {
-                this.tableOrderDeatils[ind].refundQuantity = 0;
+            if (this.tableOrderDeatils) {
+              for (let ind in this.tableOrderDeatils) {
+                if (this.tableOrderDeatils[ind].refundFlag == "0") {
+                  this.tableOrderDeatils[ind].refundQuantity = 0;
+                }
+                this.tableOrderDeatils[
+                  ind
+                ].oldQuantity = this.tableOrderDeatils[ind].quantity;
               }
-              this.tableOrderDeatils[ind].oldQuantity = this.tableOrderDeatils[
-                ind
-              ].quantity;
-            }
 
-            //退商品金额计算
-            this.refundAmount = goodsRefundAmount.toFixed(2);
-            this.$nextTick(() => {
-              this.tableOrderDeatils.forEach(row => {
-                if (row.selectedRow == 1) {
-                  this.$refs.multipleTable.toggleRowSelection(row, true);
-                }
+              //退商品金额计算
+              this.refundAmount = goodsRefundAmount.toFixed(2);
+              this.$nextTick(() => {
+                this.tableOrderDeatils.forEach(row => {
+                  if (row.selectedRow == 1) {
+                    this.$refs.multipleTable.toggleRowSelection(row, true);
+                  }
+                });
               });
-            });
+            }
           }
         } else {
           this.$message.error(res.msg);
@@ -1037,72 +1021,117 @@ export default {
           .toNumber()
           .toFixed(2);
       }
-
       var taxAndShippingAmount = BigNumber(this.addRefundForm.refundTaxAmount)
         .plus(BigNumber(this.addRefundForm.refundPostageAmount))
         .toNumber()
         .toFixed(2);
+      let price =
+        this.addRefundForm.noTaxRefundAmount !== "NaN" &&
+        this.addRefundForm.noTaxRefundAmount > 0
+          ? BigNumber(this.addRefundForm.noTaxRefundAmount)
+          : BigNumber(this.addRefundForm.noTaxDifferenceAmount).negated();
       this.addRefundForm.refundTotalAmount = BigNumber(taxAndShippingAmount)
-        .plus(BigNumber(this.addRefundForm.refundAmount))
+        .plus(BigNumber(price))
         .toNumber()
         .toFixed(2);
     },
     // 重新计算退款的金额
-    reCalReturn(data) {
+    reCalReturn() {
+      const data = this.multipleSelection;
       const formData = {
         ormOrderId: this.queryOrmorder,
         promotionRefundDetails: data.map(item => {
           return {
             soOrderId: item.ordersId,
-            orderItemId: item.orderitemld,
+            orderItemId: item.orderitemId,
             ormOrderItemId: item.ormOrderItemId,
             quantity: item.quantity
           };
         })
       };
-      checkSubmitRefund(formData).then(res => {
-        if (res.code == 200) {
-          const { OrderPreview, OrderItemPreview } = res.data;
-          this.returnPreviewDatas = OrderPreview;
-          for (let k in this.multipleSelection) {
-            let row = this.multipleSelection[k];
-            let data = OrderItemPreview.find(
-              item => item.ormOrderItemId === row.ormOrderItemId
-            );
-            row.refundAmount = data.refundAmount;
-            row.paidAmount = data.paidAmount;
+      this.listLoading = true;
+      checkSubmitRefund(formData)
+        .then(res => {
+          if (res.code === 200) {
+            const { orderPreviewVO, ordersRefund } = res.data;
+            const { isRefund, titleAmount } = orderPreviewVO;
+            const refundAmount = isRefund ? titleAmount : 0;
+            const differenceAmount = isRefund ? 0 : titleAmount;
+            this.returnPreviewDatas = [
+              { ...orderPreviewVO, refundAmount, differenceAmount }
+            ];
+            this.originReturnPreviewDatas = orderPreviewVO;
+            this.isRefund = orderPreviewVO.isRefund;
+            const totalPrice = this.multipleSelection.reduce((prev, cur) => {
+              return prev + cur.totalFee;
+            }, 0);
+            for (let k in this.multipleSelection) {
+              let row = this.multipleSelection[k];
+              let data = ordersRefund.items.find(
+                item => item.ormOrderItemId === row.ormOrderItemId
+              );
+              if (orderPreviewVO.isRefund) {
+                // 退款
+                row.refundAmount = data.refundAmount;
+                row.originRefundAmount = data.refundAmount;
+                row.differenceAmount = 0;
+              } else {
+                // 补差价
+                const val = this.calNeedPaidMoney(
+                  k,
+                  row,
+                  orderPreviewVO.titleAmount,
+                  totalPrice
+                );
+                row.originPaidAmount = val;
+                row.differenceAmount = val;
+                row.refundAmount = 0;
+              }
+            }
+            this.jisuan();
+          } else {
+            this.$message.error(res.msg);
           }
-        } else {
-          this.$message.error(res.msg);
-        }
-      });
+        })
+        .finally(() => {
+          this.listLoading = false;
+        });
+    },
+    // 计算补差价的金额
+    calNeedPaidMoney(i, row, differenceAmount, totalPrice) {
+      let data = 0;
+      if (this.multipleSelection.length === 1) {
+        data = differenceAmount;
+      } else if (i === String(this.multipleSelection.length - 1)) {
+        const price = this.multipleSelection.reduce((prev, cur) => {
+          const amont = cur.differenceAmount || 0;
+          return prev + amont;
+        }, 0);
+        // 最后一个的时候,需要用减法
+        data = (differenceAmount - price).toFixed(2);
+      } else {
+        data = ((row.totalFee / totalPrice) * differenceAmount).toFixed(2);
+      }
+      return Number(data);
     },
     // 当前选中的 退款金额
     handleSelectionChange(val) {
       this.refundAmount = 0;
+      this.differenceAmount = 0;
       this.multipleSelection = val;
       if (this.multipleSelection && this.multipleSelection.length > 0) {
         // 如果是退款新版本,包含多件多折 需要重算退款金额
-        if (this.refundVersion === 1) {
-          this.reCalReturn(val);
-        } else {
-          // 老版本是前端计算
-          for (let uy in this.multipleSelection) {
-            var row = this.multipleSelection[uy];
-            row.refundAmount = BigNumber(row.totalFee)
-              .div(BigNumber(row.oldQuantity))
-              .multipliedBy(BigNumber(row.quantity))
-              .multipliedBy(BigNumber(row.refundSales))
-              .toNumber()
-              .toFixed(2);
-          }
-        }
+        this.reCalReturn();
       } else {
         this.refundAmount = 0;
-        this.addRefundForm.refundAmount = this.refundAmount;
+        this.addRefundForm.refundAmount = 0;
+        this.addRefundForm.differenceAmount = 0;
+        this.addRefundForm.noTaxRefundAmount = 0;
+        this.addRefundForm.noTaxDifferenceAmount = 0;
+        this.differenceAmount = 0;
+        this.returnPreviewDatas = [];
+        this.addRefundForm.refundTotalAmount = 0;
       }
-
-      this.jisuan();
     },
     refundAmountChange() {
       this.jisuan();
@@ -1112,28 +1141,47 @@ export default {
         .plus(BigNumber(this.addRefundForm.refundPostageAmount))
         .toNumber();
 
-      var refundAmount = BigNumber(0);
+      let refundAmount = BigNumber(0); // 退款金额
+      let differenceAmount = BigNumber(0); // 补款单金额
       if (this.multipleSelection && this.multipleSelection.length > 0) {
         for (let uy in this.multipleSelection) {
           var row = this.multipleSelection[uy];
           refundAmount = refundAmount.plus(BigNumber(row.refundAmount));
+          differenceAmount = differenceAmount.plus(
+            BigNumber(row.differenceAmount)
+          );
         }
         this.refundAmount = refundAmount.toNumber().toFixed(2);
+        this.differenceAmount = differenceAmount.toNumber().toFixed(2);
       }
-      this.$set(this.addRefundForm, "refundAmount", this.refundAmount);
+      this.$set(this.addRefundForm, "noTaxRefundAmount", this.refundAmount);
       this.$set(
         this.addRefundForm,
-        "refundTotalAmount",
-        refundAmount
-          .plus(BigNumber(this.taxAndShippingAmount))
-          .toNumber()
-          .toFixed(2)
+        "noTaxDifferenceAmount",
+        this.differenceAmount
       );
+      const refundNewAmount =
+        this.refundAmount === "NaN" ? 0 : this.refundAmount;
+      const differenceNewAmount =
+        this.differenceAmount === "NaN" ? 0 : this.differenceAmount;
+      this.returnPreviewDatas[0].refundAmount = refundNewAmount;
+      this.returnPreviewDatas[0].differenceAmount = differenceNewAmount;
+
+      let total = 0;
+      let price =
+        refundNewAmount > 0 ? refundAmount : differenceAmount.negated();
       console.log(
-        this.taxAndShippingAmount,
-        this.addRefundForm.refundTotalAmount,
-        "总退款金额"
+        refundNewAmount,
+        differenceNewAmount,
+        " price",
+        refundNewAmount > 0
       );
+      // 退款
+      total = price
+        .plus(BigNumber(this.taxAndShippingAmount))
+        .toNumber()
+        .toFixed(2);
+      this.$set(this.addRefundForm, "refundTotalAmount", total);
     },
     checkSelectable(row) {
       // 虚拟商品不可选
@@ -1199,7 +1247,7 @@ export default {
           var row = this.multipleSelection[uy];
           if (row.customOpen == 1) {
             row.otherReason = otherReason;
-          }
+          }``
         }
       }
     },
@@ -1225,20 +1273,11 @@ export default {
         }
       }
     },
-    changeQuantity(row) {
-      //当前行的退款金额
-      row.refundAmount = BigNumber(row.totalFee)
-        .div(BigNumber(row.oldQuantity))
-        .multipliedBy(BigNumber(row.quantity))
-        .multipliedBy(BigNumber(row.refundSales))
-        .toNumber()
-        .toFixed(2);
-      console.log("当前行可退金额", row.refundAmount);
-      this.jisuan();
+    changeQuantity() {
+      this.reCalReturn();
     },
 
     handleAvatarSuccess(res, file) {
-      console.log("图片上传结果", res);
       this.imageUrl = res.accessUrl;
       if (this.imageUrl) {
         this.addRefundForm.annexPath = this.imageUrl;
@@ -1318,7 +1357,7 @@ export default {
       }
 
       var items = [];
-      this.btnLoading = true;
+      // this.btnLoading = true;
       this.$confirm(
         "退款总计:" + this.addRefundForm.refundTotalAmount + ",是否确认?",
         "提示",
@@ -1342,6 +1381,7 @@ export default {
               orderitemId: obj.orderitemId,
               skuCode: obj.skuCode,
               refundAmount: obj.refundAmount,
+              differenceAmount: obj.differenceAmount,
               refundReason: obj.refundReason,
               otherReason: obj.otherReason,
               soOrdersId: obj.ordersId,
@@ -1353,8 +1393,21 @@ export default {
           this.addRefundForm.items = items;
           //这里默认客服发起
           this.addRefundForm.originatorFlag = 1;
+          // 总金额, 正数为退款  负数为补款
+          let val = Number(this.addRefundForm.refundTotalAmount);
+          if (val < 0) {
+            this.addRefundForm.differenceAmount = Math.abs(val);
+            this.addRefundForm.refundAmount = 0;
+          } else {
+            this.addRefundForm.refundAmount = val;
+            this.addRefundForm.differenceAmount = 0;
+          }
           const saveRefund = () => {
-            saveRefundNew(this.addRefundForm).then(
+            let query = {
+              orderPreviewVO: this.originReturnPreviewDatas,
+              ordersRefund: this.addRefundForm
+            };
+            backstageSubmitRefund(query).then(
               res => {
                 if (200 == res.code) {
                   this.$message({
@@ -1455,6 +1508,9 @@ export default {
         this.ShippingLabelOption();
         //初始化数据
         this.addRefundForm.refundAmount = 0.0;
+        this.addRefundForm.noTaxRefundAmount = 0.0;
+        this.addRefundForm.noTaxDifferenceAmount = 0.0;
+        this.addRefundForm.differenceAmount = 0.0;
         this.addRefundForm.refundPostage = "0";
         this.addRefundForm.refundPostageAmount = 0.0;
         this.addRefundForm.warehouseCode = "";
@@ -1643,6 +1699,9 @@ export default {
 }
 .total_box {
   margin-bottom: 20px;
+  .item_box {
+    margin-top: 15px;
+  }
 }
 .btn_box {
   position: absolute;

+ 1648 - 0
src/views/oms/refund/components/createRefundDialogOld.vue

@@ -0,0 +1,1648 @@
+<template>
+  <div class="dialog_container" v-loading.fullscreen.lock="detailLoading">
+    <div class="head"></div>
+    <div>
+      <div class="filter-container">
+        <el-input
+          :placeholder="$t('place.onlineShopNumber')"
+          clearable
+          style="width: 200px;"
+          class="filter-item"
+          v-model="listQuery.ormorder"
+          @change="validateParams"
+        />
+        <el-input
+          :placeholder="$t('place.shopifyNumber')"
+          clearable
+          style="width: 200px;"
+          class="filter-item"
+          v-model="listQuery.shopify"
+          @change="validateParams"
+        />
+        <el-select
+          :placeholder="$t('place.afterSalesType')"
+          clearable
+          style="width: 200px;"
+          class="filter-item"
+          v-model="listQuery.refundType"
+          @change="validateParams"
+        >
+          <el-option
+            v-for="afterSaleType in afterSaleTypes"
+            :key="afterSaleType.value"
+            :label="$t(afterSaleType.label)"
+            :value="afterSaleType.value"
+          >
+          </el-option>
+        </el-select>
+        <el-button
+          v-waves
+          class="filter-item"
+          type="success"
+          icon="el-icon-search"
+          @click="getDetail(null)"
+          >{{ $t("view.search") }}</el-button
+        >
+      </div>
+    </div>
+    <div class="main" v-if="show">
+      <div class="box" style="margin-top: 15px;">
+        <div class="item_title">{{ $t("view.shippingInfo") }}</div>
+        <div class="ptitle">
+          <template>
+            <el-descriptions
+              class="margin-top"
+              :title="$t('title.addressInfo')"
+              :column="4"
+              direction="horizontal"
+              v-if="addressInfo.length == 1"
+            >
+              <el-descriptions-item :label="$t('country')">{{
+                addressInfo[0].receiverCountryCode
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('label.postalCode')">{{
+                addressInfo[0].receiverZip
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('state')">{{
+                addressInfo[0].receiverState
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('city')">{{
+                addressInfo[0].receiverCity
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('suburb')">{{
+                addressInfo[0].receiverDistrict
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('street')">{{
+                addressInfo[0].receiverStreet
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('address')">{{
+                addressInfo[0].receiverAddress
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('dooeNo')">{{
+                addressInfo[0].receiverAddress2
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('recipient')">{{
+                addressInfo[0].receiverName
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('telephone')">{{
+                addressInfo[0].receiverPhone
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('moPhone')">{{
+                addressInfo[0].receiverMobile
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('post')">{{
+                addressInfo[0].email
+              }}</el-descriptions-item>
+              <el-descriptions-item :label="$t('label.shippingFee')">{{
+                addressInfo[0].freight
+              }}</el-descriptions-item>
+            </el-descriptions>
+            <div class="container" width="500px" v-if="addressInfo.length > 1">
+              <div
+                v-for="(item, index) in addressInfo"
+                :key="index"
+                width="100px"
+                margin-right="50px"
+              >
+                <el-popover
+                  placement="top"
+                  :title="$t('title.addressInfo')"
+                  width="300"
+                  offset="300"
+                  trigger="hover"
+                >
+                  <el-descriptions
+                    class="margin-top"
+                    title=""
+                    :column="1"
+                    direction="horizontal"
+                  >
+                    <el-descriptions-item :label="$t('country')">{{
+                      item.receiverCountryCode
+                    }}</el-descriptions-item>
+                    <el-descriptions-item :label="$t('address')">{{
+                      item.receiverAddress
+                    }}</el-descriptions-item>
+                    <el-descriptions-item :label="$t('recipient')">{{
+                      item.receiverName
+                    }}</el-descriptions-item>
+                    <el-descriptions-item :label="$t('post')">{{
+                      item.email
+                    }}</el-descriptions-item>
+                    <el-descriptions-item :label="$t('label.shippingFee')">{{
+                      item.freight
+                    }}</el-descriptions-item>
+                  </el-descriptions>
+                  <el-button
+                    slot="reference"
+                    @click="chooseClick(item.idList)"
+                    >{{ item.receiverCountryCode }}</el-button
+                  >
+                </el-popover>
+              </div>
+            </div>
+            <!-- <el-descriptions class="margin-top" :title="'地址信息-' + (index + 1)" :column="4" direction="horizontal" v-for="(item, index) in addressInfo" :key="index"> -->
+            <!-- <el-descriptions-item :label="$t('country')">{{item.receiverCountryCode}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('label.postalCode')">{{item.receiverZip}}</el-descriptions-item>
+                            <el-descriptions-item :label="$t('state')">{{item.receiverState}}</el-descriptions-item>
+                            <el-descriptions-item :label="$t('city')" >{{item.receiverCity}}</el-descriptions-item>
+                            <el-descriptions-item :label="$t('suburb')" >{{item.receiverDistrict}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('street')" >{{item.receiverStreet}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('address')" >{{item.receiverAddress}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('dooeNo')" >{{item.receiverAddress2}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('recipient')" >{{item.receiverName}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('telephone')" >{{item.receiverPhone}}</el-descriptions-item>
+                            <el-descriptions-item :label="$t('moPhone')" >{{item.receiverMobile}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('post')" >{{item.email}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item :label="$t('label.shippingFee')" >{{item.freight}}</el-descriptions-item> -->
+            <!-- <el-descriptions-item v-if=" addressInfo.length !=0 && addressInfo.length !=1 " :label="$t('actions')">
+                                <el-button
+                                type="success"
+                                @click="chooseClick(item.idList)"
+                                v-loading="btnLoading"
+                                >选择</el-button
+                                >
+                            </el-descriptions-item> -->
+            <!-- </el-descriptions> -->
+          </template>
+        </div>
+      </div>
+      <div
+        class="box"
+        style="margin-top: 15px;padding-bottom: 10px;"
+        v-loading="fromLoading"
+        v-if="
+          (this.listQuery.ormorder || this.listQuery.shopify) &&
+            this.listQuery.refundType
+        "
+      >
+        <div class="item_title">{{ $t("view.refundInfo") }}</div>
+        <div class="ptitle">
+          <el-form
+            label-position="left"
+            ref="addRefundForm"
+            :model="addRefundForm"
+          >
+            <div class="row">
+              <div class="row-item">
+                <div class="row">
+                  <el-form-item class="inputleft" :label="$t('currency')">
+                    <el-input
+                      disabled
+                      v-model="addRefundForm.currency"
+                      placeholder
+                      class="normal-input"
+                    ></el-input>
+                  </el-form-item>
+                  <el-form-item
+                    :label="$t('label.expectedRefundAmount')"
+                    required
+                  >
+                    <el-input
+                      v-model="addRefundForm.refundTotalAmount"
+                      :disabled="true"
+                    />
+                  </el-form-item>
+                </div>
+                <el-form-item :label="$t('label.refundMethod')" required>
+                  <el-radio-group v-model="addRefundForm.refundMethod">
+                    <el-radio label="system">{{
+                      $t("view.systemRefund")
+                    }}</el-radio>
+                    <el-radio label="manual">{{
+                      $t("view.manualRefund")
+                    }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item
+                  v-if="addRefundForm.refundMethod == 'manual'"
+                  :label="$t('label.accountType')"
+                  required
+                >
+                  <el-radio-group v-model="addRefundForm.refundAccountType">
+                    <el-radio label="PayPal">PayPal</el-radio>
+                    <!-- 银行卡暂时隐藏 -->
+                    <!-- <el-radio label="bankCard">银行卡</el-radio> -->
+                    <!-- <el-radio label="Gift Card">Gift Card</el-radio> -->
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item
+                  :label="$t('label.receivingAccount')"
+                  v-if="
+                    addRefundForm.refundMethod == 'manual' &&
+                      addRefundForm.refundAccountType == 'PayPal'
+                  "
+                  required
+                >
+                  <el-input
+                    v-model="addRefundForm.refundAccount"
+                    :placeholder="$t('place.pleaseFillIn')"
+                    class="normal-input"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item :label="$t('label.taxRefund')">
+                  <el-radio-group
+                    v-model="addRefundForm.refundTaxAble"
+                    @change="calculateRefundAmount"
+                  >
+                    <el-radio label="0">{{ $t("view.noTaxRefund") }}</el-radio>
+                    <el-radio label="1">{{ $t("view.taxRefund") }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item
+                  v-if="addRefundForm.refundTaxAble == 1"
+                  :label="$t('label.taxRefundAmount')"
+                >
+                  <el-input-number
+                    v-model="addRefundForm.refundTaxAmount"
+                    :min="0.0"
+                    :step="0.01"
+                    step-strictly
+                    @change="calculateRefundAmount"
+                  ></el-input-number>
+                </el-form-item>
+                <!-- 选择是否退运费-->
+                <el-form-item :label="$t('label.shippingFee')">
+                  <el-radio-group
+                    v-model="addRefundForm.refundPostage"
+                    @change="calculateRefundAmount"
+                  >
+                    <el-radio label="0">{{ $t("view.noRefund") }}</el-radio>
+                    <el-radio label="1">{{
+                      $t("view.refundShippingFee")
+                    }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <el-form-item
+                  v-if="addRefundForm.refundPostage == 1"
+                  :label="$t('label.returnShippingFeeAmount')"
+                >
+                  <el-input-number
+                    v-model="addRefundForm.refundPostageAmount"
+                    :min="0.0"
+                    :step="0.01"
+                    step-strictly
+                    @change="calculateRefundAmount"
+                  ></el-input-number>
+                </el-form-item>
+
+                <el-form-item
+                  v-if="this.queryRefundType == 3"
+                  :label="$t('label.receivingReturnWarehouse')"
+                >
+                  <el-select
+                    :placeholder="$t('place.pleaseSelect')"
+                    clearable
+                    style="width: 200px;"
+                    class="filter-item"
+                    v-model="addRefundForm.warehouseCode"
+                    @change="ShippingLabelOption"
+                  >
+                    <el-option
+                      v-for="item in warehouseItems"
+                      :key="item.key"
+                      :label="item.key"
+                      :value="item.value"
+                    ></el-option>
+                  </el-select>
+                </el-form-item>
+
+                <el-form-item
+                  v-if="
+                    addRefundForm.warehouseCode == 'PSJ-G001001' ||
+                      addRefundForm.warehouseCode == 'PSJ-G001003' ||
+                      addRefundForm.warehouseCode == 'PSJ-H0000024' ||
+                      addRefundForm.warehouseCode == 'PSJ-H0000019' ||
+                      addRefundForm.warehouseCode == 'PSJ-H0000011' ||
+                      addRefundForm.warehouseCode == 'PSJ-G001004'
+                  "
+                  label="ShippingLabel"
+                >
+                  <el-radio-group
+                    v-model="addRefundForm.slUseable"
+                    @change="changeSlradio()"
+                  >
+                    <el-radio label="0" value="0">{{
+                      $t("view.notEnabled")
+                    }}</el-radio>
+                    <el-radio label="1" value="1">{{
+                      $t("view.enabled")
+                    }}</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+
+                <el-form-item
+                  v-if="
+                    this.queryRefundType == 3 &&
+                      this.addRefundForm.slUseable == 0
+                  "
+                  :label="$t('label.returnLogisticsCompanyCode')"
+                >
+                  <el-input
+                    v-model="addRefundForm.shipmodeId"
+                    :placeholder="$t('place.pleaseFillIn')"
+                    class="normal-input"
+                  ></el-input>
+                </el-form-item>
+                <el-form-item
+                  v-if="
+                    this.queryRefundType == 3 &&
+                      this.addRefundForm.slUseable == 0
+                  "
+                  :label="$t('label.returnLogisticsNumber')"
+                >
+                  <el-input
+                    v-model="addRefundForm.shippingNo"
+                    :placeholder="$t('place.pleaseFillIn')"
+                    class="normal-input"
+                  ></el-input>
+                </el-form-item>
+              </div>
+              <div class="row-item">
+                <el-form-item :label="$t('label.afterSalesInstructions')">
+                  <el-input
+                    type="textarea"
+                    class="afertextarea"
+                    :placeholder="$t('place.enterContent')"
+                    v-model="addRefundForm.notes"
+                    :rows="4"
+                    maxlength="150"
+                    show-word-limit
+                  >
+                  </el-input>
+                </el-form-item>
+
+                <el-form-item :label="$t('label.uploadVoucher')">
+                  <el-upload
+                    class="avatar-uploader"
+                    :action="uploadPhotos"
+                    :show-file-list="false"
+                    :on-success="handleAvatarSuccess"
+                    :before-upload="beforeAvatarUpload"
+                    :headers="headers"
+                  >
+                    <img v-if="imageUrl" :src="imageUrl" class="avatar" />
+                    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+                  </el-upload>
+                </el-form-item>
+              </div>
+            </div>
+          </el-form>
+        </div>
+
+        <!-- 因为要多选的问题 不考虑分页 -->
+        <div class="box" style="margin-top: 15px;">
+          <div class="item_title">
+            <span>{{ $t("view.selectItems") }}</span>
+            <el-select
+              v-if="this.multipleSelection && this.multipleSelection.length > 0"
+              v-model="refundReasonAss"
+              style="width: 260px;"
+              :placeholder="$t('place.selectCheckedRefundReasons')"
+              clearable
+              @change="chooseReason(refundReasonAss, reasonListAll)"
+            >
+              <el-option
+                v-for="status in reasonListAll"
+                :key="status.id"
+                :label="status.reasonContentChinese"
+                :value="String(status.id)"
+              >
+              </el-option>
+            </el-select>
+            <el-input
+              v-if="otherReasonFlag == '1'"
+              :placeholder="$t('place.enterReason')"
+              clearable
+              style="width: 220px;"
+              class="filter-item"
+              v-model="refundOtherReasonAss"
+              @change="writeReason(refundOtherReasonAss)"
+            />
+          </div>
+          <div>
+            <el-table
+              class="itemtable"
+              ref="multipleTable"
+              @selection-change="handleSelectionChange"
+              style="width: 100%;"
+              v-loading="listLoading"
+              :key="tableKey"
+              :data="tableOrderDeatils"
+              row-key="id"
+              stripe
+              border
+              fit
+              highlight-current-row
+            >
+              <el-table-column
+                type="selection"
+                width="55"
+                :selectable="checkSelectable"
+              >
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('label.orderNumber')"
+                width="150"
+                align="center"
+                prop="ordersId"
+              >
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('goodsCode')"
+                width="150"
+                align="center"
+                prop="skuCode"
+              >
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('onlyCode')"
+                min-width="180"
+                align="center"
+                prop=""
+              >
+                <template slot-scope="scope">
+                  <div v-if="scope.row.uniqueCode">
+                    <div
+                      v-for="(item, index) in scope.row.uniqueCode"
+                      :key="index"
+                    >
+                      {{ item }}
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('goodsName')"
+                width="300"
+                align="center"
+                prop="productName"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('bagSkuCode')"
+                width="180"
+                align="center"
+                prop="bagSkuCode"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('label.originalQuantity')"
+                width="80"
+                align="center"
+                prop="oldQuantity"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('goodsPrice')"
+                width="80"
+                align="center"
+                prop="price"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('offerAmount')"
+                width="80"
+                align="center"
+                prop="discountFee"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('payAmount')"
+                width="80"
+                align="center"
+                prop="totalFee"
+              ></el-table-column>
+
+              <el-table-column
+                :label="$t('label.refundPercentage')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1">
+                    <div>{{ scope.row.refundSales }}</div>
+                  </div>
+                  <div v-else>
+                    <el-input-number
+                      v-model="scope.row.refundSales"
+                      @change="changeQuantity(scope.row)"
+                      size="mini"
+                      :min="0"
+                      :max="1"
+                      :step="0.01"
+                      step-strictly
+                    ></el-input-number>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.eligibleQuantity')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1">
+                    <div>{{ scope.row | quantityFilter }}</div>
+                  </div>
+                  <div v-else>
+                    <!-- <tableEdit :row.sync="scope.row"></tableEdit> -->
+                    <el-input-number
+                      v-model="scope.row.quantity"
+                      @change="changeQuantity(scope.row)"
+                      size="mini"
+                      :min="0"
+                      :max="scope.row.maxq"
+                      :step="1"
+                      step-strictly
+                    ></el-input-number>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.refundedAmount')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1">
+                    <div>0</div>
+                  </div>
+                  <div v-else>
+                    <el-input-number
+                      v-model="scope.row.refundAmount"
+                      size="mini"
+                      @change="refundAmountChange"
+                      :min="0.0"
+                      :max="scope.row.totalFee"
+                    ></el-input-number>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.needPayWithCustomers')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1">
+                    <div>0</div>
+                  </div>
+                  <div v-else>
+                    <el-input-number
+                      v-model="scope.row.paidAmount"
+                      size="mini"
+                      :min="0.0"
+                      :max="scope.row.totalFee"
+                    ></el-input-number>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.refundReason')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1"></div>
+                  <div v-else>
+                    <el-select
+                      v-model="scope.row.refundReason"
+                      :placeholder="$t('place.pleaseSelect')"
+                      clearable
+                      @change="refundChange(scope.row.refundReason, scope.row)"
+                    >
+                      <el-option
+                        v-for="status in scope.row.refundReasonList"
+                        :key="status.id"
+                        :label="status.reasonContentChinese"
+                        :value="String(status.id)"
+                      >
+                      </el-option>
+                    </el-select>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.reasonExplanation')"
+                width="150"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <div v-if="multipleSelection.indexOf(scope.row) == -1"></div>
+                  <div v-else>
+                    <el-input
+                      v-if="scope.row.customOpen == '1'"
+                      :placeholder="$t('place.enterReason')"
+                      clearable
+                      style="width: 200px;"
+                      class="filter-item"
+                      v-model="scope.row.otherReason"
+                    />
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                width="55"
+                :label="$t('label.flashPurchase')"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <el-checkbox
+                    v-model="scope.row.flashPurchaseFlag == 1"
+                  ></el-checkbox>
+                </template>
+              </el-table-column>
+              <el-table-column
+                width="55"
+                :label="$t('label.exchangePurchase')"
+                align="center"
+              >
+                <template slot-scope="scope">
+                  <el-checkbox
+                    v-model="scope.row.exchangePurchaseFlag == 1"
+                  ></el-checkbox>
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                :label="$t('label.refundedQuantity')"
+                width="80"
+                align="center"
+                prop="refundQuantity"
+              ></el-table-column>
+              <el-table-column
+                :label="$t('status')"
+                width="80"
+                align="center"
+                prop="status"
+              >
+                <template slot-scope="scope">
+                  {{ scope.row.status | statusFilter }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('label.signedForTheReturn')"
+                width="80"
+                align="center"
+                prop="matchStatus"
+              >
+                <template slot-scope="scope">
+                  <span v-if="scope.row.matchStatus == 'unmatch'">
+                    {{ $t("label.notMatched") }}
+                  </span>
+                  <span
+                    v-if="
+                      scope.row.matchStatus == 'order_matched' ||
+                        scope.row.matchStatus == 'matched'
+                    "
+                  >
+                    {{ $t("label.matchedSuccess") }}
+                  </span>
+                  <span v-if="scope.row.matchStatus == null">
+                    {{ $t("label.not") }}
+                  </span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+        <!-- 多件多折折扣重算 -->
+        <div class="box" v-has="'priceRule:list'">
+          <div class="item_title">
+            {{ $t("multipleDiscountInfo.multipleDiscountReCal") }}
+          </div>
+          <div>
+            <el-table
+              :key="tableKey"
+              :data="returnPreviewDatas"
+              row-key="id"
+              stripe
+              border
+              fit
+              highlight-current-row
+            >
+              <el-table-column type="index" width="40" />
+              <el-table-column
+                :label="$t('multipleDiscountInfo.OriginalDiscount')"
+                align="center"
+                prop="originTip"
+              />
+              <el-table-column
+                :label="$t('multipleDiscountInfo.OriginalMoneny')"
+                align="center"
+                prop="originalOrderAmount"
+              >
+                <template slot-scope="scope">
+                  {{ scope.row.currency }} {{ scope.row.originalOrderAmount }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('multipleDiscountInfo.afterReturnDiscount')"
+                align="center"
+                prop="currentTip"
+              />
+              <el-table-column
+                :label="$t('multipleDiscountInfo.afterReturnMoney')"
+                align="center"
+                prop="CurrentOrderAmount"
+              >
+                <template slot-scope="scope">
+                  {{ scope.row.currency }} {{ scope.row.CurrentOrderAmount }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('multipleDiscountInfo.returnMoney')"
+                align="center"
+                prop="returnMoney"
+              >
+                <template slot-scope="scope">
+                  {{ returnAmount(scope.row) }}
+                </template>
+              </el-table-column>
+              <el-table-column
+                :label="$t('multipleDiscountInfo.needPayMoney')"
+                align="center"
+                prop="needPayMoney"
+              >
+                <template slot-scope="scope">
+                  {{ needPayMoney(scope.row) }}
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+        <div class="box total_box">
+          <div class="item_title">
+            {{ $t("view.totalRefund") }}
+          </div>
+          <div class="item_box">
+            {{ $t("view.totalRefund") }}:{{ addRefundForm.refundTotalAmount }}
+          </div>
+        </div>
+        <div class="box btn_box">
+          <el-button
+            :style="btnStyle"
+            class="save_btn"
+            type="primary"
+            @click="submit(this)"
+            v-loading="btnLoading"
+            >{{ $t("save") }}</el-button
+          >
+          <el-button type="danger" class="backbtn" @click="back">{{
+            $t("back")
+          }}</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// import {getRefundReason} from '@/api/oms/refund/refund'
+import global from "@/views/oms/global";
+import waves from "@/directive/waves";
+import { getToken } from "@/utils/auth";
+import { dcmSub } from "@/utils/toolUtil";
+import { getDetailListForRefund, statusKeyValue } from "@/api/oms/order/order";
+import {
+  saveRefundNew,
+  validPromotionReq,
+  warehouseList,
+  checkRefundVersions,
+  checkSubmitRefund
+} from "@/api/oms/refund/refund";
+import { BigNumber } from "bignumber.js";
+import { write } from "xlsx";
+import tableEdit from "./tableEdit";
+
+export default {
+  name: "createRefundDialog",
+  directives: {
+    waves
+  },
+  components: {
+    global,
+    tableEdit
+  },
+  filters: {
+    statusFilter(key) {
+      return statusKeyValue[key];
+    },
+    quantityFilter(row) {
+      if (row.refundQuantity > 0) {
+        return dcmSub(row.oldQuantity, row.refundQuantity);
+      }
+      return row.oldQuantity;
+    }
+  },
+  data() {
+    return {
+      matchStatus: null,
+      listLoading: false,
+      detailLoading: false,
+      fromLoading: false,
+      btnLoading: false,
+      addressInfo: [],
+      listQuery: {
+        ormorder: null,
+        shopify: null,
+        refundType: null,
+        idList: null
+      },
+      show: false,
+      tableOrderDeatils: [],
+      multipleSelection: [],
+      returnPreviewDatas: [], // 勾选后,退款预览数据
+      addRefundForm: {
+        refundMethod: "system",
+        refundAccountType: "PayPal",
+        refundAccount: "",
+        refundType: "",
+        refundPostage: "0",
+        refundAmount: 0.0, //商品退款金额
+        refundPostageAmount: 0.0,
+        warehouseCode: "",
+        annexPath: "",
+        items: [],
+        oldQuantity: 0,
+        refundTaxAble: "0", //是否退税
+        refundTaxAmount: 0.0, //退税金额
+        refundTotalAmount: 0.0, //总计退款金额 = 商品退款金额 + 退运费金额 + 退税金额 。 实际执行时,refundAmount=商品退款金额 + 退税金额;退运费金额单独计算
+        // refundReason:'', // 退款原因
+        // otherReason:'', // 其他退款理由
+        slUseable: "0", //是否开启ShippingLabel选项
+        currency: "", //币种
+        shipmodeId: "", //退货物流公司编号
+        shippingNo: "", //退货物流单号
+        notes: ""
+      },
+      afterSaleTypes: global.afterSaleType, //售后类型
+      warehouseItems: [],
+      queryRefundType: "",
+      queryOrmorder: "",
+      queryShopify: "",
+      btnStyle: "",
+      imageUrl: "",
+      uploadPhotos: process.env.VUE_APP_OMS_API + "ordersRefund/uploadPhotos",
+      reasonListAll: [],
+      refundReasonAss: "",
+      refundOtherReasonAss: "",
+      otherReasonFlag: "",
+      tableKey: Math.random(),
+      refundVersion: 1 //默认新版本
+    };
+  },
+  created() {
+    //情况清空数据
+    this.getWarehouseList();
+  },
+  computed: {
+    // 计算属性的 getter
+    headers: function() {
+      return {
+        "X-Token": getToken()
+      };
+    },
+    returnAmount(row) {
+      const { originalOrderAmount, CurrentOrderAmount } = row;
+      const val = originalOrderAmount - CurrentOrderAmount;
+      return val > 0 ? val : 0;
+    },
+    needPayMoney(row) {
+      const { originalOrderAmount, CurrentOrderAmount } = row;
+      const val = originalOrderAmount - CurrentOrderAmount;
+      return val < 0 ? Math.abs(val) : 0;
+    }
+  },
+  methods: {
+    // 获取退款版本
+    getRefundVersion() {
+      checkRefundVersions().then(res => {
+        if (res.code === 200) {
+          this.refundVersion = res.data.RefundVersionsEntity.versions;
+        }
+      });
+    },
+    getDetail(idList) {
+      this.ShippingLabelOption();
+      this.getRefundVersion();
+      //非空判断
+      if (!this.listQuery.ormorder && !this.listQuery.shopify) {
+        this.$message.error("网店单号和shopify单号不能同时为空");
+        return;
+      }
+      if (!this.listQuery.refundType) {
+        this.$message.error("请选择售后类型");
+        return;
+      }
+      //初始化数据
+      this.addRefundForm.refundAmount = 0.0;
+      this.addRefundForm.refundPostage = "0";
+      this.addRefundForm.refundPostageAmount = 0.0;
+      this.addRefundForm.warehouseCode = "";
+      this.addRefundForm.annexPath = "";
+      this.addRefundForm.items = [];
+      this.addRefundForm.oldQuantity = 0.0;
+      this.addRefundForm.refundTaxAble = "0"; //是否退税
+      this.addRefundForm.refundTaxAmount = 0.0; //退税金额
+      this.addRefundForm.refundTotalAmount = 0.0;
+      this.addRefundForm.shipmodeId = "";
+      this.addRefundForm.shippingNo = "";
+      this.addRefundForm.refundMethod = "system";
+      this.addRefundForm.refundAccountType = "PayPal";
+      this.addRefundForm.refundAccount = "";
+      this.addRefundForm.notes = "";
+      this.addressInfo = [];
+      this.listQuery.idList = null;
+      // this.listQuery.addressId = addressId;
+      if (idList) {
+        var addressIds = "";
+        for (let id in idList) {
+          addressIds = addressIds + idList[id] + ",";
+        }
+        this.listQuery.idList = addressIds.slice(0, addressIds.length - 1);
+      }
+      this.reasonListAll = [];
+      this.refundReasonAss = "";
+      this.refundOtherReasonAss = "";
+      this.otherReasonFlag = "";
+
+      //查询满足条件的所有订单项
+      this.listLoading = true;
+      getDetailListForRefund(this.listQuery).then(res => {
+        if (200 == res.code) {
+          this.show = true;
+          //第一次查询的退款类型
+          this.queryRefundType = res.data.refundType;
+          this.queryOrmorder = res.data.ormorder;
+          this.queryShopify = res.data.shopify;
+          this.tableOrderDeatils = res.data.list;
+          this.addRefundForm.currency = res.data.currency;
+          this.addressInfo = res.data.addressList;
+
+          this.reasonListAll = res.data.refundReasonList;
+
+          let goodsRefundAmount = BigNumber(0);
+
+          if (this.tableOrderDeatils) {
+            for (let ind in this.tableOrderDeatils) {
+              if (this.tableOrderDeatils[ind].refundFlag == "0") {
+                this.tableOrderDeatils[ind].refundQuantity = 0;
+              }
+              this.tableOrderDeatils[ind].oldQuantity = this.tableOrderDeatils[
+                ind
+              ].quantity;
+            }
+
+            //退商品金额计算
+            this.refundAmount = goodsRefundAmount.toFixed(2);
+            this.$nextTick(() => {
+              this.tableOrderDeatils.forEach(row => {
+                if (row.selectedRow == 1) {
+                  this.$refs.multipleTable.toggleRowSelection(row, true);
+                }
+              });
+            });
+          }
+        } else {
+          this.$message.error(res.msg);
+          this.show = false;
+        }
+        this.listLoading = false;
+      });
+    },
+    //获取退货仓库信息
+    getWarehouseList() {
+      warehouseList().then(res => {
+        if (200 == res.code) {
+          this.warehouseItems = res.data;
+        }
+      });
+    },
+    //计算退款总额 商品退款金额 + 退运费金额 +退税金额
+    calculateRefundAmount() {
+      //如果没选择退税
+      if (this.addRefundForm.refundTaxAble != "1") {
+        this.addRefundForm.refundTaxAmount = BigNumber(0)
+          .toNumber()
+          .toFixed(2);
+      }
+      //如果没选择退运费
+      if (this.addRefundForm.refundPostage != "1") {
+        this.addRefundForm.refundPostageAmount = BigNumber(0)
+          .toNumber()
+          .toFixed(2);
+      }
+
+      var taxAndShippingAmount = BigNumber(this.addRefundForm.refundTaxAmount)
+        .plus(BigNumber(this.addRefundForm.refundPostageAmount))
+        .toNumber()
+        .toFixed(2);
+      this.addRefundForm.refundTotalAmount = BigNumber(taxAndShippingAmount)
+        .plus(BigNumber(this.addRefundForm.refundAmount))
+        .toNumber()
+        .toFixed(2);
+    },
+    // 重新计算退款的金额
+    reCalReturn(data) {
+      const formData = {
+        ormOrderId: this.queryOrmorder,
+        promotionRefundDetails: data.map(item => {
+          return {
+            soOrderId: item.ordersId,
+            orderItemId: item.orderitemld,
+            ormOrderItemId: item.ormOrderItemId,
+            quantity: item.quantity
+          };
+        })
+      };
+      checkSubmitRefund(formData).then(res => {
+        if (res.code == 200) {
+          const { OrderPreview, OrderItemPreview } = res.data;
+          this.returnPreviewDatas = OrderPreview;
+          for (let k in this.multipleSelection) {
+            let row = this.multipleSelection[k];
+            let data = OrderItemPreview.find(
+              item => item.ormOrderItemId === row.ormOrderItemId
+            );
+            row.refundAmount = data.refundAmount;
+            row.paidAmount = data.paidAmount;
+          }
+        } else {
+          this.$message.error(res.msg);
+        }
+      });
+    },
+    // 当前选中的 退款金额
+    handleSelectionChange(val) {
+      this.refundAmount = 0;
+      this.multipleSelection = val;
+      if (this.multipleSelection && this.multipleSelection.length > 0) {
+        // 如果是退款新版本,包含多件多折 需要重算退款金额
+        if (this.refundVersion === 1) {
+          this.reCalReturn(val);
+        } else {
+          // 老版本是前端计算
+          for (let uy in this.multipleSelection) {
+            var row = this.multipleSelection[uy];
+            row.refundAmount = BigNumber(row.totalFee)
+              .div(BigNumber(row.oldQuantity))
+              .multipliedBy(BigNumber(row.quantity))
+              .multipliedBy(BigNumber(row.refundSales))
+              .toNumber()
+              .toFixed(2);
+          }
+        }
+      } else {
+        this.refundAmount = 0;
+        this.addRefundForm.refundAmount = this.refundAmount;
+      }
+
+      this.jisuan();
+    },
+    refundAmountChange() {
+      this.jisuan();
+    },
+    jisuan() {
+      this.taxAndShippingAmount = BigNumber(this.addRefundForm.refundTaxAmount)
+        .plus(BigNumber(this.addRefundForm.refundPostageAmount))
+        .toNumber();
+
+      var refundAmount = BigNumber(0);
+      if (this.multipleSelection && this.multipleSelection.length > 0) {
+        for (let uy in this.multipleSelection) {
+          var row = this.multipleSelection[uy];
+          refundAmount = refundAmount.plus(BigNumber(row.refundAmount));
+        }
+        this.refundAmount = refundAmount.toNumber().toFixed(2);
+      }
+      this.$set(this.addRefundForm, "refundAmount", this.refundAmount);
+      this.$set(
+        this.addRefundForm,
+        "refundTotalAmount",
+        refundAmount
+          .plus(BigNumber(this.taxAndShippingAmount))
+          .toNumber()
+          .toFixed(2)
+      );
+    },
+    checkSelectable(row) {
+      // 虚拟商品不可选
+      // if (row.skuCode === "108C4G1V000BXS") return false;
+      if (row.refundQuantity > 0) {
+        var refcount = dcmSub(row.oldQuantity, row.refundQuantity);
+        //发生退款
+        if (refcount <= 0 && this.queryRefundType != "1") {
+          return false; //不可选择
+        }
+        row["maxq"] = refcount;
+      } else {
+        row["maxq"] = row.oldQuantity;
+      }
+
+      // if( row.status == "delivery" && (row.exchangePurchaseFlag == 1)){
+      //   return false; //不可选择
+      // }
+      // if (row.quantity != 0) {
+      //   row.quantity = row["maxq"];
+      // }
+      //未发货
+      if (
+        this.queryRefundType == "2" &&
+        (row.status == "delivery" ||
+          row.status == "off" ||
+          row.status == "partdelivery")
+      ) {
+        return false; //不可选择
+      }
+      //退货退款
+      else if (
+        this.queryRefundType == "3" &&
+        (row.status == "unchecked" ||
+          row.status == "check" ||
+          row.status == "undelivery")
+      ) {
+        return false; //不可选择
+      }
+      // 促销赠品
+      // if (row.isGift === "1" && row.isPromotion === 1) {
+      //   return false; //不可选择
+      // }
+      return true;
+    },
+    refundChange(id, arr) {
+      if (id) {
+        arr.refundReasonList.forEach(item => {
+          if (item.id == id) {
+            arr.customOpen = item.custom;
+            if (arr.customOpen && arr.customOpen != 1) {
+              arr.otherReason = "";
+            }
+          }
+        });
+      } else {
+        arr.customOpen = "";
+      }
+    },
+    writeReason(otherReason) {
+      if (this.multipleSelection && this.multipleSelection.length > 0) {
+        for (let uy in this.multipleSelection) {
+          var row = this.multipleSelection[uy];
+          if (row.customOpen == 1) {
+            row.otherReason = otherReason;
+          }
+        }
+      }
+    },
+    chooseReason(id, arr) {
+      if (id) {
+        arr.forEach(item => {
+          if (item.id == id) {
+            this.otherReasonFlag = item.custom;
+          }
+        });
+      } else {
+        this.otherReasonFlag = "";
+      }
+
+      if (this.multipleSelection && this.multipleSelection.length > 0) {
+        for (let uy in this.multipleSelection) {
+          var row = this.multipleSelection[uy];
+          row.refundReason = String(id);
+          row.customOpen = this.otherReasonFlag;
+          if (row.customOpen != 1) {
+            row.otherReason = "";
+          }
+        }
+      }
+    },
+    changeQuantity(row) {
+      //当前行的退款金额
+      row.refundAmount = BigNumber(row.totalFee)
+        .div(BigNumber(row.oldQuantity))
+        .multipliedBy(BigNumber(row.quantity))
+        .multipliedBy(BigNumber(row.refundSales))
+        .toNumber()
+        .toFixed(2);
+      this.jisuan();
+    },
+
+    handleAvatarSuccess(res, file) {
+      this.imageUrl = res.accessUrl;
+      if (this.imageUrl) {
+        this.addRefundForm.annexPath = this.imageUrl;
+      }
+    },
+    beforeAvatarUpload(file) {
+      const isJPG = file.type === "image/jpeg";
+      const isLt2M = file.size / 1024 / 1024 < 2;
+
+      if (!isJPG) {
+        this.$message.error("上传头像图片只能是 JPG 格式!");
+      }
+      if (!isLt2M) {
+        this.$message.error("上传头像图片大小不能超过 2MB!");
+      }
+      return isJPG && isLt2M;
+    },
+    chooseClick(idList) {
+      this.getDetail(idList);
+    },
+    //创建退款单
+    submit() {
+      if (this.multipleSelection.some(it => it.matchStatus == "unmatch")) {
+        this.$message.error("已签收退货状态匹配错误,请匹配成功后重试!");
+        return false;
+      }
+
+      var flag = false;
+      var str = "";
+      if (this.addressInfo.length != 1) {
+        this.$message.error("请确保地址信息为1!");
+        return false;
+      }
+      //验证 ormorder refundType
+      if (!this.listQuery.ormorder && !this.listQuery.shopify) {
+        str = str + "网店单号shopify单号不能同时为空。";
+        flag = true;
+      }
+      if (this.queryRefundType != this.listQuery.refundType) {
+        str = str + "退款类型不匹配。";
+        flag = true;
+      }
+      if (
+        this.listQuery.ormorder &&
+        this.listQuery.ormorder != this.queryOrmorder
+      ) {
+        str = str + "网店单号不匹配";
+        flag = true;
+      }
+      if (
+        this.listQuery.shopify &&
+        this.listQuery.shopify != this.queryShopify
+      ) {
+        str = str + "shopify单号不匹配";
+        flag = true;
+      }
+      if (flag) {
+        this.$message.error(str + ",请点击查询后继续此操作");
+        return false;
+      }
+
+      //验证通过 保存逻辑
+      this.addRefundForm.ormorder = this.queryOrmorder;
+      this.addRefundForm.refundType = this.queryRefundType;
+      //退货退款仓库验证
+      if (
+        this.addRefundForm.refundType == 3 &&
+        !this.addRefundForm.warehouseCode
+      ) {
+        this.$message.error("请选择收退货仓库!");
+        return false;
+      }
+
+      if (this.multipleSelection.length == 0) {
+        this.$message.error("请选择要退的货品!");
+        return false;
+      }
+
+      var items = [];
+      this.btnLoading = true;
+      this.$confirm(
+        "退款总计:" + this.addRefundForm.refundTotalAmount + ",是否确认?",
+        "提示",
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }
+      )
+        .then(async () => {
+          for (let ind in this.multipleSelection) {
+            var obj = this.multipleSelection[ind];
+            if (!obj.refundReason) {
+              this.$alert(obj.ordersId + ":请选择退款原因");
+              this.btnLoading = false;
+              return;
+            }
+            var newobj = {
+              productName: obj.productName,
+              quantity: obj.quantity,
+              orderitemId: obj.orderitemId,
+              skuCode: obj.skuCode,
+              refundAmount: obj.refundAmount,
+              refundReason: obj.refundReason,
+              otherReason: obj.otherReason,
+              soOrdersId: obj.ordersId,
+              isGift: obj.isGift,
+              isPromotion: obj.isPromotion
+            };
+            items.push(newobj);
+          }
+          this.addRefundForm.items = items;
+          //这里默认客服发起
+          this.addRefundForm.originatorFlag = 1;
+          const saveRefund = () => {
+            saveRefundNew(this.addRefundForm).then(
+              res => {
+                if (200 == res.code) {
+                  this.$message({
+                    message: this.$t("optSuccess"),
+                    type: "success"
+                  });
+                  items = [];
+                  this.btnStyle = "display:none";
+                }
+              },
+              error => {
+                this.btnLoading = false;
+              }
+            );
+          };
+          const validPromotion = async () => {
+            // 校验是否包含促销赠品,不包含直接返回true
+            if (
+              !this.tableOrderDeatils.some(
+                item => item.isGift === "1" && item.isPromotion === 1
+              )
+            ) {
+              return true;
+            }
+            // TODO 解开注释请求校验
+            // 校验是否满足促销条件 满足返回true(不提示)
+            const { code, data } = await validPromotionReq(this.addRefundForm);
+            if (code === 200) {
+              return data.valid;
+            }
+            return false;
+          };
+          // TODO 存在赠品的订单,在客服创建未发货退款售后单时,需判断扣除已退款明细之后是否还满足促销条件,若不满足,需弹窗提示客服,由客服判断是否继续执行退款。
+          if (await validPromotion()) {
+            saveRefund();
+          } else {
+            const res = await this.$confirm(
+              "退款后订单将不满足促销条件,是否确认?",
+              "提示",
+              {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+              }
+            );
+            if (res === "confirm") {
+              saveRefund();
+            }
+          }
+        })
+        .catch(() => {
+          this.btnLoading = false;
+          this.$message({
+            type: "info",
+            message: "已取消操作"
+          });
+        });
+    },
+    //TODO 暂时关闭SL
+    ShippingLabelOption() {
+      this.addRefundForm.slUseable = "0";
+
+      if (
+        this.listQuery.refundType == 3 &&
+        this.queryRefundType == 3 &&
+        this.addressInfo &&
+        this.addressInfo.length > 0 &&
+        this.addressInfo[0].receiverCountryCode == "US" &&
+        (this.addRefundForm.warehouseCode == "PSJ-H0000024" ||
+          this.addRefundForm.warehouseCode == "PSJ-H0000019" ||
+          this.addRefundForm.warehouseCode == "PSJ-H0000011" ||
+          this.addRefundForm.warehouseCode == "PSJ-G001001" ||
+          this.addRefundForm.warehouseCode == "PSJ-G001003" ||
+          this.addRefundForm.warehouseCode == "PSJ-G001004")
+      ) {
+        this.addRefundForm.slUseable = "1";
+      } else {
+        this.addRefundForm.slUseable = "0";
+      }
+    },
+    changeSlradio() {
+      if (this.addRefundForm.slUseable == "0") {
+        this.addRefundForm.shipmodeId = "";
+        this.addRefundForm.shippingNo = "";
+      }
+    },
+    //查询条件等发生变化时触发的方法
+    validateParams() {
+      //如果退款类型,单号都有
+      if (
+        (this.listQuery.ormorder || this.listQuery.shopify) &&
+        this.listQuery.refundType
+      ) {
+        //直接触发一次重新查询
+        this.getDetail();
+      } else {
+        //参数不完整的情况,清空之前的选项 初始化数据
+        this.ShippingLabelOption();
+        //初始化数据
+        this.addRefundForm.refundAmount = 0.0;
+        this.addRefundForm.refundPostage = "0";
+        this.addRefundForm.refundPostageAmount = 0.0;
+        this.addRefundForm.warehouseCode = "";
+        this.addRefundForm.annexPath = "";
+        this.addRefundForm.items = [];
+        this.addRefundForm.oldQuantity = 0.0;
+        this.addRefundForm.refundTaxAble = "0"; //是否退税
+        this.addRefundForm.refundTaxAmount = 0.0; //退税金额
+        this.addRefundForm.refundTotalAmount = 0.0;
+        this.addRefundForm.shipmodeId = "";
+        this.addRefundForm.shippingNo = "";
+        this.addRefundForm.refundMethod = "system";
+        this.addRefundForm.refundAccountType = "PayPal";
+        this.addRefundForm.refundAccount = "";
+        this.addRefundForm.notes = "";
+        this.addressInfo = [];
+        this.listQuery.idList = null;
+        this.reasonListAll = [];
+        this.refundReasonAss = "";
+        this.refundOtherReasonAss = "";
+        this.otherReasonFlag = "";
+      }
+    },
+    back() {
+      this.$emit("back");
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.head {
+  padding: 0px 20px;
+  display: flex;
+  justify-content: space-between;
+  span:nth-child(1) {
+    font-size: 15px;
+    line-height: 25px;
+    color: #909399;
+    font-weight: 600;
+  }
+  span:nth-child(2) {
+    line-height: 25px;
+    cursor: pointer;
+    color: #ae8878;
+    font-size: 13px;
+  }
+}
+
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 82px;
+  height: 82px;
+  line-height: 82px;
+  text-align: center;
+  border-radius: 3px;
+  border: 1px solid #dcdfe6;
+  margin-left: 49px;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+.dialog_container {
+  position: relative;
+}
+.main {
+  margin-top: 15px;
+  .box {
+    .item_title {
+      color: #606266;
+      font-size: 16px !important;
+      line-height: 16px;
+      position: relative;
+      padding-left: 8px !important;
+      &:before {
+        position: absolute;
+        left: 0px;
+        top: 13px;
+        content: "";
+        display: inline-block;
+        width: 3px;
+        height: 13px;
+        background: #ae8877;
+        border-radius: 0px 0px 0px 0px;
+      }
+    }
+    .box_item {
+      padding: 0 20px;
+      display: flex;
+      .item_title {
+        line-height: 40px;
+        font-size: 18px;
+        text-align: left;
+        font-weight: 600;
+      }
+      .item_list {
+        text-align: left;
+        font-size: 14px;
+        color: #606266;
+        display: flex;
+        p {
+          margin: 10px 0;
+        }
+        div:nth-child(2) {
+          margin-left: 30px;
+        }
+      }
+    }
+    .item_title {
+      padding-left: 20px;
+      line-height: 40px;
+      font-size: 18px;
+      text-align: left;
+      font-weight: 600;
+    }
+  }
+}
+
+.ptitle {
+  display: flex;
+  justify-content: space-between;
+  margin: 20px 0px;
+  color: #1f2d3d;
+  text-align: left;
+  font-weight: bold;
+  width: 100%;
+  /deep/.el-descriptions__title {
+    color: #606266;
+  }
+}
+.filter-container {
+  .filter-item {
+    margin-right: 11px;
+  }
+}
+.container {
+  display: flex; /* 使用 Flexbox 布局 */
+  justify-content: space-between; /* 将盒子平均分布在容器中 */
+}
+.row {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  /deep/.el-form-item {
+    display: flex;
+  }
+  .inputleft {
+    margin-right: 42px;
+  }
+  .row-item {
+    margin-right: 10vw;
+    &:last-child {
+      margin-right: 0px;
+    }
+  }
+  .afertextarea {
+    width: 306px;
+  }
+}
+.el-table {
+  font-size: 12px;
+  margin: 20px 0px;
+}
+.itemtable {
+  /deep/.has-gutter {
+    .el-table__cell {
+      background: #f5f0ee;
+      padding: 0px;
+    }
+  }
+}
+.total_box {
+  margin-bottom: 20px;
+}
+.btn_box {
+  position: absolute;
+  right: 0px;
+  bottom: -24px;
+  .el-button {
+    padding: 10px 37px;
+  }
+}
+</style>

+ 5 - 2
src/views/oms/refund/refundCwList.vue

@@ -373,7 +373,7 @@
             v-if="scope.row.status == '5'"
             type="success"
             size="mini"
-            @click="handleInfo(scope.row.id, 'f_check')"
+            @click="handleInfo(scope.row.id, 'f_check', scope.row.ormorder)"
             >{{ $t("view.financialReview") }}</el-button
           >
           <!--	<el-button v-has="'ordersRefund:checkCw'" v-if="scope.row.status=='5' "  size="mini" type="success" @click="handleSuccess(scope.row)">退款成功
@@ -408,6 +408,7 @@
       <refundInfoDialog
         @refresh="refresh"
         :refundId="currentRefundId"
+        :ormOrderId="ormOrderId"
         :action="action"
       ></refundInfoDialog>
     </el-drawer>
@@ -644,6 +645,7 @@ export default {
       btnLoading: false,
       orderRefundVisible: false,
       currentOrdersId: "",
+      ormOrderId: "",
       action: "" //  view  cus_check  t_check
     };
   },
@@ -741,10 +743,11 @@ export default {
       this.getList();
     },
     //查看退款单详情
-    handleInfo(refundId, action) {
+    handleInfo(refundId, action, ormorder) {
       //进入退款单详情查看
       this.action = action;
       this.currentRefundId = refundId;
+      this.ormOrderId = ormorder;
       this.refundInfoVisible = true;
     },
     editInfo(row) {

+ 51 - 13
src/views/oms/refund/refundDetail.vue

@@ -488,19 +488,19 @@
       >
         <el-descriptions-item
           :label="$t('multipleDiscountInfo.OriginalDiscount')"
-          >{{ refundInfo.originTip }}</el-descriptions-item
+          >{{ discountInfo.originTip }}</el-descriptions-item
         >
         <el-descriptions-item
           :label="$t('multipleDiscountInfo.OriginalMoneny')"
-          >{{ refundInfo.originalOrderAmount }}</el-descriptions-item
+          >{{ discountInfo.originalOrderAmount }}</el-descriptions-item
         >
         <el-descriptions-item
           :label="$t('multipleDiscountInfo.afterReturnDiscount')"
-          >{{ refundInfo.currentTip }}</el-descriptions-item
+          >{{ discountInfo.currentTip }}</el-descriptions-item
         >
         <el-descriptions-item
           :label="$t('multipleDiscountInfo.afterReturnMoney')"
-          >{{ refundInfo.CurrentOrderAmount }}</el-descriptions-item
+          >{{ discountInfo.CurrentOrderAmount }}</el-descriptions-item
         >
         <el-descriptions-item :label="$t('multipleDiscountInfo.returnMoney')">
           {{ returnAmount > 0 ? returnAmount : 0 }}</el-descriptions-item
@@ -615,7 +615,8 @@ import {
   checkRefundCalculates,
   checkCw,
   checkKf,
-  queryShippingAmount
+  queryShippingAmount,
+  getRefundDiscount
 } from "@/api/oms/refund/refund";
 import { fetchList as reasonList } from "@/api/oms/refund/refundReason";
 import global from "@/views/oms/global";
@@ -649,7 +650,7 @@ const refundAccountTypeKeyValue = refundAccountTypeOptions.reduce(
 
 export default {
   name: "refundInfoDialog",
-  props: ["refundId", "action"],
+  props: ["refundId", "action", "ormOrderId"],
   components: {},
   data() {
     return {
@@ -875,6 +876,18 @@ export default {
         this.listLoading = false;
       });
     },
+    // 获取折扣信息
+    getDiscountInfoDetail() {
+      const query = {
+        refundNo: this.refundId,
+        ormOrderId: this.ormOrderId
+      };
+      getRefundDiscount(query).then(res => {
+        if (res.code === 200) {
+          this.discountInfo = res.data.orderPreviewVO || {};
+        }
+      });
+    },
     //获取售后详情
     initialization() {
       getRefundInfo(this.refundId)
@@ -921,18 +934,43 @@ export default {
               this.selectedWarehouseCode = "HKW002";
             }
 
-            var esCountries = ['ES','AT','BE','BG','HR',
-                              'CZ','DK','EE','FI','FR',
-                              'DE','GR','HU','IE','IT',
-                              'LV','LT','LU','NL','PL',
-                              'PT','RO','SK','SI','SE'];
+            var esCountries = [
+              "ES",
+              "AT",
+              "BE",
+              "BG",
+              "HR",
+              "CZ",
+              "DK",
+              "EE",
+              "FI",
+              "FR",
+              "DE",
+              "GR",
+              "HU",
+              "IE",
+              "IT",
+              "LV",
+              "LT",
+              "LU",
+              "NL",
+              "PL",
+              "PT",
+              "RO",
+              "SK",
+              "SI",
+              "SE"
+            ];
 
             if (esCountries.includes(this.addressInfo.receiverCountryCode)) {
-                this.refundInfo.warehouseCode = 'ESPW03';
-                this.selectedWarehouseCode = 'ESPW03';
+              this.refundInfo.warehouseCode = "ESPW03";
+              this.selectedWarehouseCode = "ESPW03";
             }
           }
         });
+      if (this.ormOrderId) {
+        this.getDiscountInfoDetail();
+      }
     },
     //复制
     copy(event) {

+ 6 - 2
src/views/oms/refund/refundList.vue

@@ -500,7 +500,7 @@
           <el-button
             type="primary"
             size="mini"
-            @click="handleInfo(scope.row.id, 'view')"
+            @click="handleInfo(scope.row.id, 'view', scope.row.ormorder)"
             >{{ $t("view.details") }}</el-button
           >
           <el-button
@@ -623,6 +623,7 @@
       <refundInfoDialog
         @refresh="refresh"
         :refundId="currentRefundId"
+        :ormOrderId="ormOrderId"
         :action="action"
       ></refundInfoDialog>
     </el-drawer>
@@ -1058,6 +1059,7 @@ export default {
       orderRefundVisible: false,
       orderRefundNewVisible: false,
       createRefundVisible: false,
+      ormOrderId: "", // 网店单号
       currentOrdersId: "",
       action: "", //  view  cus_check  t_check
       slFlag: "0",
@@ -1245,11 +1247,13 @@ export default {
     /**
      *
      * @param refundId 退款单号
+     * @param ormorder 网店单号
      * @param action 动作: view 查看 , cus_check 客服审核 f_check 财务审核
      */
-    handleInfo(refundId, action) {
+    handleInfo(refundId, action, ormorder) {
       //进入退款单详情查看
       this.currentRefundId = refundId;
+      this.ormOrderId = ormorder;
       this.action = action;
       this.refundInfoVisible = true;
     },

+ 33 - 25
vue.config.js

@@ -27,8 +27,37 @@ module.exports = {
     },
     public: "0.0.0.0:9527", //可以实现热部署
     proxy: {
+      // [process.env.VUE_APP_OAUTH_API]: {
+      //   target: `http://localhost:19090/sso`,
+      //   changeOrigin: true,
+      //   // logLevel: 'debug', //打印日志
+      //   pathRewrite: {
+      //     ['^' + process.env.VUE_APP_OAUTH_API]: ''
+      //   }
+      // },
+      // [process.env.VUE_APP_PIM_API]: {
+      //   target: `http://localhost:18080/pim`,
+      //   changeOrigin: true,
+      //   // logLevel: 'debug', //打印日志
+      //   pathRewrite: {
+      //     ['^' + process.env.VUE_APP_PIM_API]: ''
+      //   }
+      // },
+      // [process.env.VUE_APP_OMS_API]: {
+      //   target: `http://localhost:18081/oms`,
+      //   changeOrigin: true,
+      //   // logLevel: 'debug', //打印日志
+      //   pathRewrite: {
+      //     ['^' + process.env.VUE_APP_OMS_API]: ''
+      //   }
+      // }
+      // "/": {
+      //   target: "https://testfoms.gloria.com.cn",
+      //   changeOrigin: true
+      // },
+      //http://10.41.3.152:18081  http://10.41.3.65:19090
       [process.env.VUE_APP_OAUTH_API]: {
-        target: `http://localhost:19090/sso`,
+        target: `http://10.41.3.65:19090/sso`,
         changeOrigin: true,
         // logLevel: 'debug', //打印日志
         pathRewrite: {
@@ -36,7 +65,7 @@ module.exports = {
         }
       },
       [process.env.VUE_APP_PIM_API]: {
-        target: `http://localhost:18080/pim`,
+        target: `http://10.41.3.65:18081/pim`,
         changeOrigin: true,
         // logLevel: 'debug', //打印日志
         pathRewrite: {
@@ -44,34 +73,13 @@ module.exports = {
         }
       },
       [process.env.VUE_APP_OMS_API]: {
-        target: `http://localhost:18081/oms`,
+        target: `http://10.41.3.106:18081/oms`,
         changeOrigin: true,
         // logLevel: 'debug', //打印日志
         pathRewrite: {
           ['^' + process.env.VUE_APP_OMS_API]: ''
         }
-      }
-      // "/": {
-      //   target: "https://testfoms.gloria.com.cn",
-      //   changeOrigin: true
-      // },
-      //http://10.41.3.152:18081  http://10.41.3.65:19090
-      // [process.env.VUE_APP_OAUTH_API]: {
-      //   target: `http://10.41.3.65:19090/sso`,
-      //   changeOrigin: true,
-      //   // logLevel: 'debug', //打印日志
-      //   pathRewrite: {
-      //     ['^' + process.env.VUE_APP_OAUTH_API]: ''
-      //   }
-      // },
-      // [process.env.VUE_APP_PIM_API]: {
-      //   target: `http://10.41.3.65:18081/pim`,
-      //   changeOrigin: true,
-      //   // logLevel: 'debug', //打印日志
-      //   pathRewrite: {
-      //     ['^' + process.env.VUE_APP_PIM_API]: ''
-      //   }
-      // },
+      },
       // [process.env.VUE_APP_OMS_API]: {
       //   target: `http://10.41.3.65:18081/oms`,
       //   changeOrigin: true,