tyler il y a 2 ans
Parent
commit
ee6dbe6cf8
3 fichiers modifiés avec 1376 ajouts et 170 suppressions
  1. 8 1
      src/router/modules/user.js
  2. 1361 0
      src/views/user/welcome-pack-form.vue
  3. 7 169
      src/views/user/welcome-pack.vue

+ 8 - 1
src/router/modules/user.js

@@ -29,7 +29,14 @@ const userRouter = {
       component: () => import('@/views/profile/index'),
       name: 'Profile',
       meta: { title: 'Personal Info', icon: 'user', noCache: true }
-    }
+    },
+    //welcome-pack-form
+    {
+      path: 'welcome-pack-form', // 会员报单/BA升级form
+      component: () => import('@/views/user/welcome-pack-form'),
+      name: 'welcomePack',
+      meta: { title: 'Member Welcome Pack', icon: 'user', keepAlive: true  }
+    },
   ]
 }
 export default userRouter

+ 1361 - 0
src/views/user/welcome-pack-form.vue

@@ -0,0 +1,1361 @@
+<template>
+  <div v-loading="loading" style="width: 100%">
+    <el-row :gutter="20">
+      <el-col :xs="24" :sm="24" :lg="14">
+        <div class="dec-header flexJcsbAc" style="">
+          <div class="classification">
+            <div class="decTabs flexJcfsAc">
+              <div
+                v-for="(item, index) in classifiedProductList"
+                :key="item.CATEGORY_TYPE"
+                :label="item.CATEGORY_TYPE"
+                :name="item.CATEGORY_TYPE"
+                class="tabItem"
+                :class="{ active: activeIndex == index }"
+                @click="chooseNav(item, index)"
+              >
+                <span>type{{ item.CATEGORY_TYPE }}</span>
+              </div>
+            </div>
+          </div>
+          <div class="openAllClassification flexfc" @click="drawer = true">
+            <span class="">全部</span>
+            <i class="el-icon-more-outline"></i>
+          </div>
+          <!-- 全部分类 -->
+          <el-drawer
+            title="全部分类"
+            :visible.sync="drawer"
+            :direction="direction"
+            :modal-append-to-body="false"
+          >
+            <div class="allClassification flexFwW">
+              <div
+                class="title"
+                v-for="(item, index) in classifiedProductList"
+                :key="index"
+                :class="{ active: activeIndex == index }"
+                @click="drawerClassification(item, index)"
+              >
+                <span>{{ item.CATEGORY_TYPE }}</span>
+              </div>
+            </div>
+          </el-drawer>
+        </div>
+      </el-col></el-row
+    >
+    <div class="white-box" style="padding: 0 20px; margin-top: 20px">
+      <el-row :gutter="20">
+        <el-col :xs="24" :sm="24" :lg="14">
+          <el-form
+            ref="form"
+            label-width="180px"
+            :label-position="labelPosition"
+            class="form-page"
+          >
+            <el-form-item :label="$t('user.welcomePackWay')">
+              <el-radio-group v-model="form.decType" @change="decTypeChange">
+                <el-radio size="small" label="normal">{{
+                  $t("user.normal")
+                }}</el-radio>
+                <!--								<el-radio size="small" label="ba">{{ $t('user.BAUpgrade') }}</el-radio>-->
+              </el-radio-group>
+            </el-form-item>
+
+            <el-divider content-position="left">{{
+              $t("user.accountInformation")
+            }}</el-divider>
+            <el-form-item :label="$t('user.newMemberCode')">
+              <el-input
+                v-model="form.insertUserName"
+                :readonly="userReadOnly"
+                @blur="checkBaUser"
+              />
+            </el-form-item>
+            <el-form-item :label="$t('user.entryLevel')">
+              <el-select
+                v-model="form.decLv"
+                :placeholder="$t('user.selectEntryLevel')"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="item in allDecLevel"
+                  :key="item.ID"
+                  :label="item.LEVEL_NAME"
+                  :value="item.ID"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('user.stockistCode')">
+              <el-input v-model="form.decUserName" :disabled="isDec == '1'" />
+            </el-form-item>
+
+            <!-- <el-form-item>
+              <template slot="label">
+                {{ $t("user.selectWelcomePack") }}
+              </template>
+              <el-tabs
+                v-model="decWay"
+                type="border-card"
+                style="position: relative; width: 100%"
+              >
+                <el-tab-pane :label="$t('shop.product')" name="2">
+                  <el-collapse v-model="activeName" accordion>
+                    <el-collapse-item name="product">
+                      <el-table
+                      v-if="classifiedProductList.length > 0"
+                        :data="classifiedProductList[activeIndex].list"
+                        :show-header="false"
+                        @selection-change="handleSelectionChange"
+                      >
+                        <el-table-column
+                          type="selection"
+                          width="30"
+                          align="center"
+                          style="top: -30px"
+                        />
+                        <el-table-column align="center">
+                          <template slot-scope="{ row, $index }">
+                            <el-container>
+                              <el-aside
+                                width="80px"
+                                style="
+                                  padding: 0;
+                                  margin-bottom: 0;
+                                  background-color: #ffffff;
+                                "
+                              >
+                                <el-image
+                                  style="width: 80px; height: 80px"
+                                  :src="tool.getArImage(row.COVER, '/files/')"
+                                />
+                              </el-aside>
+                              <el-main style="padding: 0">
+                                <div
+                                  style="text-align: left; line-height: 25px"
+                                >
+                                  <span
+                                    style="font-weight: bold; cursor: pointer"
+                                    @click="handleProduct(row)"
+                                    >{{ row.GOODS_NAME }}</span
+                                  ><br />
+                                  <span>{{ row.GOODS_NO }}</span
+                                  ><br />
+                                  <span style="color: tomato"
+                                    >{{ $t("shop.productPrice") }}:{{
+                                      $t("currency.sign")
+                                    }}
+                                    {{
+                                      row.SELL_PRICE | toThousandFilter
+                                    }}</span
+                                  ><br />
+                                  <span
+                                    >{{ $t("shop.productBV") }}:{{
+                                      row.PRICE_PV | toThousandFilter
+                                    }}</span
+                                  ><br />
+                                  <span
+                                    style="display: inline-block; float: right"
+                                  >
+                                    <el-input-number
+                                      v-model="storeNums[$index]"
+                                      size="mini"
+                                      :min="1"
+                                      :max="Number(row.STORE_NUMS)"
+                                      @change="handleInputNumber($event, row)"
+                                    />
+                                  </span>
+                                  <br />
+                                </div>
+                              </el-main>
+                            </el-container>
+                          </template>
+                        </el-table-column>
+                      </el-table>
+                    </el-collapse-item>
+                  </el-collapse>
+
+                  <div class="white-box-footer">
+                    <div
+                      class="flex data"
+                      style="
+                        float: right;
+                        display: inline-block;
+                        line-height: 30px;
+                        font-size: 14px;
+                        margin-top: 15px;
+                        margin-bottom: 10px;
+                        border: 1px solid #dcdfe6;
+                        border-radius: 4px;
+                        padding: 0 5px;
+                      "
+                    >
+                      <div style="margin-right: 1rem; display: inline-block">
+                        {{ $t("shop.productPrice") }}:{{ $t("currency.sign") }}
+                        {{ sellPriceSum | toThousandFilter }}
+                      </div>
+                      <div style="margin-right: 1rem; display: inline-block">
+                        {{ $t("shop.productBV") }}:{{
+                          pricePvSum | toThousandFilter
+                        }}
+                      </div>
+                      <div style="display: inline-block">
+                        {{ $t("shop.taxAmount") }}:{{ $t("currency.sign") }}
+                        {{ taxSum }}
+                      </div>
+                    </div>
+                  </div>
+                </el-tab-pane>
+              </el-tabs>
+            </el-form-item> -->
+
+            <el-divider content-position="left">{{
+              $t("atlas.networkInformation")
+            }}</el-divider>
+            <el-form-item :label="$t('shop.sponsorCode')">
+              <el-input
+                v-model="form.recUserName"
+                :readonly="recReadOnly"
+                @change="handleChkRecUser"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-input v-model="recRealName" :disabled="true" />
+            </el-form-item>
+            <el-form-item :label="$t('atlas.placementCode')">
+              <el-input v-model="form.conUserName" @change="handleChkConUser" />
+            </el-form-item>
+            <el-form-item>
+              <el-input
+                v-model="conRealName"
+                type="textarea"
+                :rows="2"
+                :disabled="true"
+              />
+            </el-form-item>
+            <el-form-item :label="$t('atlas.placementTree')">
+              <el-radio-group v-model="form.location" border>
+                <el-radio :label="1">{{ $t("atlas.left") }}</el-radio>
+                <el-radio :label="2">{{ $t("atlas.right") }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item
+              ><!--自动安置区位-->
+              <el-row :gutter="5">
+                <el-col :xs="24" :sm="12" :lg="12">
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="setAutoPlace('left')"
+                    >{{ $t("atlas.placementAutoLeft") }}</el-button
+                  >
+                </el-col>
+                <el-col :xs="24" :sm="12" :lg="12">
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="setAutoPlace('right')"
+                    >{{ $t("atlas.placementAutoRight") }}</el-button
+                  >
+                </el-col>
+              </el-row>
+            </el-form-item>
+
+            <el-divider content-position="left">{{
+              $t("profile.personalInformation")
+            }}</el-divider>
+            <el-form-item :label="$t('shop.memberName')">
+              <el-input v-model="form.realName" />
+            </el-form-item>
+            <el-form-item :label="$t('shop.phoneNumber')">
+              <el-input v-model="form.mobile" />
+            </el-form-item>
+            <el-form-item :label="$t('user.email')">
+              <el-input v-model="form.email" />
+            </el-form-item>
+            <el-form-item :label="$t('profile.loginPassword')">
+              <el-input
+                v-model="form.password"
+                maxlength="32"
+                :placeholder="$t('profile.enterLoginPassword')"
+              />
+            </el-form-item>
+            <el-form-item :label="$t('profile.paymentPassword')">
+              <el-input
+                v-model="form.payPassword"
+                maxlength="32"
+                :placeholder="$t('profile.enterPaymentPassword')"
+              />
+            </el-form-item>
+            <el-form-item :label="$t('shop.recipientName')">
+              <el-input v-model="form.consignee" />
+            </el-form-item>
+            <el-form-item :label="$t('shop.phoneNumber')">
+              <el-input v-model="form.acceptMobile" />
+            </el-form-item>
+            <el-form-item :label="$t('shop.shipping')">
+              <el-radio-group v-model="form.way" @change="wayChange">
+                <el-radio label="express">{{ $t("shop.delivery") }}</el-radio>
+                <el-radio label="pickup">{{ $t("shop.selfPickUp") }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+            <el-form-item prop="areaSelected" :label="$t('config.state')">
+              <el-cascader
+                v-model="form.areaSelected"
+                :disabled="areaDisabled"
+                size="large"
+                :placeholder="$t('shop.delivery')"
+                :options="regionData"
+                style="width: 100%"
+              />
+            </el-form-item>
+            <el-form-item :label="$t('config.detailedAddress')">
+              <el-input v-model="form.address" :disabled="addressDisabled" />
+            </el-form-item>
+            <el-form-item :label="$t('config.city')">
+              <el-input v-model="form.cityName" :disabled="addressDisabled" />
+            </el-form-item>
+            <el-form-item :label="$t('config.localGovernmentArea')">
+              <el-input v-model="form.lgaName" :disabled="addressDisabled" />
+            </el-form-item>
+
+            <el-divider content-position="left">{{
+              $t("finance.bankInformation")
+            }}</el-divider>
+            <el-form-item :label="$t('finance.bankName')">
+              <el-select
+                v-model="form.openBank"
+                :placeholder="$t('finance.selectBank')"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="(item, index) in allOpenBank"
+                  :key="index"
+                  :label="item.BANK_NAME"
+                  :value="item.BANK_CODE"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item :label="$t('finance.accountName')">
+              <el-input v-model="form.bankAddress" />
+            </el-form-item>
+            <el-form-item :label="$t('finance.bankAccount')">
+              <el-input v-model="form.bankNo" maxlength="50" />
+            </el-form-item>
+
+            <el-divider content-position="left">{{
+              $t("user.payInfo")
+            }}</el-divider>
+            <el-form-item :label="$t('shop.paymentMethod')" required>
+              <el-radio-group v-model="form.payType" @change="chosePayType">
+                <el-radio
+                  v-for="(item, index) in payList"
+                  :key="index"
+                  border
+                  :label="item.label"
+                  style="margin: 5px"
+                >
+                  {{ item.name
+                  }}<span v-if="item.label === 'cash'" style="color: tomato"
+                    >({{ $t("currency.sign") }} {{ userBalance.cash }})</span
+                  >
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+
+            <el-form-item>
+              <el-button
+                size="small"
+                type="primary"
+                :loading="submitButtonStat"
+                @click="onSubmit"
+                >{{ $t("common.save") }}</el-button
+              >
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- payStack模态框 -->
+    <el-dialog
+      v-loading="payStackLoading"
+      :title="$t('shop.goPay')"
+      :visible.sync="visible"
+      :width="payStackScreenWidth"
+      :before-close="handleClose"
+    >
+      <section>
+        <el-form :model="payForm">
+          <el-form-item :label="$t('user.email')" label-width="100px" required>
+            <el-input v-model="payForm.email" autocomplete="off" />
+          </el-form-item>
+          <el-form-item :label="$t('shop.amount')" label-width="100px" required>
+            <el-input v-model="payForm.amount" autocomplete="off" readonly />
+          </el-form-item>
+        </el-form>
+      </section>
+      <paystack
+        :firstname="payForm.firstname"
+        :lastname="payForm.lastname"
+        :amount="payForm.amount * 100"
+        :email="payForm.email"
+        :metadata="payForm.metadata"
+        :currency="payForm.currency"
+        :paystackkey="payForm.publicKey"
+        :reference="reference"
+        :channels="channels"
+        :callback="processPayment"
+        :close="handleClose"
+      >
+        <el-button type="primary" size="small">{{
+          $t("shop.goPay")
+        }}</el-button>
+      </paystack>
+      <el-button
+        type="danger"
+        size="small"
+        class="cancelButton"
+        style="margin-left: 10px"
+        @click="handleClose"
+        >{{ $t("common.cancel") }}</el-button
+      >
+    </el-dialog>
+
+    <!-- 倒计时页面 -->
+    <el-dialog
+      :title="$t('common.hint')"
+      :visible.sync="payDialog"
+      :width="payStackScreenWidth"
+      :show-close="false"
+      :close="handleOrderList"
+    >
+      <el-card shadow="always">
+        <el-result
+          icon="success"
+          :title="$t('common.successfully')"
+          :sub-title="$t('shop.successOrderTips')"
+        >
+          <template slot="extra">
+            <el-button type="primary" size="medium" @click="handleOrderList"
+              >{{ $t("shop.goBack") }}({{ countdown }})</el-button
+            >
+          </template>
+        </el-result>
+      </el-card>
+    </el-dialog>
+
+    <!-- 商品详情 -->
+    <el-dialog
+      :title="product.GOODS_NO"
+      :visible.sync="visibleProduct"
+      :width="screenWidth"
+      style="margin-top: -95px"
+    >
+      <el-row :gutter="20">
+        <el-col :xs="24" :sm="12" :lg="12">
+          <el-image
+            style="width: 100%; height: 100%"
+            :style="imageStyle"
+            :src="tool.getArImage(product.COVER, '/files/')"
+          />
+        </el-col>
+        <el-col :xs="24" :sm="12" :lg="12">
+          <div style="text-align: left; line-height: 50px; font-size: 16px">
+            <span style="font-weight: bold; font-size: 20px">{{
+              product.GOODS_NAME
+            }}</span
+            ><br />
+            <span style="font-weight: bold; font-size: 15px"
+              >{{ $t("shop.productCode") }}:{{ product.GOODS_NO }}</span
+            ><br />
+            <span style="color: tomato"
+              >{{ $t("shop.productPrice") }}:{{ $t("currency.sign") }}
+              {{ product.SELL_PRICE }}</span
+            ><br />
+            <span>{{ $t("shop.productBV") }}:{{ product.PRICE_PV }}</span
+            ><br />
+            <span>{{ $t("shop.taxRate") }}:{{ product.TAX_RATE / 100 }}</span
+            ><br />
+            <span
+              >{{ $t("shop.taxAmount") }}:{{ $t("currency.sign") }}
+              {{ product.taxAmount }}</span
+            ><br />
+            <span>{{ $t("shop.inventory") }}:{{ product.STORE_NUMS }}</span>
+          </div>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { deleteApproachOrder } from "@/api/shop";
+import {
+createWelcomePack,
+fetchAutoPlace,
+fetchBrandAmbassadorInfo,
+fetchFullInfo,
+fetchWelcomePack,
+} from "@/api/user";
+import Pagination from "@/components/Pagination";
+import waves from "@/directive/waves";
+import region from "@/store/modules/region";
+import { getScreenWidth } from "@/utils";
+import tool from "@/utils/tool";
+import usersInfo from "@/utils/usersInfo";
+import paystack from "vue-paystack";
+
+export default {
+  name: "WelcomePack",
+  components: { Pagination, paystack },
+  directives: { waves },
+  filters: {
+    bvFilter(row) {
+      return tool.calculateBV(row.REAL_PV, row.BUY_NUMS);
+    },
+    taxAmountFilter(row) {
+      return tool.calculateTax(row.REAL_PRICE, row.BUY_NUMS);
+    },
+    priceAmountFilter(row) {
+      return tool.formatPrice(row.REAL_PRICE * row.BUY_NUMS);
+    },
+    statusFilter(status) {
+      const statusMap = {
+        Unpaid: "info",
+        Paid: "success",
+      };
+      return statusMap[status];
+    },
+  },
+  data() {
+    return {
+      loading: false,
+      tool: tool,
+
+      allGoods: [],
+      numList: [],
+      categoryType: "",
+      sellType: [],
+      payList: [],
+      screenWidth: getScreenWidth() > 600 ? "500px" : getScreenWidth() + "px",
+      labelPosition: getScreenWidth() > 600 ? "right" : "top",
+      payStackScreenWidth:
+        getScreenWidth() > 500 ? "450px" : getScreenWidth() + "px",
+
+      dialog: false,
+      dialogLoading: false,
+
+      multipleSelection: [],
+      sellPriceSum: 0.0,
+      pricePvSum: 0.0,
+      taxSum: 0.0,
+      storeNums: [],
+      tableData: null,
+      payAmount: 0.0,
+
+      cashCurrency: "",
+      currency: {},
+      pointsSum: 0,
+      cashSum: 0,
+      pointFreight: 0,
+      freeShipping: "",
+      goodsId: "",
+      goodsNum: "",
+      payPassword: "",
+      submitButtonStat: false,
+      sn: "",
+      orderType: "",
+      payDialog: false,
+      countdown: 5,
+      visible: false,
+      totalAmount: 0.0,
+      freight: 0.0,
+      userBalance: {
+        cash: 0,
+      },
+
+      payType: "cash",
+      payStackLoading: false,
+      channels: ["card", "bank", "ussd", "qr"],
+      payForm: {
+        publicKey: process.env.VUE_APP_BASE_PAY_STACK_PUBLIC_KEY,
+        currency: "NGN",
+        firstname: usersInfo.userName(),
+        lastname: "",
+        email: usersInfo.userEmail(),
+        amount: 0,
+        orderSn: "",
+        metadata: {
+          cart_id: "",
+          custom_fields: [
+            {
+              display_name: "orderSn",
+              variable_name: "orderSn",
+              value: this.sn,
+            },
+            {
+              display_name: "orderType",
+              variable_name: "orderType",
+              value: "baDec",
+            },
+          ],
+        },
+      },
+
+      addressId: "",
+      selfPickUpAddressId: "100000000000000000",
+      shippingAddressList: [],
+
+      visibleProduct: false,
+      product: {
+        GOODS_NAME: "",
+        GOODS_NO: "",
+        COVER: "",
+        SELL_PRICE: 0,
+        PRICE_PV: 0,
+        TAX_RATE: 0,
+        taxAmount: 0,
+      },
+      imageStyle: "margin-top: -50px;",
+
+      decWay: "2",
+      regionData: region.regionInfo.regionData,
+      form: {
+        decType: "normal",
+        realName: "",
+        decLv: "",
+        insertUserName: "",
+        decUserName: "",
+        recUserName: "",
+        conUserName: "",
+        insertUserIdCard: "",
+        consignee: "",
+        acceptMobile: "",
+        areaSelected: [],
+        address: "",
+        openBank: "",
+        bankAddress: "",
+        bankProvince: "",
+        bankCity: "",
+        bankCounty: "",
+        bankNo: "",
+        bankAreaSelected: [],
+        password: "111111",
+        payPassword: "111111",
+        mobile: "",
+        email: "",
+        packageId: "",
+        goodsId: [],
+        goodsNum: [],
+        province: "",
+        cityName: "",
+        lgaName: "",
+        way: "express",
+        payType: "",
+        autoPlace: "",
+        location: "",
+      },
+
+      conRealName: "-",
+      recRealName: "-",
+      areaDisabled: false,
+      addressDisabled: false,
+
+      userReadOnly: true,
+      recReadOnly: false,
+      allDecLevel: usersInfo.getBaseInfo().decLevels,
+      allOpenBank: [],
+
+      activeName: "product",
+      isDec: null,
+      // header start
+      headerActiveName: "1",
+      activeIndex: 0,
+      titleInfo: null,
+      tabList: [
+        {
+          title: "Tab1",
+          name: "1",
+        },
+        {
+          title: "Tab2",
+          name: "2",
+        },
+        {
+          title: "Tab3",
+          name: "3",
+        },
+        {
+          title: "Tab4",
+          name: "4",
+        },
+        {
+          title: "Tab5",
+          name: "5",
+        },
+        {
+          title: "Tab6",
+          name: "6",
+        },
+        {
+          title: "Tab7",
+          name: "7",
+        },
+        {
+          title: "Tab8",
+          name: "8",
+        },
+        {
+          title: "Tab9",
+          name: "9",
+        },
+      ],
+      drawer: false,
+      direction: "ttb",
+      drawerWidth: "50%",
+      classifiedProductList:[]
+      // header end
+    };
+  },
+  computed: {
+    // PayStack混淆串
+    reference() {
+      let text = "";
+      const possible =
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+      for (let i = 0; i < 10; i++) {
+        text += possible.charAt(Math.floor(Math.random() * possible.length));
+      }
+      return text;
+    },
+  },
+  watch: {
+    isDec: {
+      handler(newValue, old) {
+        if (newValue == "1") {
+          this.form.decUserName = usersInfo.userName();
+        }
+      },
+    },
+  },
+  created() {
+    const regionInfo = this.$store.getters.regionInfo;
+    // console.log(this.$store.state.region)
+    this.fetchWelcomePack();
+  },
+  methods: {
+    //header start
+    chooseNav(item, index) {
+      this.titleInfo = item;
+      this.headerActiveName = item.name;
+      this.activeIndex = index;
+      this.$nextTick(() => {
+        const item = this.$el.querySelectorAll(".tabItem")[index];
+        const container = document.querySelector(".decTabs");
+        const scrollLeft =
+          item.offsetLeft - (container.offsetWidth - item.offsetWidth) / 2;
+        container.scrollTo({
+          left: scrollLeft,
+          behavior: "smooth",
+        });
+      });
+    },
+    drawerClassification(item, index) {
+      this.chooseNav(item, index);
+      this.drawer = false;
+    },
+    //end
+    // 会员报单/BA升级
+    fetchWelcomePack() {
+      this.loading = true;
+      fetchWelcomePack().then((response) => {
+        this.form.insertUserName = response.data.userName;
+        this.allOpenBank = response.data.allOpenBank;
+        this.allDecPackage = response.data.allDecPackage;
+        this.allGoods = response.data.allGoods;
+        this.userBalance = response.data.userBalance;
+        this.categoryType = 1;
+        //是否是报单中心
+        this.isDec = response.data.isDec;
+        const settingObj = this.allGoods;
+        for (const i in this.allGoods) {
+          this.storeNums[i] = 1;
+          settingObj[i].goodsNum = 0;
+        }
+
+        this.tableData = Object.values(settingObj);
+        const pageList = this.multipleSelection;
+        this.$nextTick(function () {
+          for (const i in this.tableData) {
+            for (const j in pageList) {
+              if (pageList[j].ID === this.tableData[i].ID) {
+                this.$data.storeNums[i] = pageList[j].goodsNum;
+                this.tableData[i].goodsNum = pageList[j].goodsNum;
+                break;
+              }
+            }
+          }
+        });
+        this.classifiedProductList = this.handleSameTypeList(this.tableData);
+        // console.log(handleSameTypeList);
+        // 支付方式
+        this.payList = response.data.sellType[0]["sell_type"];
+        // 支付方式的第一项默认选中
+        this.form.payType = Object.values(this.payList)[1]["label"];
+
+        setTimeout(() => {
+          this.loading = false;
+        }, 0.5 * 1000);
+      });
+    },
+
+    handleSameTypeList(goodsList) {
+      let list = goodsList;
+      let list2 = [
+        {
+          ID: "481221711786807210",
+          GOODS_NAME: "ULTRA EPP 1",
+          CATE_ID: "1",
+          TYPE: "0",
+          GOODS_NO: "ENBPUL2N-1",
+          UNIT: "box",
+          COVER: "b159e6ca213a30659e2df0e24c0663ad.jpg",
+          IMAGES: null,
+          CONTENT: "ELKAN BIO PURE ULTRA EPP 1ST PAYMENT",
+          SELL_PRICE: "68000.00",
+          SELL_PRICE_STANDARD: "113.33",
+          MARKET_PRICE: "81600.00",
+          PRICE_PV: "30.00",
+          TAX_RATE: "7.50",
+          STORE_NUMS: "9995",
+          STATUS: "1",
+          CREATED_AT: "1679980284",
+          UPDATED_AT: "1680600159",
+          SORT: "1",
+          IS_DEL: "0",
+          DELETED_AT: "0",
+          POINT: "0",
+          SELL_TYPE: "1,7",
+          GIFT_TYPE: "1,2",
+          SELL_DISCOUNT: "1",
+          CATEGORY_TYPE: "2",
+          STATUS_DATE: "0",
+          GOODS_DATE: null,
+          GOODS_STATUS_DATE: "0",
+          PV_SPLIT: "0",
+          INSTALMENT: "1",
+          DISCOUNT: 100,
+        },
+      ];
+      list = list.concat(list2);
+
+      let dataArr = [];
+      let category_type_list = [];
+
+      list.map((mapItem) => {
+        if (dataArr.length == 0) {
+          dataArr.push({
+            CATEGORY_TYPE: mapItem.CATEGORY_TYPE,
+            list: [mapItem],
+          });
+          category_type_list.push(mapItem.CATEGORY_TYPE);
+        } else {
+          let res = dataArr.some((item) => {
+            //判断相同类型,有就添加到当前项
+            if (item.CATEGORY_TYPE == mapItem.CATEGORY_TYPE) {
+              item.list.push(mapItem);
+              // category_type_list.push(item.CATEGORY_TYPE)
+              return true;
+            }
+          });
+          if (!res) {
+            //如果没找相同类型添加一个新对象
+            dataArr.push({
+              CATEGORY_TYPE: mapItem.CATEGORY_TYPE,
+              list: [mapItem],
+            });
+            category_type_list.push(mapItem.CATEGORY_TYPE);
+          }
+        }
+      });
+
+      return dataArr;
+    },
+    // 商品详情
+    handleProduct(row) {
+      this.product = row;
+      this.product.taxAmount = tool.calculateTax(row.SELL_PRICE, row.TAX_RATE);
+      this.visibleProduct = true;
+    },
+    // 选择商品计数
+    handleInputNumber(current, row) {
+      const pageList = this.multipleSelection;
+      let selectStatus = false;
+      for (const i in pageList) {
+        if (pageList[i].ID === row.ID) {
+          pageList[i].goodsNum = current;
+          selectStatus = true;
+          break;
+        }
+      }
+      if (selectStatus) {
+        this.multipleSelection = pageList;
+        this.handleSureChange();
+      }
+    },
+    // 统计商品
+    handleSureChange() {
+      if (this.multipleSelection.length > 0) {
+        let accumulatorSellPrice = 0;
+        let accumulatorPricePv = 0;
+        let accumulatorTax = 0;
+        this.multipleSelection.forEach((accumulator) => {
+          accumulatorSellPrice += accumulator.SELL_PRICE * accumulator.goodsNum;
+          accumulatorPricePv +=
+            Number(accumulator.PRICE_PV) * Number(accumulator.goodsNum);
+          accumulatorTax += tool.calculateTax(
+            Number(accumulator.SELL_PRICE),
+            Number(accumulator.TAX_RATE),
+            Number(accumulator.goodsNum)
+          );
+        });
+
+        this.sellPriceSum = tool.formatPrice(accumulatorSellPrice);
+        this.pricePvSum = tool.formatPrice(accumulatorPricePv);
+        this.taxSum = tool.formatPrice(accumulatorTax);
+
+        this.display = true;
+      } else {
+        this.sellPriceSum = this.pricePvSum = this.taxSum = 0.0;
+        this.display = true;
+      }
+    },
+    // 选择商品
+    handleSelectionChange(val) {
+      let idx = -1;
+      let num;
+      for (const i in this.tableData) {
+        for (const v in val) {
+          if (val[v].ID === this.tableData[i].ID) {
+            idx = i;
+            num = this.storeNums[idx];
+            val[v]["goodsNum"] = num;
+            break;
+          }
+        }
+      }
+      this.multipleSelection = val;
+      // 计算统计
+      this.handleSureChange();
+    },
+    // 选择收货地址
+    choseAddress(addressId) {
+      this.addressId = addressId;
+      // 设置运费
+      this.setFreight();
+      // 计算价格
+      this.getSumMoney();
+    },
+    // 切换支付方式
+    chosePayType(type) {
+      this.payType = type;
+    },
+    // 关闭支付回调
+    handleClose() {
+      this.$confirm(this.$t("shop.confirmClose")).then((_) => {
+        deleteApproachOrder({ orderSn: this.form.orderSn }).then(() => {
+          // 关闭支付模态框
+          this.visible = false;
+          // 关闭购物车
+          this.visibleShoppingCart = false;
+          this.submitButtonStat = false;
+        });
+      });
+    },
+    // 支付成功回调
+    processPayment() {
+      // 关闭支付页面
+      this.visible = false;
+      this.payStackLoading = false;
+      // 显示支付成功模态框
+      this.payDialog = true;
+      // 启动支付成功倒计时
+      this.handleCountdown();
+    },
+    // 倒计时结束跳转
+    handleOrderList() {
+      this.$router.push({ path: `/shop/member-order` });
+    },
+    // 启动倒计时
+    handleCountdown() {
+      // 创建定时器
+      setInterval(() => {
+        // 每隔1秒把time的值减一,赋值给span标签
+        this.countdown--;
+        if (this.countdown === 0) {
+          // 倒计时结束,跳转到订单列表
+          this.$router.push({ path: `/shop/member-order` });
+        }
+      }, 1000);
+    },
+    // 会员查询
+    handleChkRecUser() {
+      this.form.conUserName = "";
+      this.conRealName = "-";
+      this.form.autoPlace = "";
+      if (this.form.recUserName) {
+        this.loading = true;
+        fetchFullInfo({ userName: this.form.recUserName })
+          .then((response) => {
+            this.recRealName = response.data.REAL_NAME;
+            this.loading = false;
+          })
+          .catch(() => {
+            this.recRealName = "-";
+            this.loading = false;
+          });
+      }
+    },
+    // 返回方式
+    wayChange() {
+      if (this.form.way === "pickup") {
+        this.areaDisabled = true;
+        this.addressDisabled = true;
+      } else {
+        this.areaDisabled = false;
+        this.addressDisabled = false;
+      }
+    },
+    // 会员报单/BA升级
+    onSubmit() {
+      if (!this.form.decLv) {
+        this.$message({
+          message: this.$t("profile.selectLevel"),
+          type: "error",
+        });
+        return false;
+      }
+      // 已选择商品
+      this.selectProduct();
+      if (this.multipleSelection.length <= 0) {
+        this.$message.error(this.$t("shop.chooseTips"));
+        return false;
+      }
+      // 余额
+      const amountBalance = this.userBalance[this.form.payType] || 0;
+      // 余额是否充足
+      if (this.form.payType === "cash" && amountBalance - this.payAmount < 0) {
+        // 账户类型提示信息
+        const account = this.payList.filter((item) => {
+          return this.form.payType === item.label;
+        });
+        const accountType = (account[0] && account[0].name) || "";
+        this.$message({
+          message: accountType + this.$t("shop.balanceNotAllow"),
+          type: "error",
+        });
+        return false;
+      }
+
+      this.submitButtonStat = true;
+
+      const params = {
+        consignee: this.form.consignee,
+        acceptMobile: this.form.acceptMobile,
+        province: this.form.areaSelected[0] ? this.form.areaSelected[0] : "",
+        city: this.form.areaSelected[1] ? this.form.areaSelected[1] : "",
+        county: this.form.areaSelected[2] ? this.form.areaSelected[2] : "",
+        address: this.form.address,
+        decType: this.form.decType,
+        insertUserName: this.form.insertUserName,
+        decLv: this.form.decLv,
+        realName: this.form.realName,
+        decUserName: this.form.decUserName,
+        conUserName: this.form.conUserName,
+        recUserName: this.form.recUserName,
+        insertUserIdCard: this.form.insertUserIdCard,
+        openBank: this.form.openBank,
+        bankAddress: this.form.bankAddress,
+        mobile: this.form.mobile,
+        email: this.form.email,
+        cityName: this.form.cityName,
+        lgaName: this.form.lgaName,
+
+        bankProvince: this.form.bankAreaSelected[0]
+          ? this.form.bankAreaSelected[0]
+          : "",
+        bankCity: this.form.bankAreaSelected[1]
+          ? this.form.bankAreaSelected[1]
+          : "",
+        bankCounty: this.form.bankAreaSelected[2]
+          ? this.form.bankAreaSelected[2]
+          : "",
+
+        bankNo: this.form.bankNo,
+        password: this.form.password,
+        payPassword: this.form.payPassword,
+        packageId: this.form.packageId,
+        goodsId: this.form.goodsId,
+        goodsNum: this.form.goodsNum,
+        location: this.form.location,
+        decWay: this.decWay,
+        payType: this.form.payType,
+      };
+      createWelcomePack(params)
+        .then((response) => {
+          if (this.form.payType !== "pay_stack") {
+            // 余额支付
+            this.$message({
+              message: this.$t("common.successfully"),
+              type: "success",
+            });
+            this.submitButtonStat = false;
+            this.$router.push({ path: `/shop/member-order` });
+          } else {
+            this.submitButtonStat = false;
+            this.payForm.orderSn = response.data.SN;
+            this.payForm.amount = response.data.ORDER_AMOUNT;
+            this.payForm.metadata.custom_fields[0].value = response.data.SN;
+            if (this.form.decType === "ba") {
+              this.payForm.metadata.custom_fields[1].value = "baUpgrade";
+            } else {
+              this.payForm.metadata.custom_fields[1].value = "userDec";
+            }
+            this.visible = true;
+          }
+        })
+        .catch((err) => {
+          this.$message({
+            message: err,
+            type: "error",
+          });
+          this.submitButtonStat = false;
+        });
+    },
+    // 已选择商品
+    selectProduct() {
+      this.payAmount = 0;
+      this.form.goodsId = [];
+      this.form.goodsNum = [];
+      this.multipleSelection.map((item) => {
+        this.form.goodsId.push(item.ID);
+        this.form.goodsNum.push(item.goodsNum);
+        this.payAmount += item.goodsNum * item.SELL_PRICE;
+      });
+    },
+    // 报单方式
+    decTypeChange() {
+      if (this.form.decType === "ba") {
+        this.form.insertUserName = "";
+        this.userReadOnly = false;
+      } else {
+        this.form.recUserName = "";
+        this.recRealName = "-";
+        this.recReadOnly = false;
+        this.userReadOnly = true;
+        this.fetchWelcomePack();
+      }
+    },
+    // BA会员查询
+    checkBaUser() {
+      if (this.form.decType === "ba" && this.form.insertUserName !== "") {
+        this.loading = true;
+        fetchBrandAmbassadorInfo({ userName: this.form.insertUserName })
+          .then((response) => {
+            this.form.recUserName = response.data.REC_USER_NAME;
+            this.form.realName = response.data.REAL_NAME;
+            this.handleChkRecUser();
+            this.recReadOnly = true;
+            this.loading = false;
+          })
+          .catch(() => {
+            this.loading = false;
+          });
+      }
+    },
+    // 查询安置人
+    handleChkConUser() {
+      if (this.form.conUserName) {
+        this.loading = true;
+        fetchFullInfo({ userName: this.form.conUserName })
+          .then((response) => {
+            this.conRealName =
+              response.data.REAL_NAME + response.data.isLocation;
+            this.loading = false;
+          })
+          .catch(() => {
+            this.conRealName = "-";
+            this.loading = false;
+          });
+      }
+    },
+    // 自动设置区位
+    setAutoPlace(side) {
+      if (this.recRealName !== "-") {
+        this.loading = true;
+        fetchAutoPlace({ userName: this.form.recUserName, side: side })
+          .then((response) => {
+            this.form.conUserName = response.data.USER_NAME;
+            this.handleChkConUser();
+            this.form.location = 1;
+            this.form.autoPlace = side;
+            this.loading = false;
+          })
+          .catch(() => {
+            this.conRealName = "-";
+            this.loading = false;
+          });
+      } else {
+        this.form.autoPlace = "";
+        return false;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.flex {
+  display: flex;
+}
+.flexjcac {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+}
+.flexfc {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.flexJcsbAc {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.flexJcfsAc {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+}
+.flexFwW {
+  display: flex;
+  flex-wrap: wrap;
+}
+.active {
+  color: #1890ff !important;
+  // border-bottom: 2px solid #1890ff;
+}
+::-webkit-scrollbar {
+  /*隐藏滚轮*/
+  display: none;
+}
+.dec {
+  width: 100%;
+}
+.dec-header {
+  // width: 100%;
+  height: 60px;
+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+  .classification {
+    width: 90%;
+    height: 100%;
+    overflow: hidden;
+    // position: relative;
+    .decTabs {
+      width: 100%;
+      height: 100%;
+      overflow-x: auto;
+      -webkit-overflow-scrolling: touch; /* ios5+ */
+      scroll-behavior: smooth; /* 可以使窗口平稳滚动 */
+
+      .tabItem {
+        padding: 0 20px 0 20px;
+        box-sizing: border-box;
+        // line-height: 40px;
+        display: inline-block;
+        list-style: none;
+        font-size: 14px;
+        font-weight: 500;
+        color: #303133;
+      }
+      .tabItem:hover {
+        color: #1890ff;
+        cursor: pointer;
+      }
+    }
+  }
+  .openAllClassification {
+    width: 10%;
+    height: 60px;
+    // box-shadow: 0px 0px 0px rgba(0, 0, 0, 0.1);
+    box-shadow: -10px 0px 30px rgba(0, 0, 0, 0.1);
+    cursor: pointer;
+    font-size: 16px;
+    justify-content: center;
+    span {
+      writing-mode: vertical-lr;
+    }
+  }
+  ::v-deep {
+    ::-webkit-scrollbar {
+      /*隐藏滚轮*/
+      display: none;
+    }
+
+    .el-drawer__wrapper {
+      position: absolute;
+      // position: fixed;
+      top: 0px;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      overflow: hidden;
+      margin: 0;
+    }
+
+    .el-drawer__wrapper {
+      // min-height: 60%;
+      .el-drawer__body {
+        //  height: 400px;
+      }
+      .el-drawer__container ::-webkit-scrollbar {
+        display: none;
+      }
+      .allClassification {
+        // justify-content: center;
+        text-align: center;
+        // height: auto;
+        .title {
+          width: 33%;
+          height: 50px;
+        }
+      }
+    }
+  }
+}
+</style>
+<style>
+.el-table th.el-table__cell > .cell {
+  white-space: nowrap;
+}
+
+.el-table td.el-table__cell > .cell {
+  word-break: keep-all;
+  white-space: pre-wrap;
+}
+.el-tabs--border-card > .el-tabs__content {
+  padding: 5px;
+}
+
+.el-radio.is-bordered + .el-radio.is-bordered {
+  margin: 5px 0;
+}
+.el-radio--medium.is-bordered {
+  margin: 5px 0;
+}
+.el-form-item {
+  margin-bottom: 12px;
+}
+</style>

+ 7 - 169
src/views/user/welcome-pack.vue

@@ -27,7 +27,7 @@
             title="全部分类"
             :visible.sync="drawer"
             :direction="direction"
-            :modal-append-to-body="true"
+            :modal-append-to-body="false"
           >
             <div class="allClassification flexFwW">
               <div
@@ -53,18 +53,18 @@
             :label-position="labelPosition"
             class="form-page"
           >
-            <el-form-item :label="$t('user.welcomePackWay')">
+            <!-- <el-form-item :label="$t('user.welcomePackWay')">
               <el-radio-group v-model="form.decType" @change="decTypeChange">
                 <el-radio size="small" label="normal">{{
                   $t("user.normal")
                 }}</el-radio>
-                <!--								<el-radio size="small" label="ba">{{ $t('user.BAUpgrade') }}</el-radio>-->
+                		<el-radio size="small" label="ba">{{ $t('user.BAUpgrade') }}</el-radio>
               </el-radio-group>
-            </el-form-item>
+            </el-form-item> -->
 
-            <el-divider content-position="left">{{
+            <!-- <el-divider content-position="left">{{
               $t("user.accountInformation")
-            }}</el-divider>
+            }}</el-divider> -->
             <el-form-item :label="$t('user.newMemberCode')">
               <el-input
                 v-model="form.insertUserName"
@@ -209,169 +209,7 @@
               </el-tabs>
             </el-form-item>
 
-            <el-divider content-position="left">{{
-              $t("atlas.networkInformation")
-            }}</el-divider>
-            <el-form-item :label="$t('shop.sponsorCode')">
-              <el-input
-                v-model="form.recUserName"
-                :readonly="recReadOnly"
-                @change="handleChkRecUser"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-input v-model="recRealName" :disabled="true" />
-            </el-form-item>
-            <el-form-item :label="$t('atlas.placementCode')">
-              <el-input v-model="form.conUserName" @change="handleChkConUser" />
-            </el-form-item>
-            <el-form-item>
-              <el-input
-                v-model="conRealName"
-                type="textarea"
-                :rows="2"
-                :disabled="true"
-              />
-            </el-form-item>
-            <el-form-item :label="$t('atlas.placementTree')">
-              <el-radio-group v-model="form.location" border>
-                <el-radio :label="1">{{ $t("atlas.left") }}</el-radio>
-                <el-radio :label="2">{{ $t("atlas.right") }}</el-radio>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item
-              ><!--自动安置区位-->
-              <el-row :gutter="5">
-                <el-col :xs="24" :sm="12" :lg="12">
-                  <el-button
-                    size="small"
-                    type="primary"
-                    @click="setAutoPlace('left')"
-                    >{{ $t("atlas.placementAutoLeft") }}</el-button
-                  >
-                </el-col>
-                <el-col :xs="24" :sm="12" :lg="12">
-                  <el-button
-                    size="small"
-                    type="primary"
-                    @click="setAutoPlace('right')"
-                    >{{ $t("atlas.placementAutoRight") }}</el-button
-                  >
-                </el-col>
-              </el-row>
-            </el-form-item>
-
-            <el-divider content-position="left">{{
-              $t("profile.personalInformation")
-            }}</el-divider>
-            <el-form-item :label="$t('shop.memberName')">
-              <el-input v-model="form.realName" />
-            </el-form-item>
-            <el-form-item :label="$t('shop.phoneNumber')">
-              <el-input v-model="form.mobile" />
-            </el-form-item>
-            <el-form-item :label="$t('user.email')">
-              <el-input v-model="form.email" />
-            </el-form-item>
-            <el-form-item :label="$t('profile.loginPassword')">
-              <el-input
-                v-model="form.password"
-                maxlength="32"
-                :placeholder="$t('profile.enterLoginPassword')"
-              />
-            </el-form-item>
-            <el-form-item :label="$t('profile.paymentPassword')">
-              <el-input
-                v-model="form.payPassword"
-                maxlength="32"
-                :placeholder="$t('profile.enterPaymentPassword')"
-              />
-            </el-form-item>
-            <el-form-item :label="$t('shop.recipientName')">
-              <el-input v-model="form.consignee" />
-            </el-form-item>
-            <el-form-item :label="$t('shop.phoneNumber')">
-              <el-input v-model="form.acceptMobile" />
-            </el-form-item>
-            <el-form-item :label="$t('shop.shipping')">
-              <el-radio-group v-model="form.way" @change="wayChange">
-                <el-radio label="express">{{ $t("shop.delivery") }}</el-radio>
-                <el-radio label="pickup">{{ $t("shop.selfPickUp") }}</el-radio>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item prop="areaSelected" :label="$t('config.state')">
-              <el-cascader
-                v-model="form.areaSelected"
-                :disabled="areaDisabled"
-                size="large"
-                :placeholder="$t('shop.delivery')"
-                :options="regionData"
-                style="width: 100%"
-              />
-            </el-form-item>
-            <el-form-item :label="$t('config.detailedAddress')">
-              <el-input v-model="form.address" :disabled="addressDisabled" />
-            </el-form-item>
-            <el-form-item :label="$t('config.city')">
-              <el-input v-model="form.cityName" :disabled="addressDisabled" />
-            </el-form-item>
-            <el-form-item :label="$t('config.localGovernmentArea')">
-              <el-input v-model="form.lgaName" :disabled="addressDisabled" />
-            </el-form-item>
-
-            <el-divider content-position="left">{{
-              $t("finance.bankInformation")
-            }}</el-divider>
-            <el-form-item :label="$t('finance.bankName')">
-              <el-select
-                v-model="form.openBank"
-                :placeholder="$t('finance.selectBank')"
-                style="width: 100%"
-              >
-                <el-option
-                  v-for="(item, index) in allOpenBank"
-                  :key="index"
-                  :label="item.BANK_NAME"
-                  :value="item.BANK_CODE"
-                />
-              </el-select>
-            </el-form-item>
-            <el-form-item :label="$t('finance.accountName')">
-              <el-input v-model="form.bankAddress" />
-            </el-form-item>
-            <el-form-item :label="$t('finance.bankAccount')">
-              <el-input v-model="form.bankNo" maxlength="50" />
-            </el-form-item>
-
-            <el-divider content-position="left">{{
-              $t("user.payInfo")
-            }}</el-divider>
-            <el-form-item :label="$t('shop.paymentMethod')" required>
-              <el-radio-group v-model="form.payType" @change="chosePayType">
-                <el-radio
-                  v-for="(item, index) in payList"
-                  :key="index"
-                  border
-                  :label="item.label"
-                  style="margin: 5px"
-                >
-                  {{ item.name
-                  }}<span v-if="item.label === 'cash'" style="color: tomato"
-                    >({{ $t("currency.sign") }} {{ userBalance.cash }})</span
-                  >
-                </el-radio>
-              </el-radio-group>
-            </el-form-item>
-
-            <el-form-item>
-              <el-button
-                size="small"
-                type="primary"
-                :loading="submitButtonStat"
-                @click="onSubmit"
-                >{{ $t("common.save") }}</el-button
-              >
-            </el-form-item>
+            
           </el-form>
         </el-col>
       </el-row>