Jelajahi Sumber

平台活动和优惠券批量发放

YY 2 tahun lalu
induk
melakukan
2aa319833e

+ 17 - 11
src/router/module/platActivi.js

@@ -30,22 +30,28 @@ export default [
     meta: { title: '平台管理-平台活动' },
     component: () => import('@/views/platActivi/act/index.vue'),
   },
-  {
-    path: '/platActivi/act/detail',
-    name: 'platActivi_act_detail',
-    meta: { title: '平台管理-平台活动详情' },
-    component: () => import('@/views/platActivi/act/detail.vue'),
-  },
-  {
-    path: '/platActivi/act/goods',
+  // {
+  //   path: '/platActivi/act/detail',
+  //   name: 'platActivi_act_detail',
+  //   meta: { title: '平台管理-平台活动详情' },
+  //   component: () => import('@/views/platActivi/act/detail.vue'),
+  // },
+  {
+    path: '/platActivi/act/parts/goods',
     name: 'platActivi_act_goods',
     meta: { title: '平台管理-平台活动商品' },
-    component: () => import('@/views/platActivi/act/goods.vue'),
+    component: () => import('@/views/platActivi/act/parts/goods.vue'),
   },
   {
-    path: '/platActivi/act/goodsDetail',
+    path: '/platActivi/act/parts/goods/goodsDetail',
     name: 'platActivi_act_goodsDetail',
     meta: { title: '平台管理-平台活动商品添加' },
-    component: () => import('@/views/platActivi/act/goodsDetail.vue'),
+    component: () => import('@/views/platActivi/act/parts/goods/goodsDetail.vue'),
+  },
+  {
+    path: '/platActivi/act/parts/goods/goodsSpec',
+    name: 'platActivi_act_goodsSpec',
+    meta: { title: '平台管理-平台活动商品规格添加' },
+    component: () => import('@/views/platActivi/act/parts/goods/goodsSpec.vue'),
   },
 ];

+ 0 - 148
src/views/platActivi/act/detail.vue

@@ -1,148 +0,0 @@
-<template>
-  <div id="form-1">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight">
-        <el-col class="top-btn">
-          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
-        </el-col>
-        <el-col :span="24" class="one">
-          <data-form :span="24" :fields="fields" v-model="form" :rules="rules" @save="onSubmit">
-            <template #act_time>
-              <el-form ref="act_time" :model="act_time" label-width="80px">
-                <el-form-item label="是否显示">
-                  <el-select v-model="act_time.is_use" placeholder="请选择">
-                    <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
-                  </el-select>
-                </el-form-item>
-                <el-form-item label="活动标题">
-                  <el-input v-model="act_time.title"></el-input>
-                </el-form-item>
-                <el-form-item label="说明">
-                  <el-input v-model="act_time.value"></el-input>
-                </el-form-item>
-              </el-form>
-            </template>
-            <template #content>
-              <el-form ref="content" :model="content" label-width="80px">
-                <el-form-item>
-                  <editor v-model="content.value" url="/files/point/act/upload" />
-                </el-form-item>
-                <el-form-item label="是否显示">
-                  <el-select v-model="content.is_use" placeholder="请选择">
-                    <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
-                  </el-select>
-                </el-form-item>
-              </el-form>
-            </template>
-            <template #is_use>
-              <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
-            </template>
-            <template #show_index>
-              <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
-            </template>
-          </data-form>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash');
-const moment = require('moment');
-import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('platformAct');
-const { mapActions: dictData } = createNamespacedHelpers('dictData');
-
-export default {
-  name: 'form-1',
-  props: { id: { type: String } },
-  components: {
-    editor: () => import('@/components/editor.vue'),
-  },
-  data: function () {
-    return {
-      form: {},
-      act_time: {},
-      content: {},
-      rules: {
-        label: [{ required: true, message: '请输入活动标题', trigger: 'blur' }],
-        is_use: [{ required: true, message: '请选择是否开启', trigger: 'change' }],
-      },
-      fields: [
-        // { label: '活动标题', model: 'title' },
-        { label: '活动时间', model: 'act_time', custom: true },
-        { label: '活动说明', model: 'content', custom: true },
-        { label: '分享图片(237*190)', model: 'share', type: 'upload', limit: 1, url: '/files/point/act/upload' },
-        { label: '封面图片(345*85)', model: 'cover', type: 'upload', limit: 1, url: '/files/point/act/upload' },
-        { label: '是否在首页展示', model: 'show_index', type: 'select' },
-        { label: '是否开启', model: 'is_use', type: 'select' },
-        { label: '排序', model: 'sort', type: 'number' },
-      ],
-      // 是否使用
-      isuseList: [],
-    };
-  },
-  async created() {
-    await this.searchOther();
-    await this.search();
-  },
-  methods: {
-    ...dictData({ dictQuery: 'query' }),
-    ...mapActions(['fetch', 'create', 'update']),
-    // 查询
-    async search() {
-      if (this.id) {
-        let res = await this.fetch(this.id);
-        if (this.$checkRes(res)) {
-          this.$set(this, `form`, res.data);
-          this.$set(this, `act_time`, res.data.act_time);
-          this.$set(this, `content`, res.data.content);
-        }
-      } else {
-        this.$set(this, `form`, { is_use: '0', show_index: '0' });
-        this.$set(this.act_time, `is_use`, '0');
-        this.$set(this.content, `is_use`, '0');
-      }
-    },
-    // 提交
-    async onSubmit({ data }) {
-      let res;
-      data.act_time = this.act_time;
-      data.content = this.content;
-      if (data.id) res = await this.update(data);
-      else res = await this.create(data);
-      if (this.$checkRes(res)) {
-        this.$message({ type: `success`, message: `维护信息成功` });
-        this.toBack();
-      }
-    },
-    // 查询其他信息
-    async searchOther() {
-      let res;
-      // 是否使用
-      res = await this.dictQuery({ code: 'use' });
-      if (this.$checkRes(res)) {
-        this.$set(this, `isuseList`, res.data);
-      }
-    },
-    // 返回
-    toBack() {
-      this.$emit('toBack');
-    },
-  },
-  computed: {},
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  watch: {
-    test: {
-      deep: true,
-      immediate: true,
-      handler(val) {},
-    },
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 163
src/views/platActivi/act/goods.vue

@@ -1,163 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24" class="main animate__animated animate__backInRight">
-        <el-col :span="24" class="one"> <span>平台活动商品</span> </el-col>
-        <el-col :span="24" class="two">
-          <search-1 :form="searchForm" @onSubmit="search" @toReset="toClose"></search-1>
-        </el-col>
-        <el-col :span="24" class="thr">
-          <el-button type="primary" size="mini" @click="toAdd()">新增</el-button>
-          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
-        </el-col>
-        <el-col :span="24" class="four">
-          <data-table
-            :select="true"
-            :selected="selected"
-            @handleSelect="handleSelect"
-            :fields="fields"
-            :opera="opera"
-            @query="search"
-            :data="list"
-            :total="total"
-            @del="toDel"
-          >
-          </data-table>
-        </el-col>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-const _ = require('lodash');
-import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
-const { mapActions } = createNamespacedHelpers('goodsJoinAct');
-const { mapActions: dictData } = createNamespacedHelpers('dictData');
-export default {
-  name: 'index',
-  props: {},
-  components: {
-    search1: () => import('./parts/search-2.vue'),
-  },
-  data: function () {
-    const that = this;
-    return {
-      // 列表
-      opera: [{ label: '删除', method: 'del', confirm: true, type: 'danger' }],
-      fields: [
-        { label: '商品名称', model: 'goods.name' },
-        { label: '店铺名称', model: 'shop.name' },
-        { label: '商品价格', model: 'sell_money' },
-        // {
-        //   label: '状态',
-        //   model: 'status',
-        //   format: (i) => {
-        //     let data = that.statusList.find((f) => f.value == i);
-        //     if (data) return data.label;
-        //     else return '暂无';
-        //   },
-        // },
-      ],
-      list: [],
-      total: 0,
-      // 查询
-      searchForm: {},
-      // 多选值
-      selected: [],
-      // 状态
-      statusList: [],
-    };
-  },
-  async created() {
-    await this.searchOther();
-    await this.search();
-  },
-  methods: {
-    ...dictData({ dictQuery: 'query' }),
-    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
-    // 查询
-    async search({ skip = 0, limit = this.$limit, ...info } = {}) {
-      info.platformAct = this.id;
-      const condition = _.cloneDeep(this.searchForm);
-      let res = await this.query({ skip, limit, ...condition, ...info });
-      if (this.$checkRes(res)) {
-        this.$set(this, 'list', res.data);
-        this.$set(this, 'total', res.total);
-      }
-    },
-    // 新增
-    toAdd() {
-      this.$router.push({ path: '/platActivi/act/goodsDetail', query: { id: this.id } });
-    },
-    // 删除
-    async toDel({ data }) {
-      let res = await this.delete(data._id);
-      if (this.$checkRes(res)) {
-        this.$message({ type: `success`, message: `刪除信息成功` });
-        this.search();
-      }
-    },
-    // 重置
-    toClose() {
-      this.searchForm = {};
-      this.search();
-    },
-    // 多选
-    handleSelect(data) {
-      this.$set(this, `selected`, data);
-    },
-    // 查询其他信息
-    async searchOther() {
-      let res;
-      // 审核状态
-      res = await this.dictQuery({ code: 'platformAct_goods_status' });
-      if (this.$checkRes(res)) {
-        this.$set(this, `statusList`, res.data);
-      }
-    },
-    // 返回
-    toBack() {
-      window.history.go('-1');
-    },
-  },
-  computed: {
-    ...mapState(['user']),
-    id() {
-      return this.$route.query.id;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  watch: {
-    test: {
-      deep: true,
-      immediate: true,
-      handler(val) {},
-    },
-  },
-};
-</script>
-
-<style lang="less" scoped>
-.main {
-  .one {
-    margin: 0 0 10px 0;
-
-    span:nth-child(1) {
-      font-size: 20px;
-      font-weight: 700;
-      margin-right: 10px;
-    }
-  }
-  .two {
-    margin: 0 0 10px 0;
-  }
-  .thr {
-    display: flex;
-    justify-content: space-between;
-    margin: 0 0 10px 0;
-  }
-}
-</style>

+ 24 - 7
src/views/platActivi/act/index.vue

@@ -27,6 +27,7 @@
             </data-table>
           </el-col>
         </span>
+
         <detail v-if="view === 'info'" :id="id" @toBack="toBack"></detail>
       </el-col>
     </el-row>
@@ -42,8 +43,9 @@ export default {
   name: 'index',
   props: {},
   components: {
-    search1: () => import('./parts/search-1.vue'),
-    detail: () => import('./detail.vue'),
+    search1: () => import('./search/search-1.vue'),
+
+    detail: () => import('./parts/detail.vue'),
   },
   data: function () {
     const that = this;
@@ -53,10 +55,20 @@ export default {
       opera: [
         { label: '修改', method: 'edit' },
         { label: '商品管理', method: 'manage' },
+
         { label: '删除', method: 'del', confirm: true, type: 'danger' },
       ],
       fields: [
         { label: '活动标题', model: 'act_time.title' },
+        {
+          label: '活动类型',
+          model: 'type',
+          format: (i) => {
+            let data = that.act_typeList.find((f) => f.value == i);
+            if (data) return data.label;
+            else return '暂无';
+          },
+        },
         { label: '活动时间', model: 'act_time.value' },
         {
           label: '是否开启',
@@ -87,6 +99,8 @@ export default {
       // 是否开启
       isuseList: [],
       id: '',
+      // type: '',
+      act_typeList: [],
     };
   },
   async created() {
@@ -116,15 +130,13 @@ export default {
       this.$set(this, `id`, data.id);
       this.$set(this, `view`, 'info');
     },
+
     toBack() {
       this.view = 'list';
     },
-    // 平台管理
+    // 商品管理
     async toManage({ data }) {
-      this.$router.push({
-        path: '/platActivi/act/goods',
-        query: { id: data.id },
-      });
+      this.$router.push({ path: './act/parts/goods', query: { id: data.id, type: data.type } });
     },
     // 删除
     async toDel({ data }) {
@@ -151,6 +163,11 @@ export default {
       if (this.$checkRes(res)) {
         this.$set(this, `isuseList`, res.data);
       }
+      // 活动类型
+      res = await this.dictQuery({ code: 'act_type' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `act_typeList`, res.data);
+      }
     },
   },
   computed: {

+ 165 - 0
src/views/platActivi/act/parts/detail copy.vue

@@ -0,0 +1,165 @@
+<template>
+  <div id="form-1">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col>
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
+        <el-col class="top-btn">
+          <el-button class="btn" type="success" size="mini" @click="onSubmit('form')">提交保存</el-button>
+        </el-col>
+        <el-col :span="24" class="one">
+          <el-tabs type="border-card">
+            <el-tab-pane label="活动基础设置">
+              <tabs-1 :form="form" :act_typeList="act_typeList" :isuseList="isuseList" :url="url" :rules="rules"></tabs-1>
+            </el-tab-pane>
+            <!-- <el-tab-pane label="活动程序设置" v-if="form.type == '5' || form.type == '6'"> -->
+            <el-tab-pane label="活动程序设置">
+              <tabs-2 :form="form" :rules="rules"></tabs-2>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+const moment = require('moment');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('platformAct');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+
+export default {
+  name: 'form-1',
+  props: { id: { type: String } },
+  components: {
+    tabs1: () => import('./goods/tabs-1.vue'),
+    tabs2: () => import('./goods/tabs-2.vue'),
+  },
+  data: function () {
+    return {
+      url: '/files/point/platformAct/upload',
+      form: {
+        // 活动时间
+        act_time: {},
+        // 活动说明
+        content: {},
+        // 设置
+        config: {},
+        // 满减折扣设置
+        manZhe: {},
+        // 满减设置
+        manJian: {},
+      },
+      rules: {
+        label: [{ required: true, message: '请输入活动标题', trigger: 'blur' }],
+        is_use: [{ required: true, message: '请选择是否开启', trigger: 'change' }],
+        type: [{ required: true, message: '请选择活动类型', trigger: 'change' }],
+      },
+      // 是否使用
+      isuseList: [],
+      // 活动类型
+      act_typeList: [],
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...dictData({ dictQuery: 'query' }),
+    ...mapActions(['fetch', 'create', 'update']),
+    // 查询
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          if (res.data.type == '5') res.data.manJian = res.data.config.discount.type[0];
+          else if (res.data.type == '6') res.data.manZhe = res.data.config.discount.type[0];
+          res.data.config.time = [res.data.config.time_start, res.data.config.time_end];
+          this.$set(this, `form`, res.data);
+        }
+      } else {
+        this.$set(this, `form`, {
+          is_use: '0',
+          show_index: '0',
+          act_time: { is_use: '0' },
+          content: { is_use: '0' },
+        });
+      }
+    },
+    async onSubmit(formName) {
+      console.log(this.form);
+      // this.$refs[formName].validate(async (valid) => {
+      //   if (valid) {
+      //     this.$confirm('是否确认保存', '提示', {
+      //       confirmButtonText: '确定',
+      //       cancelButtonText: '取消',
+      //       type: 'warning',
+      //     }).then(async () => {
+      //       let form = this.form;
+      //       this.config[`time_start`] = _.head(this.config.time);
+      //       this.config[`time_end`] = _.last(this.config.time);
+      //       let manZhe = this.manZhe;
+      //       let manJian = this.manJian;
+      //       // 满减档位
+      //       let discount = [];
+      //       if (form.type == '5') discount.push(manJian);
+      //       delete this.config.time;
+      //       this.config.discount = discount;
+      //       form = { ...form, act_time: this.act_time, content: this.content, config: this.config };
+
+      //       // let res;
+      //       // if (form.id) res = await this.update(form);
+      //       // else res = await this.create(form);
+      //       // if (this.$checkRes(res)) {
+      //       //   this.$message({ type: `success`, message: `维护信息成功` });
+      //       //   this.toBack();
+      //       // }
+      //     });
+      //   } else {
+      //     return false;
+      //   }
+      // });
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res;
+      // 是否使用
+      res = await this.dictQuery({ code: 'use' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `isuseList`, res.data);
+      }
+      // 活动类型
+      res = await this.dictQuery({ code: 'act_type' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `act_typeList`, res.data);
+      }
+    },
+    // 返回
+    toBack() {
+      this.$emit('toBack');
+    },
+  },
+  computed: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top-btn {
+  margin: 10px 0;
+  text-align: center;
+}
+</style>

+ 171 - 0
src/views/platActivi/act/parts/detail.vue

@@ -0,0 +1,171 @@
+<template>
+  <div id="form-1">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col>
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
+        <el-col class="top-btn">
+          <el-button class="btn" type="success" size="mini" @click="onSubmit('form')">提交保存</el-button>
+        </el-col>
+        <el-col :span="24" class="one">
+          <el-tabs type="border-card">
+            <el-tab-pane label="活动基础设置">
+              <tabs-1
+                :form="form"
+                :act_time="act_time"
+                :content="content"
+                :act_typeList="act_typeList"
+                :isuseList="isuseList"
+                :url="url"
+                :rules="rules"
+                :goodsAct="goodsAct"
+              ></tabs-1>
+            </el-tab-pane>
+            <el-tab-pane label="活动程序设置">
+              <tabs-2 :form="form" :config="config" :list="list" :rules="rules"></tabs-2>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+const moment = require('moment');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('platformAct');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+const { mapActions: goodsJoinAct } = createNamespacedHelpers('goodsJoinAct');
+
+export default {
+  name: 'form-1',
+  props: { id: { type: String } },
+  components: {
+    tabs1: () => import('./goods/tabs-1.vue'),
+    tabs2: () => import('./goods/tabs-2.vue'),
+  },
+  data: function () {
+    return {
+      url: '/files/point/platformAct/upload',
+      form: {},
+      rules: {},
+      // 活动时间
+      act_time: {},
+      // 活动说明
+      content: {},
+      // 设置
+      config: {},
+      // 满减折扣设置
+      // manZhe: {},
+      list: [],
+      // 满减设置
+      // manJian: {},
+      // 是否使用
+      isuseList: [],
+      // 活动类型
+      act_typeList: [],
+      // 是否有活动商品
+      goodsAct: true,
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...goodsJoinAct({ goodsActQuery: 'query' }),
+    ...dictData({ dictQuery: 'query' }),
+    ...mapActions(['fetch', 'create', 'update']),
+    // 查询
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `act_time`, res.data.act_time);
+          this.$set(this, `content`, res.data.content);
+          if (res.data.type == '5' || res.data.type == '6') this.$set(this, `list`, res.data.config.discount);
+          if (res.data.config) {
+            if (res.data.config.time_start && res.data.config.time_end) res.data.config.time = [res.data.config.time_start, res.data.config.time_end];
+            this.$set(this, `config`, res.data.config);
+          }
+          this.$set(this, `form`, res.data);
+        }
+        // 活动类型
+        res = await this.goodsActQuery({ platform_act: this.id });
+        if (this.$checkRes(res)) {
+          if (res.total == 0) this.$set(this, `goodsAct`, true);
+          else this.$set(this, `goodsAct`, false);
+        }
+      } else {
+        this.$set(this, `form`, {
+          is_use: '0',
+          show_index: '0',
+        });
+        this.$set(this.act_time, `is_use`, '0');
+        this.$set(this.content, `is_use`, '0');
+      }
+    },
+    async onSubmit(formName) {
+      let form = this.form;
+      let config = this.config;
+      if (form.type == '5' || form.type == '6') config.discount = this.list;
+      if (config.time) {
+        config[`time_start`] = _.head(this.config.time);
+        config[`time_end`] = _.last(this.config.time);
+      }
+      form = { ...form, act_time: this.act_time, content: this.content, config };
+      if ((form.type == '5' || form.type == '6') && this.list.length == '0') this.$message.error('请添加活动程序设置');
+      else if (!form.config.time) this.$message.error('请添加活动程序设置');
+      else if (form.type == '4' && !config.plus_money) this.$message.error('请添加活动程序设置');
+      else {
+        let res;
+        if (form.id) res = await this.update(form);
+        else res = await this.create(form);
+        if (this.$checkRes(res)) {
+          this.$message({ type: `success`, message: `维护信息成功` });
+          this.toBack();
+        }
+      }
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res;
+      // 是否使用
+      res = await this.dictQuery({ code: 'use' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `isuseList`, res.data);
+      }
+      // 活动类型
+      res = await this.dictQuery({ code: 'act_type' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `act_typeList`, res.data);
+      }
+    },
+    // 返回
+    toBack() {
+      this.$emit('toBack');
+    },
+  },
+  computed: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.top-btn {
+  margin: 10px 0;
+  text-align: center;
+}
+</style>

+ 201 - 0
src/views/platActivi/act/parts/goods.vue

@@ -0,0 +1,201 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <span v-show="view === 'list'">
+          <el-col class="top-btn">
+            <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+          </el-col>
+          <el-col :span="24" class="one"> <span>平台活动商品</span> </el-col>
+          <el-col :span="24" class="two">
+            <search-1 :form="searchForm" @onSubmit="search" @toReset="toClose"></search-1>
+          </el-col>
+          <el-col :span="24" v-if="type != '4'">
+            <el-col :span="24" class="thr">
+              <el-button type="primary" size="mini" @click="toAdd()">新增</el-button>
+            </el-col>
+            <el-col :span="24" class="four">
+              <data-table :fields="fields" :opera="opera" @query="search" :data="list" :total="total" @del="toDel" @set="toSet"> </data-table>
+            </el-col>
+          </el-col>
+          <el-col :span="24" v-if="type == '4'">
+            <el-tabs type="border-card">
+              <el-tab-pane label="基础商品">
+                <el-col :span="24" class="thr">
+                  <el-button type="primary" size="mini" @click="toAdd('basic')">新增</el-button>
+                </el-col>
+                <data-table :fields="fields" :opera="operas" @query="search" :data="list" :total="total" @del="toDel"> </data-table>
+              </el-tab-pane>
+              <el-tab-pane label="加价商品">
+                <el-col :span="24" class="thr">
+                  <el-button type="primary" size="mini" @click="toAdd('plus')">新增</el-button>
+                </el-col>
+                <data-table :fields="fields" :opera="opera" @query="search" :data="plusList" :total="plusTotal" @del="toDel" @set="toSet"> </data-table>
+              </el-tab-pane>
+            </el-tabs>
+          </el-col>
+        </span>
+        <goodsEdit v-if="view === 'info'" :ids="ids" :type="type" @toBack="toBack1"></goodsEdit>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('goodsJoinAct');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    search1: () => import('../search/search-2.vue'),
+    goodsEdit: () => import('./goods/goodsEdit.vue'),
+  },
+  data: function () {
+    const that = this;
+    return {
+      view: 'list',
+      // 列表
+      opera: [
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+        { label: '活动设置', method: 'set', display: (i) => i.platform_act_type != '5' && i.platform_act_type != '6' },
+      ],
+      operas: [{ label: '删除', method: 'del', confirm: true, type: 'danger' }],
+      fields: [
+        { label: '商品名称', model: 'goods_name' },
+        { label: '商品规格', model: 'spec_name' },
+        { label: '店铺名称', model: 'shop_name' },
+        { label: '商品原价', model: 'sell_money' },
+      ],
+      list: [],
+      total: 0,
+      plusTotal: 0,
+      plusList: [],
+      // 查询
+      searchForm: {},
+      // 多选值
+      selected: [],
+      // 状态
+      statusList: [],
+      ids: '',
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...dictData({ dictQuery: 'query' }),
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询
+    async search({ skip = 0, limit = this.$limit, ...info } = {}) {
+      info.platform_act = this.id;
+      if (this.type == '4') info.goods_type = 'basic';
+      const condition = _.cloneDeep(this.searchForm);
+      let res = await this.query({ skip, limit, ...condition, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, 'total', res.total);
+      }
+      if (this.type == '4') {
+        let arr = await this.query({ skip, limit, ...condition, ...info, goods_type: 'plus' });
+        if (this.$checkRes(arr)) {
+          this.$set(this, 'plusList', arr.data);
+          this.$set(this, 'plusTotal', arr.total);
+        }
+      }
+    },
+    // 活动设置
+    toSet({ data }) {
+      this.$set(this, `ids`, data._id);
+      this.$set(this, `view`, 'info');
+    },
+    // 新增
+    toAdd(data) {
+      let query = { id: this.id, type: this.type };
+      if (this.type == '4') query.goods_type = data;
+      this.$router.push({ path: './goods/goodsDetail', query: query });
+    },
+    // 删除
+    async toDel({ data }) {
+      let res = await this.delete(data._id);
+      if (this.$checkRes(res)) {
+        this.$message({ type: `success`, message: `刪除信息成功` });
+        this.search();
+      }
+    },
+    // 重置
+    toClose() {
+      this.searchForm = {};
+      this.search();
+    },
+    // 多选
+    handleSelect(data) {
+      this.$set(this, `selected`, data);
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res;
+      // 审核状态
+      res = await this.dictQuery({ code: 'platformAct_goods_status' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `statusList`, res.data);
+      }
+    },
+    // 返回
+    toBack() {
+      window.history.go('-1');
+    },
+    // 返回
+    toBack1() {
+      this.view = 'list';
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+    type() {
+      return this.$route.query.type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top-btn {
+    margin: 20px 0;
+  }
+  .one {
+    margin: 0 0 10px 0;
+
+    span:nth-child(1) {
+      font-size: 20px;
+      font-weight: 700;
+      margin-right: 10px;
+    }
+  }
+  .two {
+    margin: 0 0 10px 0;
+  }
+  .thr {
+    display: flex;
+    justify-content: space-between;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 16 - 10
src/views/platActivi/act/goodsDetail.vue

@@ -2,15 +2,15 @@
   <div id="index">
     <el-row>
       <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col class="top-btn">
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
         <el-col :span="24" class="one"> <span>平台活动商品添加</span> </el-col>
         <el-col :span="4" class="two">
           <el-input placeholder="请输入商品名称" v-model="goods">
             <el-button slot="append" icon="el-icon-search" @click="search"></el-button>
           </el-input>
         </el-col>
-        <el-col :span="24" class="thr">
-          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
-        </el-col>
         <el-col :span="24" class="four">
           <data-table :fields="fields" :opera="opera" @query="search" :data="list" :total="total" @add="toAdd"> </data-table>
         </el-col>
@@ -33,7 +33,7 @@ export default {
     const that = this;
     return {
       // 列表
-      opera: [{ label: '添加', method: 'add' }],
+      opera: [{ label: '选择规格', method: 'add' }],
       fields: [
         { label: '商品名称', model: 'name' },
         { label: '店铺名称', model: 'shop.name' },
@@ -75,12 +75,9 @@ export default {
     },
     // 新增
     async toAdd({ data }) {
-      let form = { platformAct: this.id, shop: data.shop._id, goods: data._id };
-      let res = await this.create(form);
-      if (this.$checkRes(res)) {
-        this.$message({ type: `success`, message: `添加商品成功` });
-        this.toBack();
-      }
+      let query = { platform_act: this.id, shop: data.shop._id, goods: data._id, platform_act_type: this.type };
+      if (this.type == '4') query.goods_type = this.goods_type;
+      this.$router.push({ path: './goodsSpec', query: query });
     },
     // 返回
     toBack() {
@@ -101,6 +98,12 @@ export default {
     id() {
       return this.$route.query.id;
     },
+    type() {
+      return this.$route.query.type;
+    },
+    goods_type() {
+      return this.$route.query.goods_type;
+    },
   },
   metaInfo() {
     return { title: this.$route.meta.title };
@@ -117,6 +120,9 @@ export default {
 
 <style lang="less" scoped>
 .main {
+  .top-btn {
+    margin: 20px 0;
+  }
   .one {
     margin: 0 0 10px 0;
 

+ 274 - 0
src/views/platActivi/act/parts/goods/goodsEdit.vue

@@ -0,0 +1,274 @@
+<template>
+  <div id="goodsEdit">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col class="top-btn">
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
+        <!-- <el-col :span="24">参加平台活动商品设置</el-col> -->
+        <el-col :span="24" class="one">
+          <el-form :model="form" ref="form" label-width="180px">
+            <el-form-item label="设置" prop="config">
+              <el-form ref="config" :model="config" :rules="rules" label-width="80px">
+                <!-- 特价 -->
+                <el-form-item label="特价" prop="sp_price" v-if="form.platform_act_type == '3'">
+                  <el-input v-model="config.sp_price" type="number" placeholder="请输入金额"></el-input>
+                </el-form-item>
+                <!-- 买赠 -->
+                <el-form-item label="买赠" v-if="form.platform_act_type == '2'">
+                  <el-col :span="24" style="margin: 0 0 10px 0">
+                    <el-button type="primary" size="mini" @click="toAdd()">添加</el-button>
+                  </el-col>
+                  <data-table :usePage="false" :fields="fields_gift" :opera="opera" :data="list" @edit="toEdit" @del="toDel"> </data-table>
+                </el-form-item>
+                <!-- 加价购 -->
+                <el-form-item label="商品类型" prop="goods_type" v-if="form.platform_act_type == '4'">
+                  <el-select v-model="config.goods_type" clearable filterable placeholder="请选择商品类型" size="small" style="width: 100%">
+                    <el-option v-for="i in goods_typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="加价金额" prop="plus_money" v-if="config.goods_type == 'plus'">
+                  <el-input v-model="config.plus_money" type="number" placeholder="请输入加价金额"></el-input>
+                </el-form-item>
+              </el-form>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSubmit('form')">保存</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+    <e-dialog :dialog="dialog" @toClose="toClose">
+      <template v-slot:info>
+        <el-form :model="fieldform" ref="fieldform" label-width="100px" class="demo-ruleForm">
+          <!-- 买赠 -->
+          <el-form-item label="赠品类型" prop="type" v-if="form.platform_act_type == '2'">
+            <el-select v-model="fieldform.type" clearable filterable placeholder="请选择赠品类型" size="small" style="width: 100%">
+              <el-option v-for="i in typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="商品名称" prop="goods" v-if="form.platform_act_type == '2' && fieldform.type == '0'">
+            <el-select
+              v-model="fieldform.goods"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请选择商品名称"
+              :remote-method="querySearch"
+              :loading="loading"
+              @change="goodsSelect"
+              size="small"
+              style="width: 100%"
+            >
+              <el-option v-for="item in goodsList" :key="item._id" :label="item.name" :value="item._id"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="赠品规格" prop="spec" v-if="form.platform_act_type == '2' && fieldform.type == '0'">
+            <el-select v-model="fieldform.spec" clearable filterable placeholder="请选择赠品规格" size="small" style="width: 100%" @change="specSelect">
+              <el-option v-for="i in specList" :key="i._id" :label="i.name" :value="i._id"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="商品名称" prop="goods" v-if="form.platform_act_type == '2' && fieldform.type == '1'">
+            <el-input v-model="fieldform.goods" placeholder="请输入商品名称" size="small" @input="goodsInput"></el-input>
+          </el-form-item>
+          <el-form-item label="赠品规格" prop="spec" v-if="form.platform_act_type == '2' && fieldform.type == '1'">
+            <el-input v-model="fieldform.spec" placeholder="请输入赠品规格" size="small" @input="specInput"></el-input>
+          </el-form-item>
+          <el-form-item label="赠品数量" prop="num" v-if="form.platform_act_type == '2'">
+            <el-input v-model="fieldform.num" placeholder="请输入赠品数量" size="small" type="Number"></el-input>
+          </el-form-item>
+          <el-form-item label="赠品描述" prop="desc" v-if="form.platform_act_type == '2'">
+            <el-input v-model="fieldform.desc" placeholder="请输入赠品描述" size="small" type="textarea"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-col>
+              <el-button type="primary" @click="toSave()"> 保存 </el-button>
+            </el-col>
+          </el-form-item>
+        </el-form>
+      </template>
+    </e-dialog>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+const moment = require('moment');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('goodsJoinAct');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+const { mapActions: goods } = createNamespacedHelpers('goods');
+const { mapActions: goodsSpec } = createNamespacedHelpers('goodsSpec');
+
+export default {
+  name: 'goodsEdit',
+  props: {
+    ids: { type: String },
+    type: { type: String },
+  },
+  components: {},
+  data: function () {
+    return {
+      form: {},
+      list: [],
+      // 操作
+      opera: [
+        { label: '修改', method: 'edit' },
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+      ],
+      fields_gift: [
+        { label: '赠品', model: 'goods_name' },
+        { label: '规格', model: 'spec_name' },
+        { label: '赠品描述', model: 'desc' },
+      ],
+      // 弹框
+      dialog: { title: '信息管理', show: false, type: '1' },
+      loading: false,
+      // 赠品
+      // 赠品商品列表
+      goodsList: [],
+      // 赠品规格列表
+      specList: [],
+      rules: {},
+      config: {},
+      // 是否使用
+      isuseList: [],
+      // 赠品类型
+      typeList: [
+        { label: '平台商品', value: '0' },
+        { label: '输入商品', value: '1' },
+      ],
+      // 加价购商品类型
+      goods_typeList: [
+        { label: '基础商品', value: 'basic' },
+        { label: '加价商品', value: 'plus' },
+      ],
+      fieldform: {},
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...dictData({ dictQuery: 'query' }),
+    ...mapActions(['fetch', 'create', 'update']),
+    ...goods({ goodsQuery: 'query', goodsFetch: 'fetch' }),
+    ...goodsSpec({ specQuery: 'query', specFetch: 'fetch' }),
+    // 查询
+    async search() {
+      let res = await this.fetch(this.ids);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+        if (res.data.config) this.$set(this, `config`, res.data.config);
+        if (res.data.platform_act_type == '2') this.$set(this, `list`, res.data.config.gift);
+      }
+    },
+    // 远程查询
+    async querySearch(value) {
+      this.loading = true;
+      let res = await this.goodsQuery({ name: value });
+      if (this.$checkRes(res)) this.$set(this, 'goodsList', res.data);
+      this.loading = false;
+    },
+    // 选择商品
+    async goodsSelect(value) {
+      let res = await this.goodsFetch(value);
+      if (this.$checkRes(res)) this.$set(this.fieldform, `goods_name`, res.data.name);
+      this.querySpec(value);
+    },
+    // 输入商品
+    goodsInput(value) {
+      this.$set(this.fieldform, `goods_name`, value);
+    },
+    //  获取规格列表
+    async querySpec(id) {
+      let res = await this.specQuery({ goods: id });
+      if (this.$checkRes(res)) this.$set(this, 'specList', res.data);
+    },
+    // 选择规格
+    async specSelect(value) {
+      let res = await this.specFetch(value);
+      if (this.$checkRes(res)) this.$set(this.fieldform, `spec_name`, res.data.name);
+    },
+    // 输入规格
+    specInput(value) {
+      this.$set(this.fieldform, `spec_name`, value);
+    },
+    // 新增
+    async toAdd() {
+      this.dialog = { title: '信息管理', show: true, type: '1' };
+    },
+    // 提交
+    toSave() {
+      let data = this.fieldform;
+      if (!data.id) data.id = moment(new Date()).valueOf();
+      let info = this.list.find((f) => f.id == data.id);
+      if (info == '' || info == undefined) this.list.push(data);
+      this.toClose();
+    },
+    // 关闭
+    toClose() {
+      this.fieldform = {};
+      this.dialog = { title: '信息管理', show: false, type: '1' };
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$set(this, `fieldform`, data);
+      this.dialog = { title: '信息管理', show: true, type: '1' };
+    },
+    // 删除
+    toDel({ data }) {
+      let newList = this.list.filter((i) => i.id != data.id);
+      this.$set(this, `list`, newList);
+    },
+
+    // 提交
+    async onSubmit(formName) {
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          let form = this.form;
+          let config = this.config;
+          if (form.platform_act_type == '3') config.sp_price = Number(config.sp_price);
+          if (form.platform_act_type == '2') config.gift = this.list;
+          form.config = config;
+          let res;
+          if (form.id) res = await this.update(form);
+          else res = await this.create(form);
+          if (this.$checkRes(res)) {
+            this.$message({ type: `success`, message: `维护信息成功` });
+            this.toBack();
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res;
+      // 是否使用;
+      res = await this.dictQuery({ code: 'use' });
+      if (this.$checkRes(res)) this.$set(this, `isuseList`, res.data);
+    },
+    // 返回
+    toBack() {
+      this.$emit('toBack');
+    },
+  },
+  computed: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 136 - 0
src/views/platActivi/act/parts/goods/goodsSpec.vue

@@ -0,0 +1,136 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main animate__animated animate__backInRight">
+        <el-col class="top-btn">
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="one"> <span>平台活动商品规格添加</span> </el-col>
+        <el-col :span="24" class="four">
+          <data-table :fields="fields" :opera="opera" @query="search" :data="list" :total="total" @add="toAdd"> </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('goodsJoinAct');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+const { mapActions: goodsSpec } = createNamespacedHelpers('goodsSpec');
+export default {
+  name: 'index',
+  props: {},
+  components: {},
+  data: function () {
+    const that = this;
+    return {
+      // 列表
+      opera: [{ label: '添加', method: 'add' }],
+      fields: [
+        { label: '规格名称', model: 'name' },
+        { label: '实际销售价格', model: 'sell_money' },
+        { label: '划掉销售价格', model: 'flow_money' },
+        { label: '运费', model: 'freight' },
+        { label: '库存', model: 'num' },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...dictData({ dictQuery: 'query' }),
+    ...goodsSpec({ gQuery: 'query' }),
+    ...mapActions(['query', 'fetch', 'create', 'update', 'delete']),
+    async search({ skip = 0, limit = this.$limit, ...info } = {}) {
+      info.goods = this.goods;
+      let res = await this.gQuery({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, 'total', res.total);
+      }
+    },
+    // 新增
+    async toAdd({ data }) {
+      let form = { platform_act: this.platform_act, shop: this.shop, goods: this.goods, platform_act_type: this.platform_act_type, spec: data._id };
+      if (this.platform_act_type == '4') {
+        let config = { goods_type: this.goods_type };
+        form.config = config;
+      }
+      let res;
+      res = await this.create(form);
+      if (this.$checkRes(res)) {
+        this.$message({ type: `success`, message: `添加商品成功` });
+        this.toBack();
+      }
+    },
+    // 返回
+    toBack() {
+      window.history.go('-2');
+    },
+    // 查询其他信息
+    async searchOther() {
+      let res;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+
+    platform_act() {
+      return this.$route.query.platform_act;
+    },
+    goods() {
+      return this.$route.query.goods;
+    },
+    shop() {
+      return this.$route.query.shop;
+    },
+    platform_act_type() {
+      return this.$route.query.platform_act_type;
+    },
+    goods_type() {
+      return this.$route.query.goods_type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top-btn {
+    margin: 20px 0;
+  }
+  .one {
+    margin: 0 0 10px 0;
+
+    span:nth-child(1) {
+      font-size: 20px;
+      font-weight: 700;
+      margin-right: 10px;
+    }
+  }
+  .two {
+    margin: 0 0 10px 0;
+  }
+  .thr {
+    margin: 0 0 10px 0;
+    text-align: right;
+  }
+}
+</style>

+ 117 - 0
src/views/platActivi/act/parts/goods/tabs-1 copy.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="tabs-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form :model="form" :rules="rules" ref="form" label-width="auto">
+            <el-col :span="18">
+              <el-form-item label="活动时间" prop="act_time">
+                <el-form-item label="是否显示">
+                  <el-select v-model="form.act_time.is_use" placeholder="请选择">
+                    <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item label="活动标题">
+                  <el-input v-model="form.act_time.title"></el-input>
+                </el-form-item>
+                <el-form-item label="说明">
+                  <el-input v-model="form.act_time.value"></el-input>
+                </el-form-item>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="是否在首页展示" prop="show_index">
+                <el-select v-model="form.show_index" clearable filterable placeholder="请选择是否在首页展示" size="small" style="width: 100%">
+                  <el-option v-for="i in isuseList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="是否开启" prop="is_use">
+                <el-select v-model="form.is_use" clearable filterable placeholder="请选择是否开启" size="small" style="width: 100%">
+                  <el-option v-for="i in isuseList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="排序" prop="sort">
+                <el-input v-model="form.sort" placeholder="请输入排序" size="small" type="Number"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="活动类型" prop="type">
+                <el-select v-model="form.type" clearable filterable placeholder="请选择活动类型" size="small" style="width: 100%">
+                  <el-option v-for="i in act_typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="8">
+                <el-form-item label="分享图片(237*190)" prop="share">
+                  <c-upload :url="url" v-model="form.share" :limit="1"></c-upload>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="封面图片(345*85)" prop="cover">
+                  <c-upload :url="url" v-model="form.cover" :limit="1"></c-upload>
+                </el-form-item>
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="活动说明" prop="content">
+                <el-form-item label="是否显示">
+                  <el-select v-model="form.content.is_use" placeholder="请选择">
+                    <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
+                  </el-select>
+                </el-form-item>
+                <el-form-item>
+                  <editor v-model="form.content.value" url="/files/point/act/upload" />
+                </el-form-item>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'tabs-1',
+  props: {
+    form: { type: Object },
+    // act_time: { type: Object },
+    // content: { type: Object },
+    act_typeList: { type: Array },
+    isuseList: { type: Array },
+    url: { type: String },
+    rules: { type: Object },
+  },
+  components: {
+    editor: () => import('@/components/editor.vue'),
+    cUpload: () => import('@/components/usual/c-upload.vue'),
+  },
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 129 - 0
src/views/platActivi/act/parts/goods/tabs-1.vue

@@ -0,0 +1,129 @@
+<template>
+  <div id="tabs-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form :model="form" :rules="rules" ref="form" label-width="180px">
+            <el-col :span="18">
+              <el-form-item label="活动时间" prop="act_time">
+                <el-form ref="act_time" :model="act_time" label-width="80px">
+                  <el-form-item label="是否显示">
+                    <el-select v-model="act_time.is_use" placeholder="请选择">
+                      <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
+                    </el-select>
+                  </el-form-item>
+                  <el-form-item label="活动标题">
+                    <el-input v-model="act_time.title"></el-input>
+                  </el-form-item>
+                  <el-form-item label="说明">
+                    <el-input v-model="act_time.value"></el-input>
+                  </el-form-item>
+                </el-form>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="是否在首页展示" prop="show_index">
+                <el-select v-model="form.show_index" clearable filterable placeholder="请选择是否在首页展示" size="small" style="width: 100%">
+                  <el-option v-for="i in isuseList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="是否开启" prop="is_use">
+                <el-select v-model="form.is_use" clearable filterable placeholder="请选择是否开启" size="small" style="width: 100%">
+                  <el-option v-for="i in isuseList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="排序" prop="sort">
+                <el-input v-model="form.sort" placeholder="请输入排序" size="small" type="Number"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="13">
+              <el-form-item label="活动类型" prop="type" v-if="goodsAct == true">
+                <el-select v-model="form.type" clearable filterable placeholder="请选择活动类型" size="small" style="width: 100%">
+                  <el-option v-for="i in act_typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+                <p>活动有商品时,不允许修改活动类型</p>
+              </el-form-item>
+              <el-form-item label="活动类型" prop="type" v-else-if="goodsAct == false">
+                <el-select v-model="form.type" disabled clearable filterable placeholder="请选择活动类型" size="small" style="width: 100%">
+                  <el-option v-for="i in act_typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
+                </el-select>
+                <p>活动有商品时,不允许修改活动类型</p>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="8">
+                <el-form-item label="分享图片(237*190)" prop="share">
+                  <c-upload :url="url" v-model="form.share" :limit="1"></c-upload>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="封面图片(345*85)" prop="cover">
+                  <c-upload :url="url" v-model="form.cover" :limit="1"></c-upload>
+                </el-form-item>
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="活动说明" prop="content">
+                <el-form ref="content" :model="content" label-width="80px">
+                  <el-form-item label="是否显示">
+                    <el-select v-model="content.is_use" placeholder="请选择">
+                      <el-option v-for="i in isuseList" :key="i.model" :label="i.label" :value="i.value"></el-option>
+                    </el-select>
+                  </el-form-item>
+                  <el-form-item>
+                    <editor v-model="content.value" url="/files/point/act/upload" />
+                  </el-form-item>
+                </el-form>
+              </el-form-item>
+            </el-col>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'tabs-1',
+  props: {
+    form: { type: Object },
+    act_time: { type: Object },
+    content: { type: Object },
+    act_typeList: { type: Array },
+    isuseList: { type: Array },
+    url: { type: String },
+    rules: { type: Object },
+    goodsAct: { type: Boolean },
+  },
+  components: {
+    editor: () => import('@/components/editor.vue'),
+    cUpload: () => import('@/components/usual/c-upload.vue'),
+  },
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 78 - 0
src/views/platActivi/act/parts/goods/tabs-2 copy.vue

@@ -0,0 +1,78 @@
+<template>
+  <div id="tabs-2">
+    <el-row>
+      <el-col :span="16" class="main">
+        <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+          <el-form-item label="设置" prop="config">
+            <el-form-item label="活动时间">
+              <el-date-picker
+                v-model="form.config.time"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                format="yyyy-MM-dd HH:mm:ss"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-form-item>
+          <el-form-item label="满减设置" prop="manJian" v-if="form.type == '5'">
+            <el-form-item label="消费金额下限">
+              <el-input v-model="form.manJian.limit" placeholder="请输入消费金额下限" size="small" type="Number"></el-input>
+            </el-form-item>
+            <el-form-item label="满减金额">
+              <el-input v-model="form.manJian.number" placeholder="请输入满减金额" size="small" type="Number"></el-input>
+            </el-form-item>
+          </el-form-item>
+          <el-form-item label="满减折扣设置" prop="manZhe" v-if="form.type == '6'">
+            <el-form-item label="消费金额下限">
+              <el-input v-model="form.manZhe.limit" placeholder="请输入消费金额下限" size="small" type="Number"></el-input>
+            </el-form-item>
+            <el-form-item label="满减折扣">
+              <el-input v-model="form.manZhe.number" placeholder="请输入满减折扣" size="small" type="Number"></el-input>
+            </el-form-item>
+            <el-form-item label="优惠金额上限">
+              <el-input v-model="form.manZhe.max" placeholder="请输入优惠金额上限" size="small" type="Number"></el-input>
+            </el-form-item>
+          </el-form-item>
+        </el-form>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'tabs-2',
+  props: {
+    form: { type: Object },
+    rules: { type: Object },
+    // config: { type: Object },
+    // manJian: { type: Object },
+    // manZhe: { type: Object },
+  },
+  components: {},
+  data: function () {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 159 - 0
src/views/platActivi/act/parts/goods/tabs-2.vue

@@ -0,0 +1,159 @@
+<template>
+  <div id="tabs-2">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24">
+          <el-form ref="config" :model="config" label-width="100px">
+            <el-form-item label="活动时间" prop="time">
+              <el-date-picker
+                v-model="config.time"
+                type="datetimerange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                format="yyyy-MM-dd HH:mm:ss"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="加价购下限金额" prop="plus_money" v-if="form.type == '4'">
+              <el-input v-model="config.plus_money" type="number" placeholder="请输入加价购下限金额"></el-input>
+            </el-form-item>
+            <el-form-item label="满减设置" prop="manJian" v-if="form.type == '5'">
+              <el-col :span="24" style="margin: 0 0 10px 0">
+                <el-button type="primary" size="mini" @click="toAdd()">添加</el-button>
+              </el-col>
+              <data-table :usePage="false" :fields="fields_manJian" :opera="opera" :data="list" @edit="toEdit" @del="toDel"> </data-table>
+            </el-form-item>
+            <el-form-item label="满减折扣设置" prop="manZhe" v-if="form.type == '6'">
+              <el-col :span="24" style="margin: 0 0 10px 0">
+                <el-button type="primary" size="mini" @click="toAdd()">添加</el-button>
+              </el-col>
+              <data-table :usePage="false" :fields="fields_manZhe" :opera="opera" :data="list" @edit="toEdit" @del="toDel"> </data-table>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+    <e-dialog :dialog="dialog" @toClose="toClose">
+      <template v-slot:info>
+        <data-form :span="24" :fields="field_manJian" :rules="rules_manJian" v-model="manJian" labelWidth="150px" @save="onSubmit" v-if="form.type == '5'">
+        </data-form>
+        <data-form :span="24" :fields="field_manZhe" :rules="rules_manZhe" v-model="manZhe" labelWidth="150px" @save="onSubmit" v-if="form.type == '6'">
+        </data-form>
+      </template>
+    </e-dialog>
+  </div>
+</template>
+
+<script>
+const moment = require('moment');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'tabs-2',
+  props: {
+    form: { type: Object },
+    config: { type: Object },
+    list: { type: Array },
+  },
+  components: {},
+  data: function () {
+    return {
+      // 底部菜单
+      opera: [
+        { label: '修改', method: 'edit' },
+        { label: '删除', method: 'del', confirm: true, type: 'danger' },
+      ],
+      fields_manJian: [
+        { label: '消费金额下限', model: 'limit' },
+        { label: '减满金额', model: 'number' },
+      ],
+      fields_manZhe: [
+        { label: '消费金额下限', model: 'limit' },
+        { label: '减满折扣', model: 'number' },
+        { label: '优惠金额上限', model: 'max' },
+      ],
+      // 弹框
+      dialog: { title: '信息管理', show: false, type: '1' },
+      // 满减表单
+      rules_manJian: {
+        limit: [{ required: true, message: '请输入消费金额下限', trigger: 'blur' }],
+        number: [{ required: true, message: '请输入减满金额', trigger: 'blur' }],
+      },
+      manJian: {},
+      field_manJian: [
+        { label: '消费金额下限', model: 'limit', type: 'number' },
+        { label: '减满金额', model: 'number', type: 'number' },
+      ],
+      // 满折表单
+      rules_manZhe: {
+        limit: [{ required: true, message: '请输入消费金额下限', trigger: 'blur' }],
+        number: [{ required: true, message: '请输入减满折扣', trigger: 'blur' }],
+        max: [{ required: true, message: '请输入优惠金额上限', trigger: 'blur' }],
+      },
+      manZhe: {},
+      field_manZhe: [
+        { label: '消费金额下限', model: 'limit', type: 'number' },
+        { label: '减满折扣', model: 'number', type: 'number' },
+        { label: '优惠金额上限', model: 'max', type: 'number' },
+      ],
+    };
+  },
+  created() {},
+  methods: {
+    // 新增
+    async toAdd() {
+      this.dialog = { title: '信息管理', show: true, type: '1' };
+    },
+    // 提交
+    onSubmit({ data }) {
+      if (!data.id) data.id = moment(new Date()).valueOf();
+      let info = this.list.find((f) => f.id == data.id);
+      if (info == '' || info == undefined) {
+        this.list.push(data);
+      }
+      this.toClose();
+    },
+    // 关闭
+    toClose() {
+      if (this.form.type == '5') {
+        this.manJian = {};
+        this.dialog = { title: '信息管理', show: false, type: '1' };
+      } else if (this.form.type == '6') {
+        this.manZhe = {};
+        this.dialog = { title: '信息管理', show: false, type: '1' };
+      }
+    },
+    // 修改
+    toEdit({ data }) {
+      if (this.form.type == '5') {
+        this.$set(this, `manJian`, data);
+        this.dialog = { title: '信息管理', show: true, type: '1' };
+      } else if (this.form.type == '6') {
+        this.$set(this, `manZhe`, data);
+        this.dialog = { title: '信息管理', show: true, type: '1' };
+      }
+    },
+    // 删除
+    toDel({ data }) {
+      let newList = this.list.filter((i) => i.id != data.id);
+      this.$set(this, `list`, newList);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

src/views/platActivi/act/parts/search-1.vue → src/views/platActivi/act/search/search-1.vue


src/views/platActivi/act/parts/search-2.vue → src/views/platActivi/act/search/search-2.vue


+ 12 - 1
src/views/platActivi/coupon/index.vue

@@ -29,12 +29,14 @@
               :data="list"
               :total="total"
               @edit="toEdit"
+              @grant="toGrant"
               @del="toDel"
             >
             </data-table>
           </el-col>
         </span>
         <detail v-if="view === 'info'" :id="id" @toBack="toBack"></detail>
+        <grantUser v-if="view === 'user'" :id="id" @toBack="toBack"></grantUser>
       </el-col>
     </el-row>
   </div>
@@ -50,7 +52,11 @@ const { mapActions: shop } = createNamespacedHelpers('shop');
 export default {
   name: 'card-1',
   props: {},
-  components: { search1: () => import('./parts/search-1.vue'), detail: () => import('./detail.vue') },
+  components: {
+    search1: () => import('./parts/search-1.vue'),
+    detail: () => import('./detail.vue'),
+    grantUser: () => import('./parts/grantUser.vue'),
+  },
   data: function () {
     const that = this;
     return {
@@ -61,6 +67,7 @@ export default {
       total: 0,
       opera: [
         { label: '修改', method: 'edit' },
+        { label: '发放', method: 'grant' },
         { label: '删除', method: 'del', confirm: true, type: 'danger' },
       ],
       fields: [
@@ -134,6 +141,10 @@ export default {
     toBack() {
       this.view = 'list';
     },
+    toGrant({ data }) {
+      this.$set(this, `id`, data.id);
+      this.$set(this, `view`, 'user');
+    },
     // 修改
     async toEdit({ data }) {
       this.$set(this, `id`, data.id);

+ 157 - 0
src/views/platActivi/coupon/parts/grantUser.vue

@@ -0,0 +1,157 @@
+<template>
+  <div id="form-1">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col class="top-btn">
+          <el-button type="primary" size="mini" @click="toBack()">返回</el-button>
+        </el-col>
+        <el-col :span="24" class="two">
+          <data-search :fields="searchFields" v-model="searchInfo" @query="search"> </data-search>
+        </el-col>
+        <el-col class="top-btn">
+          <el-button type="warning" size="mini" @click="toGrant()">批量发放</el-button>
+        </el-col>
+        <el-col :span="24" class="four">
+          <data-table
+            :select="true"
+            :selected="selected"
+            @handleSelect="handleSelect"
+            :fields="fields"
+            :opera="opera"
+            @query="search"
+            :data="list"
+            :total="total"
+            @grant="toGrant"
+          >
+          </data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+const moment = require('moment');
+import { mapState, mapGetters, createNamespacedHelpers } from 'vuex';
+const { mapActions } = createNamespacedHelpers('users');
+const { mapActions: dictData } = createNamespacedHelpers('dictData');
+export default {
+  name: 'form-1',
+  props: { id: { type: String } },
+  components: {},
+  data: function () {
+    return {
+      // 列表
+      opera: [{ label: '发放', method: 'grant', confirm: true }],
+      // 多选值
+      selected: [],
+      fields: [
+        { label: 'openid', model: 'openid' },
+        { label: '用户姓名', model: 'name' },
+        { label: '电话', model: 'phone' },
+        { label: '邮箱', model: 'email' },
+        { label: '出生年月', model: 'birth' },
+        {
+          label: '性别',
+          model: 'gender',
+          format: (i) => {
+            let data = this.genderList.find((f) => f.value == i);
+            if (data) return data.label;
+            else return '';
+          },
+        },
+        {
+          label: '状态',
+          model: 'status',
+          format: (i) => {
+            let data = this.useList.find((f) => f.value == i);
+            if (data) return data.label;
+            else return '';
+          },
+        },
+      ],
+      list: [],
+      total: 0,
+      // 查询
+      searchInfo: {},
+      searchFields: [{ label: '用户姓名', model: 'name' }],
+      // 性别
+      genderList: [],
+      // 用户状态
+      useList: [],
+    };
+  },
+  async created() {
+    await this.searchOther();
+    await this.search();
+  },
+  methods: {
+    ...dictData({ dictQuery: 'query' }),
+    ...mapActions(['query', 'delete', 'fetch', 'update', 'create']),
+    // 查询
+    async search({ skip = 0, limit = this.$limit, ...info } = {}) {
+      let condition = _.cloneDeep(this.searchForm);
+      let res = await this.query({ skip, limit, ...condition, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, 'list', res.data);
+        this.$set(this, 'total', res.total);
+      }
+    },
+    // 返回
+    toBack() {
+      this.$emit('toBack');
+    },
+    // 多选
+    handleSelect(data) {
+      console.log(data);
+    },
+    toGrant() {},
+    // 重置
+    toClose() {
+      this.fieldform = {};
+      this.search();
+    },
+    async searchOther() {
+      let res;
+      // 性别
+      res = await this.dictQuery({ code: 'gender' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `genderList`, res.data);
+      }
+      // 用户状态
+      res = await this.dictQuery({ code: 'user_status' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `useList`, res.data);
+      }
+    },
+  },
+  computed: {},
+  metaform() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    font-size: 20px;
+    margin: 10px 0 0 20%;
+    padding: 5px;
+  }
+  .btn {
+    text-align: center;
+  }
+  .top-btn {
+    margin: 20px 0;
+  }
+}
+</style>