Browse Source

2024.06.15
- 完成组合活动页面和组合活动配置页面;

wzy 10 months ago
parent
commit
11b44776a6

+ 119 - 0
src/api/active/combinationActivities.js

@@ -0,0 +1,119 @@
+import request from '@/utils/request'
+
+// 分页查询平台组合活动配置
+export function getPlatformComposeConfigPage(data) {
+  return request({
+    url: '/platformComposeConfig/page',
+    method: 'post',
+    data
+  })
+}
+
+// 查询平台组合活动配置
+export function getPlatformComposeConfigById(params) {
+  return request({
+    url: `/platformComposeConfig/${params.id}`,
+    method: 'get',
+    params
+  })
+}
+
+// 新增平台组合活动配置
+export function savePlatformComposeConfig(data) {
+  return request({
+    url: '/platformComposeConfig/save',
+    method: 'post',
+    data
+  })
+}
+
+// 修改平台组合活动配置
+export function updatePlatformComposeConfig(data) {
+  return request({
+    url: '/platformComposeConfig/update',
+    method: 'post',
+    data
+  })
+}
+
+// 删除平台组合活动配置
+export function deletePlatformComposeConfig(params) {
+  return request({
+    url: `/platformComposeConfig/delete/${params.id}`,
+    method: 'delete',
+    params
+  })
+}
+
+// 分页查询平台组合活动
+export function getPlatformComposePage(data) {
+  return request({
+    url: '/platformCompose/page',
+    method: 'post',
+    data
+  })
+}
+
+// 查询平台组合活动配置
+export function getPlatformComposeById(params) {
+  return request({
+    url: `/platformCompose/${params.id}`,
+    method: 'get',
+    params
+  })
+}
+
+// 新增平台组合活动信息
+export function savePlatformComposeActivity(data) {
+  return request({
+    url: '/platformCompose/save',
+    method: 'post',
+    data
+  })
+}
+
+// 修改平台组合活动信息
+export function updatePlatformComposeActivity(data) {
+  return request({
+    url: '/platformCompose/update',
+    method: 'post',
+    data
+  })
+}
+
+// 删除平台组合活动信息
+export function deletePlatformComposeActivity(params) {
+  return request({
+    url: `/platformCompose/delete/${params.id}`,
+    method: 'delete',
+    params
+  })
+}
+
+// 停止平台组合活动
+export function updatePlatformComposeStop(data) {
+  return request({
+    url: '/platformCompose/stop',
+    method: 'post',
+    data
+  })
+}
+
+// 组合参与店铺查询
+export function getPlatformComposeShop(data) {
+  return request({
+    url: '/platformCompose/getComposeShop',
+    method: 'post',
+    data
+  })
+}
+
+// 数据效果查询
+export function getPlatformComposeData(data) {
+  return request({
+    url: '/platformCompose/getCurrencyData',
+    method: 'post',
+    data
+  })
+}
+

+ 133 - 0
src/views/active/combinationActivities/components/ActivityProducts.vue

@@ -0,0 +1,133 @@
+<template>
+  <el-dialog :visible.sync="visible" v-bind="modalOptions" append-to-body>
+    <div>
+      <div>
+        <el-table
+          v-loading="productListLoading" height="60vh" element-loading-text="正在查询中。。。" :data="productDataList"
+          v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+        >
+          <el-table-column align="center" width="100" label="产品主图" prop="image">
+            <template slot-scope="{ row }">
+              <el-image
+                v-if="row.image" lazy :src="common.seamingImgUrl(row.image)"
+                style="width:40px;height:40px;" fit="cover"
+                :preview-src-list="[ common.seamingImgUrl(row.image) ]"
+              />
+              <span v-else>--</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="productName" label="产品名称" />
+          <el-table-column prop="productId" label="产品id" />
+          <el-table-column prop="price" label="售价(元)" />
+          <el-table-column prop="originalPrice" label="原价(元)" />
+          <el-table-column prop="stockNumber" label="库存(件)" />
+          <el-table-column prop="volume" label="累计销量(件)" />
+          <el-table-column label="上架状态">
+            <template slot-scope="scope">
+              <span v-if="scope.row.shelveState == 1">上架</span>
+              <span v-if="scope.row.shelveState == 0">下架</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div>
+        <el-pagination
+          :current-page="productListQuery.page" :page-sizes="[10, 20, 50, 100]"
+          :page-size="productListQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="productTotal"
+          @size-change="(val) => ((productListQuery.pageSize = val) && getActivityProductList())"
+          @current-change="(val) => ((productListQuery.page = val) && getActivityProductList())"
+        />
+      </div>
+    </div>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">关 闭</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { activeGetProducts } from '@/api/active'
+
+export default {
+  name: 'ActivityProducts',
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '920px',
+        title: '店铺的活动产品'
+      },
+      visible: false,
+      formData: {
+        signId: ''
+      },
+      productDataList: [],
+      productTotal: 0,
+      productListLoading: true,
+      productListQuery: {
+        signId: '',
+        page: 1,
+        pageSize: 10
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    async initList() {
+      this.productListQuery = { signId: this.formData.signId || '', page: 1, pageSize: 10 }
+      this.getActivityProductList()
+    },
+    handleOpen(params = {}) {
+      this.formData = Object.assign(this.$options.data().formData, params)
+      this.initList()
+      if (params.signId) {
+        // this.getInfo(params.signId)
+      }
+      this.visible = true
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await xxx({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          signId: res.data.signId || ''
+        })
+      } finally {
+        loading.close()
+      }
+    },
+    handleSubmit() {
+    },
+
+    async getActivityProductList() {
+      this.productListLoading = true
+      try {
+        const res = await activeGetProducts(this.productListQuery)
+        this.productDataList = res.data.list
+        this.productTotal = res.data.total
+      } finally {
+        this.productListLoading = false
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.small-padding {
+	.cell {
+		padding-left: 5px;
+		padding-right: 5px;
+	}
+}
+
+.fixed-width {
+	.el-button--mini {
+		padding: 7px 10px;
+	}
+}
+</style>

+ 109 - 0
src/views/active/combinationActivities/components/ActivityReview.vue

@@ -0,0 +1,109 @@
+<template>
+  <el-dialog :visible.sync="visible" v-bind="modalOptions" append-to-body>
+    <div>
+      <div>
+        <el-table
+          v-loading="reviewListLoading" height="60vh" element-loading-text="正在查询中。。。" :data="reviewDataList"
+          v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+        >
+          <el-table-column label="动态" width="220">
+            <template slot-scope="scope">
+              {{ scope.row.operationDescribtion }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="createTime" label="时间" />
+          <el-table-column prop="name" label="操作人" />
+          <el-table-column prop="remark" label="其他信息" />
+        </el-table>
+      </div>
+    </div>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">关 闭</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { activeGetExamines } from '@/api/active'
+
+export default {
+  name: 'ActivityReview',
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '920px',
+        title: '店铺的活动审核记录'
+      },
+      visible: false,
+      formData: {
+        shopId: '',
+        composeId: '',
+        signId: ''
+      },
+      reviewDataList: [],
+      reviewListLoading: true,
+      reviewListQuery: {
+        only: ''
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    async initList() {
+      this.reviewListQuery = { only: `${this.formData.shopId}-${this.formData.composeId}-${this.formData.signId}` }
+      this.getActivityReviewList()
+    },
+    handleOpen(params = {}) {
+      this.formData = Object.assign(this.$options.data().formData, params)
+      this.initList()
+      if (params.shopId) {
+        // this.getInfo(params.shopId)
+      }
+      this.visible = true
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await xxx({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          shopId: res.data.shopId || ''
+        })
+      } finally {
+        loading.close()
+      }
+    },
+    handleSubmit() {
+    },
+
+    async getActivityReviewList() {
+      this.reviewListLoading = true
+      try {
+        const res = await activeGetExamines(this.reviewListQuery)
+        this.reviewDataList = res.data
+      } finally {
+        this.reviewListLoading = false
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.small-padding {
+	.cell {
+		padding-left: 5px;
+		padding-right: 5px;
+	}
+}
+
+.fixed-width {
+	.el-button--mini {
+		padding: 7px 10px;
+	}
+}
+</style>

+ 448 - 0
src/views/active/combinationActivities/components/DetailModal.vue

@@ -0,0 +1,448 @@
+<template>
+  <el-dialog :visible.sync="visible" v-bind="modalOptions" append-to-body>
+    <div>
+      <div>
+        <el-tabs v-model="activeName">
+          <el-tab-pane label="活动信息" name="first">
+            <div>
+              <h2 style="font-weight: bold;">活动信息</h2>
+              <div style="padding: 10px 20px 16px;font-size: 18px;">
+                <div style="padding: 4px 0 0;">
+                  <span>活动名称:</span>
+                  <span>{{ formData.composeName }}</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>活动备注:</span>
+                  <span>{{ formData.remark }}</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>报名时间:</span>
+                  <span>{{ formData.signStartTime }}-{{ formData.signEndTime }}</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>起止时间:</span>
+                  <span>{{ formData.startTime }}-{{ formData.endTime }}</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>活动保证金:</span>
+                  <span>
+                    <el-radio-group v-model="formData.ifBond">
+                      <el-radio :label="1" disabled>需要</el-radio>
+                      <el-radio :label="0" disabled>不需要</el-radio>
+                    </el-radio-group>
+                  </span>
+                </div>
+                <div v-if="formData.ifBond" style="padding: 4px 0 0;">
+                  <span>保证金金额:</span>
+                  <span>{{ formData.bondMoney }}</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>活动状态:</span>
+                  <span v-if="formData.state === 0">报名未开始</span>
+                  <span v-if="formData.state === 1">报名进行中</span>
+                  <span v-if="formData.state === 2">活动待开始</span>
+                  <span v-if="formData.state === 3">活动进行中</span>
+                  <span v-if="formData.state === 4">活动已结束</span>
+                </div>
+              </div>
+            </div>
+            <div>
+              <h2 style="font-weight: bold;">优惠规则</h2>
+              <div style="padding: 10px 20px 16px;font-size: 18px;">
+                <div style="padding: 4px 0 0;">
+                  <span>是否限购:</span>
+                  <span>
+                    <el-radio-group v-model="formData.ifLimit">
+                      <el-radio :label="2" disabled>限购</el-radio>
+                      <el-radio :label="1" disabled>不限购</el-radio>
+                    </el-radio-group>
+                  </span>
+                </div>
+                <div v-if="formData.ifLimit == 2" style="padding: 4px 0 0;">
+                  <span>商品限购:</span>
+                  <span>限购{{ formData.limitNumber || 0 }}人</span>
+                </div>
+                <div style="padding: 4px 0 0;">
+                  <span>优惠券叠加:</span>
+                  <span>
+                    <el-radio-group v-model="formData.ifAdd">
+                      <el-radio :label="1" disabled>叠加</el-radio>
+                      <el-radio :label="0" disabled>不叠加</el-radio>
+                    </el-radio-group>
+                  </span>
+                </div>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="参与店铺" name="second">
+            <!-- 查询和其他操作 -->
+            <div class="filter-container">
+              <el-input
+                v-model="shopListQuery.shopName" clearable size="mini" class="filter-item"
+                style="width: 200px;"
+                maxlength="20" placeholder="请输入店铺名称"
+              />
+              <el-input
+                v-model="shopListQuery.shopCode" clearable size="mini" class="filter-item"
+                style="width: 200px;margin-left:10px;" maxlength="20" placeholder="请输入店铺编码"
+              />
+              <el-select
+                v-model="shopListQuery.state" clearable size="mini" class="filter-item"
+                style="width: 200px;margin-left:10px;" placeholder="请选择审核状态"
+              >
+                <el-option label="待审核" :value="0" />
+                <el-option label="报名成功" :value="1" />
+                <el-option label="报名失败" :value="2" />
+                <el-option label="报名进行中" :value="3" />
+              </el-select>
+              <el-button
+                size="mini" class="filter-item" type="primary" icon="el-icon-search"
+                style="margin-left:10px;"
+                @click="handleSearchShop"
+              >
+                查找
+              </el-button>
+            </div>
+            <!-- 表格 -->
+            <div>
+              <div>
+                <el-table
+                  v-loading="shopListLoading" height="60vh" element-loading-text="正在查询中。。。" :data="shopDataList"
+                  v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+                >
+                  <el-table-column label="店铺名称" width="220">
+                    <template slot-scope="scope">{{ scope.row.shopName }}</template>
+                  </el-table-column>
+                  <el-table-column prop="shopCode" label="店铺编码" />
+                  <el-table-column prop="products" label="参与商品数" />
+                  <el-table-column prop="examines" label="审核次数" />
+                  <el-table-column label="审核状态">
+                    <template slot-scope="scope">
+                      <span v-if="scope.row.state == 0">待审核</span>
+                      <span v-if="scope.row.state == 1">报名成功</span>
+                      <span v-if="scope.row.state == 2">报名失败</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    align="center" label="操作" width="280" fixed="right"
+                    class-name="small-padding fixed-width"
+                  >
+                    <template slot-scope="{ row }">
+                      <el-button
+                        type="warning" size="mini"
+                        @click="$refs.ActivityProducts && $refs.ActivityProducts.handleOpen(row)"
+                      >
+                        查看商品
+                      </el-button>
+                      <el-button size="mini" @click="$refs.ActivityReview && $refs.ActivityReview.handleOpen(row)">
+                        审核记录
+                      </el-button>
+                      <el-button
+                        v-if="row.state === 0" type="danger" size="mini"
+                        @click="$refs.RegistrationReview && $refs.RegistrationReview.handleOpen(row)"
+                      >
+                        审核
+                      </el-button>
+                      <el-button v-if="row.state === 1" type="danger" size="mini" @click="handleRetirement(row)">
+                        清退
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                </el-table>
+              </div>
+              <div>
+                <el-pagination
+                  :current-page="shopListQuery.page" :page-sizes="[10, 20, 50, 100]"
+                  :page-size="shopListQuery.pageSize" layout="total, sizes, prev, pager, next, jumper"
+                  :total="shopTotal" @size-change="(val) => ((shopListQuery.pageSize = val) && getActivityShopList())"
+                  @current-change="(val) => ((shopListQuery.page = val) && getActivityShopList())"
+                />
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="活动数据" name="third">
+            <div
+              style="display: flex;align-items: center;justify-content: space-between;padding: 14px 20px;text-align: center;font-size: 20px;"
+            >
+              <div>
+                <div>浏览量</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.visit }}
+                </div>
+              </div>
+              <div>
+                <div>支付订单数</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.orders }}
+                </div>
+              </div>
+              <div>
+                <div>支付买家数</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.pays }}
+                </div>
+              </div>
+              <div>
+                <div>支付转化率</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.conversion }}
+                </div>
+              </div>
+              <div>
+                <div>参与商家数</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.shops }}
+                </div>
+              </div>
+              <div>
+                <div>参与商品数</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.products }}
+                </div>
+              </div>
+              <div>
+                <div>活动成交金额</div>
+                <div style="margin-top: 4px;font-size: 24px;font-weight: bold;color: #ffae11;">
+                  {{ recordInfo.total }}
+                </div>
+              </div>
+            </div>
+            <!-- <div>
+              <span>商家数据明细</span>
+              <el-button type="primary">导出</el-button>
+              </div> -->
+            <div>
+              <div>
+                <el-table
+                  v-loading="recordListLoading" height="60vh" element-loading-text="正在查询中。。。"
+                  :data="recordDataList"
+                  v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+                >
+                  >
+                  <el-table-column prop="shopName" label="店铺名称" />
+                  <el-table-column prop="shopCode" label="店铺编码" />
+                  <el-table-column prop="products" label="参与商品数(件)" />
+                  <el-table-column prop="persons" label="访客数" />
+                  <el-table-column prop="orders" label="提交订单数" />
+                  <el-table-column prop="finish" label="成交比数" />
+                  <el-table-column prop="total" label="成交总额" />
+                </el-table>
+              </div>
+              <div>
+                <el-pagination
+                  :current-page="chartListQuery.page" :page-sizes="[10, 20, 50, 100]"
+                  :page-size="chartListQuery.pageSize" layout="total, sizes, prev, pager, next, jumper"
+                  :total="shopTotal" @size-change="(val) => ((chartListQuery.pageSize = val) && getActivityInfoList())"
+                  @current-change="(val) => ((chartListQuery.page = val) && getActivityInfoList())"
+                />
+              </div>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
+
+      <!-- 查看店铺的活动产品 -->
+      <ActivityProducts ref="ActivityProducts" />
+      <!-- 查看店铺的活动审核记录 -->
+      <ActivityReview ref="ActivityReview" />
+      <!-- 店铺的报名审核 -->
+      <RegistrationReview ref="RegistrationReview" @success="getActivityShopList" />
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import ActivityProducts from './ActivityProducts'
+import ActivityReview from './ActivityReview'
+import RegistrationReview from './RegistrationReview'
+import { getPlatformComposeById, getPlatformComposeShop, getPlatformComposeData } from '@/api/active/combinationActivities'
+import { activeLiquidation } from '@/api/active'
+
+export default {
+  name: 'DetailModal',
+  components: {
+    ActivityProducts,
+    ActivityReview,
+    RegistrationReview
+  },
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '900px',
+        title: '查看组合活动详情'
+      },
+      visible: false,
+      formData: {
+        composeId: '',
+        composeName: '',
+        remark: '',
+        signStartTime: '',
+        signEndTime: '',
+        startTime: '',
+        endTime: '',
+        ifLimit: '',
+        limitNumber: '',
+        ifAdd: '',
+        state: '',
+        ifBond: '',
+        bondMoney: '',
+        shops: null,
+        products: null,
+        createTime: '',
+        updateTime: ''
+      },
+
+      activeName: 'first',
+      // 活动参与的店铺查询参数
+      shopDataList: [],
+      shopTotal: 0,
+      shopListLoading: true,
+      shopListQuery: {
+        composeId: '',
+        shopName: '',
+        shopCode: '',
+        state: '',
+        page: 1,
+        pageSize: 10
+      },
+      // 获取活动数据的参数
+      recordInfo: {
+        visit: 0,
+        orders: 0,
+        pays: 0,
+        conversion: 0,
+        shops: 0,
+        products: 0,
+        total: 0
+      },
+      recordDataList: [],
+      recordTotal: 0,
+      recordListLoading: true,
+      chartListQuery: {
+        composeId: '',
+        page: 1,
+        pageSize: 10
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    async initList() {
+      this.activeName = 'first'
+      this.shopListQuery = { composeId: this.formData.composeId || '', shopName: '', shopCode: '', state: '', page: 1, pageSize: 10 }
+      this.chartListQuery = { composeId: this.formData.composeId || '', page: 1, pageSize: 10 }
+      this.getActivityShopList()
+      this.getActivityInfoList()
+    },
+    handleOpen(params = {}) {
+      this.formData = Object.assign(this.$options.data().formData, params)
+      this.initList()
+      if (params.composeId) {
+        this.getInfo(params.composeId)
+      }
+      this.visible = true
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await getPlatformComposeById({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          composeId: res.data.composeId || '',
+          composeName: res.data.composeName || '',
+          remark: res.data.remark || '',
+          signStartTime: res.data.signStartTime || '',
+          signEndTime: res.data.signEndTime || '',
+          startTime: res.data.startTime || '',
+          endTime: res.data.endTime || '',
+          ifLimit: res.data.ifLimit || '',
+          limitNumber: res.data.limitNumber || '',
+          ifAdd: res.data.ifAdd,
+          state: res.data.state,
+          ifBond: res.data.ifBond,
+          bondMoney: res.data.bondMoney || '',
+          shops: res.data.shops || null,
+          products: res.data.products || null,
+          createTime: res.data.createTime || '',
+          updateTime: res.data.updateTime || ''
+        })
+      } finally {
+        loading.close()
+      }
+    },
+
+    //  获取活动参与的店铺
+    async getActivityShopList() {
+      this.shopListLoading = true
+      try {
+        const res = await getPlatformComposeShop(this.shopListQuery)
+        this.shopDataList = res.data.list
+        this.shopTotal = res.data.total
+      } finally {
+        this.shopListLoading = false
+      }
+    },
+    handleSearchShop() {
+      this.shopListQuery.page = 1
+      this.getActivityShopList()
+    },
+
+    //  获取活动参数的数据
+    async getActivityInfoList() {
+      this.recordListLoading = true
+      try {
+        const res = await getPlatformComposeData(this.chartListQuery)
+        this.recordInfo = {
+          visit: res.data.visit || 0,
+          orders: res.data.orders || 0,
+          pays: res.data.pays || 0,
+          conversion: res.data.conversion || 0,
+          shops: res.data.shops || 0,
+          products: res.data.products || 0,
+          total: res.data.total || 0
+        }
+        this.recordDataList = res.data.shopDataDetails.list
+        this.recordTotal = res.data.shopDataDetails.total
+      } finally {
+        this.recordListLoading = false
+      }
+    },
+
+    // 清退
+    handleRetirement(row) {
+      this.$confirm('清退后商家的所有商品将退出本次活动', '确认要清退本商家吗?')
+        .then(async () => {
+          await activeLiquidation({ signId: row.signId })
+          this.$message({ message: '清退成功!', type: 'success' })
+          this.getActivityShopList()
+        })
+        .catch(() => { })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.filter-container {
+	.filter-item {
+		display: inline-block;
+		vertical-align: middle;
+		margin-bottom: 10px;
+	}
+}
+
+.small-padding {
+	.cell {
+		padding-left: 5px;
+		padding-right: 5px;
+	}
+}
+
+.fixed-width {
+	.el-button--mini {
+		padding: 7px 10px;
+	}
+}
+</style>

+ 230 - 0
src/views/active/combinationActivities/components/EditModal.vue

@@ -0,0 +1,230 @@
+<template>
+  <el-dialog :visible.sync="visible" v-bind="modalOptions">
+    <el-form ref="formData" :model="formData" :rules="formRules" size="mini" label-suffix=":" label-width="150px">
+      <h2>基础信息</h2>
+      <el-form-item label="活动名称" prop="composeName">
+        <el-input
+          v-model="formData.composeName" maxlength="20" placeholder="请输入活动名称"
+          :disabled="formData.state === 0"
+        />
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input
+          v-model="formData.remark" maxlength="255" type="textarea" placeholder="请输入活动介绍"
+          :disabled="formData.state === 0" style="width: 400px;"
+        />
+      </el-form-item>
+      <el-form-item label="报名时间" prop="dateTime1">
+        <el-date-picker
+          v-model="formData.dateTime1" type="datetimerange" range-separator="至" start-placeholder="开始时间"
+          end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss"
+          :disabled="(formData.state === 3) || (formData.state === 4)"
+        />
+        <p class="timeInfo">报名时间不能交叉且报名时间不能大于活动时间</p>
+      </el-form-item>
+      <el-form-item label="活动时间" prop="dateTime2">
+        <el-date-picker
+          v-model="formData.dateTime2" type="datetimerange" range-separator="至" start-placeholder="开始时间"
+          end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss"
+          :disabled="(formData.state === 3) || (formData.state === 4)"
+        />
+        <p class="timeInfo">平台活动时间不能交叉并且活动时间不能小于报名时间</p>
+      </el-form-item>
+      <el-form-item label="活动保证金">
+        <el-radio-group v-model="formData.ifBond">
+          <el-radio :label="1" :disabled="formData.state === 0">需要</el-radio>
+          <el-radio :label="0" :disabled="formData.state === 0">不需要</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item v-if="formData.ifBond === 1" label="保证金金额">
+        <el-input
+          v-model="formData.bondMoney" maxlength="9" placeholder="请输入活动保证金金额"
+          :disabled="formData.state === 0"
+        />
+      </el-form-item>
+      <h2>优惠规则</h2>
+      <el-form-item label="是否限购">
+        <el-radio-group v-model="formData.ifLimit">
+          <el-radio :label="2" :disabled="formData.state === 0">限购</el-radio>
+          <el-radio :label="1" :disabled="formData.state === 0">不限购</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item v-if="formData.ifLimit === 2" label="限购(件/人)">
+        <el-input v-model="formData.limitNumber" maxlength="9" placeholder="请输入限购数量" :disabled="formData.state === 0" />
+      </el-form-item>
+      <el-form-item label="优惠券叠加">
+        <el-radio-group v-model="formData.ifAdd">
+          <el-radio :label="1" :disabled="formData.state === 0">叠加</el-radio>
+          <el-radio :label="0" :disabled="formData.state === 0">不叠加</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button type="primary" size="mini" @click="handleSubmit">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { getPlatformComposeById, savePlatformComposeActivity, updatePlatformComposeActivity } from '@/api/active/combinationActivities'
+
+export default {
+  name: 'EditModal',
+  components: {
+  },
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '820px',
+        title: ''
+      },
+      visible: false,
+      formData: {
+        dateTime1: [], // 后端不接收
+        dateTime2: [], // 后端不接收
+        composeId: '',
+        composeName: '',
+        remark: '',
+        signStartTime: '',
+        signEndTime: '',
+        startTime: '',
+        endTime: '',
+        ifLimit: '',
+        limitNumber: '',
+        ifAdd: '',
+        state: '',
+        ifBond: '', // 活动保证金
+        bondMoney: '', // 保证金金额
+        shops: null,
+        products: null
+      },
+      formRules: {
+        remark: [
+          { max: 255, message: '长度在 255 个字符内', trigger: 'blur' }
+        ],
+        composeName: [
+          { required: true, message: '请输入活动名称', trigger: 'blur' }
+        ],
+        dateTime1: [
+          { type: 'array', required: true, message: '请选择报名时间' }
+        ],
+        dateTime2: [
+          { type: 'array', required: true, message: '请选择活动时间' }
+        ],
+        bondMoney: []
+      }
+    }
+  },
+  watch: {
+    'formData.ifBond': {
+      deep: true,
+      handler(val) {
+        if (val) {
+          this.formRules.bondMoney = [
+            { required: true, message: '请输入金额', trigger: 'blur' },
+            { pattern: /^0\.\d{0,2}$|^[1-9]\d*\.\d{0,2}$|^[1-9]\d*$/, message: '数值有误' }
+          ]
+        } else {
+          this.formRules.bondMoney = []
+        }
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    async initList() {
+    },
+    handleOpen(params = {}) {
+      this.modalOptions.title = params.composeId ? '编辑组合活动' : '添加组合活动'
+      this.formData = Object.assign(this.$options.data().formData, params, {
+        dateTime1: params.signStartTime || params.signEndTime ? [params.signStartTime, params.signEndTime] : '',
+        dateTime2: params.startTime || params.endTime ? [params.startTime, params.endTime] : ''
+      })
+      this.visible = true
+      this.initList()
+      if (params.composeId) {
+        this.getInfo(params.composeId)
+      } else {
+        this.$refs.formData && this.$refs.formData.resetFields()
+      }
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await getPlatformComposeById({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          composeId: res.data.composeId || '',
+          composeName: res.data.composeName || '',
+          remark: res.data.remark || '',
+          signStartTime: res.data.signStartTime || '',
+          signEndTime: res.data.signEndTime || '',
+          startTime: res.data.startTime || '',
+          endTime: res.data.endTime || '',
+          ifLimit: res.data.ifLimit || '',
+          limitNumber: res.data.limitNumber || '',
+          ifAdd: res.data.ifAdd,
+          state: res.data.state,
+          ifBond: res.data.ifBond,
+          bondMoney: res.data.bondMoney || '',
+          shops: res.data.shops || null,
+          products: res.data.products || null
+        })
+        this.$nextTick(() => {
+          this.$refs.formData && this.$refs.formData.validate()
+        })
+      } finally {
+        loading.close()
+      }
+    },
+    handleSubmit() {
+      this.$refs.formData.validate(async (valid) => {
+        if (valid) {
+          const loading = this.$loading({ text: '加载中' })
+          try {
+            const { dateTime1, dateTime2, ...otps } = this.formData
+            const params = {
+              ...otps,
+              signStartTime: dateTime1 && dateTime1[0],
+              signEndTime: dateTime1 && dateTime1[1],
+              startTime: dateTime2 && dateTime2[0],
+              endTime: dateTime2 && dateTime2[1]
+            }
+            let errMsg = ''
+            if (params.composeName === '') {
+              errMsg += ' 活动名称 '
+            }
+            if (params.signStartTime === '' || params.signEndTime === '') {
+              errMsg += ' 报名时间 '
+            }
+            if (params.startTime === '' || params.endTime === '') {
+              errMsg += ' 活动时间 '
+            }
+            if (errMsg.length !== 0) {
+              this.$message.error(`请输入${errMsg}`)
+              return
+            }
+            this.formData.composeId ? await updatePlatformComposeActivity(params) : await savePlatformComposeActivity(params)
+            loading.close()
+            this.$message({ message: `${this.formData.composeId ? '编辑' : '添加'}成功!`, type: 'success' })
+            this.$emit('success')
+            this.visible = false
+          } catch (e) {
+            loading.close()
+          } finally {
+            loading.close()
+          }
+        } else {
+          this.$message({ message: '请输入相关信息', type: 'warning' })
+          return false
+        }
+      })
+    }
+  }
+}
+</script>

+ 125 - 0
src/views/active/combinationActivities/components/RegistrationReview.vue

@@ -0,0 +1,125 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    v-bind="modalOptions"
+    append-to-body
+  >
+    <el-form
+      ref="formData"
+      :model="formData"
+      :rules="formRules"
+      size="mini"
+      label-suffix=":"
+      label-width="150px"
+    >
+      <el-form-item label="审核状态" prop="state">
+        <el-radio-group v-model="formData.state">
+          <el-radio label="1">报名成功</el-radio>
+          <el-radio label="2">报名失败</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="备注" prop="remark">
+        <el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" maxlength="520" :rows="3" show-word-limit />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button type="primary" size="mini" @click="handleSubmit">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { activExamine } from '@/api/active'
+
+export default {
+  name: 'RegistrationReview',
+  components: {
+  },
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '620px',
+        title: ''
+      },
+      visible: false,
+      formData: {
+        signId: '', // 报名id
+        state: '1', // 审核状态 1-报名成功 2-报名失败
+        remark: '' // 备注
+      },
+      formRules: {
+        signId: [
+          { required: true, message: '缺少报名信息' }
+        ],
+        state: [
+          { required: true, message: '请选择状态' }
+        ],
+        remark: [
+          { required: false, message: '请输入备注' }
+        ]
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    initList() {
+    },
+    handleOpen(params = {}) {
+      this.modalOptions.title = params.signId ? '店铺的报名审核' : '--'
+      this.visible = true
+      this.initList()
+      if (params.signId) {
+        // this.getInfo(params.signId)
+      } else {
+        this.$refs.formData && this.$refs.formData.resetFields()
+      }
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await xxx({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          signId: res.data.signId || ''
+        })
+        this.$nextTick(() => {
+          this.$refs.formData && this.$refs.formData.validate()
+        })
+      } finally {
+        loading.close()
+      }
+    },
+    handleSubmit() {
+      this.$refs.formData.validate(async (valid) => {
+        if (valid) {
+          const loading = this.$loading({ text: '加载中' })
+          try {
+            const { ...otps } = this.formData
+            const params = {
+              ...otps
+            }
+            await activExamine(params)
+            loading.close()
+            this.$message({ message: `处理成功!`, type: 'success' })
+            this.$emit('success')
+            this.visible = false
+          } catch (e) {
+            loading.close()
+          } finally {
+            loading.close()
+          }
+        } else {
+          this.$message({ message: '请输入相关信息', type: 'warning' })
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+

+ 199 - 0
src/views/active/combinationActivities/index.vue

@@ -0,0 +1,199 @@
+<template>
+  <div class="app-container">
+    <!-- 查询和其他操作 -->
+    <div class="filter-container">
+      <el-input
+        v-model="listQuery.composeName" clearable size="mini" class="filter-item"
+        style="width: 200px;"
+        placeholder="请输入活动名称"
+      />
+      <el-select
+        v-model="listQuery.state" clearable size="mini" class="filter-item"
+        style="width: 200px;margin-left:10px;" placeholder="请选择活动状态"
+      >
+        <el-option label="报名未开始" :value="0" />
+        <el-option label="报名进行中" :value="1" />
+        <el-option label="活动待开始" :value="2" />
+        <el-option label="活动进行中" :value="3" />
+        <el-option label="活动已结束" :value="4" />
+      </el-select>
+      <el-button
+        size="mini" class="filter-item" type="primary" icon="el-icon-search"
+        style="margin-left:10px;"
+        @click="handleSearch"
+      >
+        查找
+      </el-button>
+      <el-button size="mini" type="info" class="filter-item" @click="handleReset">
+        重置
+      </el-button>
+      <br />
+      <el-button
+        size="mini" type="primary" icon="el-icon-plus"
+        @click="$refs.EditModal && $refs.EditModal.handleOpen({ composeId: '' })"
+      >
+        新建活动
+      </el-button>
+    </div>
+
+    <!-- 查询结果 -->
+    <div v-tableHeight>
+      <el-table
+        v-loading="listLoading" height="100%" element-loading-text="正在查询中。。。" :data="list"
+        v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+      >
+        <el-table-column prop="composeName" label="活动名称" width="220" />
+        <el-table-column prop="content" label="活动内容" align="center" />
+        <el-table-column prop="shops" label="参与商家数" align="center" />
+        <el-table-column prop="products" label="商品数量" align="center" />
+        <el-table-column label="报名时间" align="center" prop="signTime">
+        </el-table-column>
+        <el-table-column label="活动起止时间" align="center" prop="time">
+        </el-table-column>
+        <el-table-column label="活动状态" align="center">
+          <template slot-scope="scope">
+            <span v-if="scope.row.state == 0">报名未开始</span>
+            <span v-if="scope.row.state == 1">报名进行中</span>
+            <span v-if="scope.row.state == 2">活动待开始</span>
+            <span v-if="scope.row.state == 3">活动进行中</span>
+            <span v-if="scope.row.state == 4">活动已结束</span>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column prop="createTime" label="创建时间" width="220" /> -->
+        <el-table-column align="center" label="操作" width="280" fixed="right" class-name="small-padding fixed-width">
+          <template slot-scope="{ row }">
+            <el-button type="warning" size="mini" @click="handleDetail(row)">
+              详情
+            </el-button>
+            <el-button v-if="row.state != 4" size="mini" @click="handleEdit(row)">
+              编辑
+            </el-button>
+            <el-button v-if="row.state != 4" type="danger" size="mini" @click="handleStop(row)">
+              结束
+            </el-button>
+            <el-button v-if="row.state == 4" type="danger" size="mini" @click="handleDelete(row)">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div>
+      <el-pagination
+        :current-page="listQuery.page" :page-sizes="[10, 20, 50, 100]" :page-size="listQuery.pageSize"
+        layout="total, sizes, prev, pager, next, jumper" :total="total"
+        @size-change="(val) => ((listQuery.pageSize = val) && getList())"
+        @current-change="(val) => ((listQuery.page = val) && getList())"
+      />
+    </div>
+
+    <!-- 新增编辑 -->
+    <EditModal ref="EditModal" @success="getList" />
+    <!-- 查看详情 -->
+    <DetailModal ref="DetailModal" />
+  </div>
+</template>
+
+<script>
+import EditModal from './components/EditModal'
+import DetailModal from './components/DetailModal'
+import { getPlatformComposePage, deletePlatformComposeActivity, updatePlatformComposeStop } from '@/api/active/combinationActivities'
+
+export default {
+  name: 'CombinationActivities',
+  components: {
+    EditModal,
+    DetailModal
+  },
+  data() {
+    return {
+      list: [],
+      total: 0,
+      listLoading: true,
+      listQuery: {
+        composeName: '',
+        state: '',
+        page: 1,
+        pageSize: 10
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      this.listLoading = true
+      try {
+        const res = await getPlatformComposePage(this.listQuery)
+        this.list = res.data.list
+        this.total = res.data.total
+      } finally {
+        this.listLoading = false
+      }
+    },
+    handleSearch() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+    handleReset() {
+      this.listQuery = { page: 1, pageSize: 10, composeName: '', state: '' }
+      this.getList()
+    },
+    handleDetail(row) {
+      this.$refs.DetailModal && this.$refs.DetailModal.handleOpen(row)
+    },
+    handleEdit(row) {
+      this.$refs.EditModal && this.$refs.EditModal.handleOpen(row)
+    },
+    handleStop(row) {
+      this.$confirm('确定停止此项?')
+        .then(async () => {
+          await updatePlatformComposeStop({ composeId: row.composeId })
+          this.$message({ message: '停止成功!', type: 'success' })
+          this.handleSearch()
+        })
+        .catch(() => {})
+    },
+    handleDelete(row) {
+      this.$confirm('确定删除此项?')
+        .then(async () => {
+          await deletePlatformComposeActivity({ id: row.composeId })
+          this.$message({ message: '删除成功!', type: 'success' })
+          this.handleSearch()
+        })
+        .catch(() => {})
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container {
+	padding: 20px;
+	display: flex;
+	flex-direction: column;
+
+	.filter-container {
+		.filter-item {
+			display: inline-block;
+			vertical-align: middle;
+			margin-bottom: 10px;
+		}
+	}
+
+	.small-padding {
+		.cell {
+			padding-left: 5px;
+			padding-right: 5px;
+		}
+	}
+
+	.fixed-width {
+		.el-button--mini {
+			padding: 7px 10px;
+		}
+	}
+}
+</style>

+ 151 - 0
src/views/active/combinationActivityConfiguration/components/DetailModal.vue

@@ -0,0 +1,151 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    v-bind="modalOptions"
+    append-to-body
+  >
+    <el-form
+      ref="formData"
+      :model="formData"
+      size="mini"
+      label-position="left"
+      label-suffix=":"
+      label-width="200px"
+    >
+      <!-- 组合活动配置信息 -->
+      <el-form-item label="平台组合活动配置ID" prop="configId">
+        {{ formData.configId || '--' }}
+      </el-form-item>
+      <el-form-item label="关联平台组合活动ID" prop="composeId">
+        <div style="display: flex;align-items: center;">
+          <span>{{ formData.composeId || '--' }}</span>
+          <el-button
+            v-if="formData.composeId"
+            style="margin-left: 14px;" type="warning" size="mini"
+            @click="$refs.DetailModal2 && $refs.DetailModal2.handleOpen({ composeId: formData.composeId })"
+          >
+            详情
+          </el-button>
+        </div>
+      </el-form-item>
+      <el-form-item label="活动配置类型" prop="configType">
+        <span v-if="formData.configType === 1">升级角色</span>
+        <span v-else-if="formData.configType === 2">分佣</span>
+        <span v-else-if="formData.configType === 3">社区服务</span>
+        <span v-else-if="formData.configType === 4">代金券</span>
+        <span v-else-if="formData.configType === 5">消费金</span>
+        <span v-else>--</span>
+      </el-form-item>
+      <el-form-item label="是否参与" prop="joinRole">
+        <span v-if="formData.joinRole === 1">是</span>
+        <span v-else-if="formData.joinRole === 2">否</span>
+        <span v-else>--</span>
+      </el-form-item>
+      <el-form-item label="规则" prop="joinRule">
+        <span v-if="formData.joinRule === 1">金额</span>
+        <span v-else-if="formData.joinRule === 2">比例</span>
+        <span v-else>--</span>
+      </el-form-item>
+      <el-form-item label="升级类型" prop="roleType">
+        <span v-if="formData.roleType === 1">团长</span>
+        <span v-else-if="formData.roleType === 2">合伙人</span>
+        <span v-else>--</span>
+      </el-form-item>
+      <el-form-item label="参与金额" prop="joinMoney">
+        ¥{{ typeof formData.joinMoney === 'number' ? formData.joinMoney : '--' }}
+      </el-form-item>
+      <el-form-item label="关联佣金配置ID" prop="ruleId">
+        <div style="display: flex;align-items: center;">
+          <span>{{ formData.ruleId || '--' }}</span>
+          <el-button
+            v-if="formData.ruleId"
+            style="margin-left: 14px;" type="warning" size="mini"
+            @click="$refs.DetailModal1 && $refs.DetailModal1.handleOpen({ ruleId: formData.ruleId })"
+          >
+            详情
+          </el-button>
+        </div>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        {{ formData.createTime || '--' }}
+      </el-form-item>
+      <el-form-item label="更新时间" prop="updateTime">
+        {{ formData.updateTime || '--' }}
+      </el-form-item>
+    </el-form>
+
+    <!-- 佣金配置详情 -->
+    <DetailModal1 ref="DetailModal1" />
+    <!-- 组合活动详情 -->
+    <DetailModal2 ref="DetailModal2" />
+  </el-dialog>
+</template>
+
+<script>
+import { getPlatformComposeConfigById } from '@/api/active/combinationActivities'
+import DetailModal1 from '../../../commissionAllocation/gradeCommission/components/DetailModal'
+import DetailModal2 from '../../combinationActivities/components/DetailModal'
+
+export default {
+  name: 'DetailModal',
+  components: {
+    DetailModal1,
+    DetailModal2
+  },
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '900px',
+        title: '查看组合活动配置详情'
+      },
+      visible: false,
+      formData: {
+        configId: '',
+        composeId: '',
+        configType: '',
+        joinRole: '',
+        joinRule: '',
+        roleType: '',
+        joinMoney: '',
+        ruleId: '',
+        createTime: '',
+        updateTime: ''
+      }
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    handleOpen(params = {}) {
+      this.formData = Object.assign(this.$options.data().formData, params)
+      if (params.configId) {
+        this.getInfo(params.configId)
+      }
+      this.visible = true
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await getPlatformComposeConfigById({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          configId: res.data.configId || '',
+          composeId: res.data.composeId || '',
+          configType: res.data.configType || '',
+          joinRole: res.data.joinRole || '',
+          joinRule: res.data.joinRule || '',
+          roleType: res.data.roleType || '',
+          joinMoney: res.data.joinMoney || '',
+          ruleId: res.data.ruleId || '',
+          createTime: res.data.createTime || '',
+          updateTime: res.data.updateTime || ''
+        })
+      } finally {
+        loading.close()
+      }
+    }
+  }
+}
+</script>
+

+ 194 - 0
src/views/active/combinationActivityConfiguration/components/EditModal.vue

@@ -0,0 +1,194 @@
+<template>
+  <el-dialog
+    :visible.sync="visible"
+    v-bind="modalOptions"
+  >
+    <el-form
+      ref="formData"
+      :model="formData"
+      :rules="formRules"
+      size="mini"
+      label-suffix=":"
+      label-width="150px"
+    >
+      <el-form-item label="关联平台组合活动" prop="composeId">
+        <el-select
+          v-model="formData.composeId" size="mini" placeholder="请选择关联平台组合活动" filterable
+        >
+          <el-option
+            v-for="(item, index) in activityList" :key="item.composeId"
+            :label="`${item.composeName}(${item.composeId})`" :value="item.composeId"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="活动配置类型" prop="configType">
+        <el-select v-model="formData.configType" size="mini" placeholder="请选择活动类型">
+          <el-option label="升级角色" :value="1" />
+          <el-option label="分佣" :value="2" />
+          <el-option label="社区服务" :value="3" />
+          <el-option label="代金券" :value="4" />
+          <el-option label="消费金" :value="5" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否参与" prop="joinRole">
+        <el-select v-model="formData.joinRole" size="mini" placeholder="请选择是否参与">
+          <el-option label="是" :value="1" />
+          <el-option label="否" :value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="规则" prop="joinRule">
+        <el-select v-model="formData.joinRule" size="mini" placeholder="请选择规则">
+          <el-option label="金额" :value="1" />
+          <el-option label="比例" :value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="升级类型" prop="roleType">
+        <el-select v-model="formData.roleType" size="mini" placeholder="请选择升级类型">
+          <el-option label="团长" :value="1" />
+          <el-option label="合伙人" :value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="参与值" prop="joinMoney">
+        <el-input v-model="formData.joinMoney" placeholder="请输入参与值" style="width: 250px;">
+          <template #append>
+            <div v-if="formData.joinRule === 1">元</div>
+            <div v-else-if="formData.joinRule === 2">%</div>
+          </template>
+        </el-input>
+      </el-form-item>
+      <el-form-item label="关联佣金配置" prop="ruleId">
+        <el-select
+          v-model="formData.ruleId" size="mini" placeholder="请选择关联佣金配置" filterable
+        >
+          <el-option
+            v-for="(item, index) in ruleList" :key="item.ruleId"
+            :label="`${item.activityName || '--'}(${item.ruleId})`" :value="item.ruleId"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button type="primary" size="mini" @click="handleSubmit">确 定</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { savePlatformComposeConfig, updatePlatformComposeConfig, getPlatformComposeConfigById, getPlatformComposePage } from '@/api/active/combinationActivities'
+import { getAllPlatformBeeRule } from '@/api/commissionAllocation/gradeCommission'
+
+export default {
+  name: 'EditModal',
+  components: {
+  },
+  data() {
+    return {
+      modalOptions: {
+        closeOnClickModal: false,
+        width: '820px',
+        title: ''
+      },
+      visible: false,
+      formData: {
+        configId: '',
+        composeId: '',
+        configType: '',
+        joinRole: '',
+        joinRule: '',
+        roleType: '',
+        joinMoney: '',
+        ruleId: ''
+      },
+      formRules: {
+        composeId: [
+          { required: true, message: '请选择平台组合活动' }
+        ],
+        configType: [
+          { required: true, message: '请选择活动配置类型' }
+        ],
+        joinMoney: [
+          { required: false, message: '请输入参与值' },
+          { pattern: /^0\.\d{0,2}$|^[1-9]\d*\.\d{0,2}$|^[1-9]\d*$/, message: '数值有误' }
+        ]
+      },
+      activityList: [],
+      ruleList: []
+    }
+  },
+  methods: {
+    handleClose() {
+      this.visible = false
+    },
+    async initList() {
+      const res1 = await getPlatformComposePage({ page: 1, pageSize: 9999 })
+      this.activityList = res1.data.list
+      const res2 = await getAllPlatformBeeRule({ page: 1, pageSize: 9999 })
+      this.ruleList = res2.data.list
+    },
+    handleOpen(params = {}) {
+      this.modalOptions.title = params.configId ? '编辑组合活动配置' : '添加组合活动配置'
+      this.formData = Object.assign(this.$options.data().formData, params, {
+        joinMoney: (params.joinRule === 2) && (typeof params.joinMoney === 'number') ? params.joinMoney * 100 : params.joinMoney
+      })
+      this.visible = true
+      this.initList()
+      if (params.configId) {
+        this.getInfo(params.configId)
+      } else {
+        this.$refs.formData && this.$refs.formData.resetFields()
+      }
+    },
+    async getInfo(id) {
+      const loading = this.$loading({ text: '加载中' })
+      try {
+        const res = await getPlatformComposeConfigById({ id })
+        this.formData = Object.assign(this.$options.data().formData, res.data, {
+          configId: res.data.configId || '',
+          composeId: res.data.composeId || '',
+          configType: res.data.configType || '',
+          joinRole: res.data.joinRole || '',
+          joinRule: res.data.joinRule || '',
+          roleType: res.data.roleType || '',
+          joinMoney: (res.data.joinRule === 2) && (typeof res.data.joinMoney === 'number') ? res.data.joinMoney * 100 : res.data.joinMoney,
+          ruleId: res.data.ruleId || ''
+        })
+        this.$nextTick(() => {
+          this.$refs.formData && this.$refs.formData.validate()
+        })
+      } finally {
+        loading.close()
+      }
+    },
+    handleSubmit() {
+      this.$refs.formData.validate(async (valid) => {
+        if (valid) {
+          const loading = this.$loading({ text: '加载中' })
+          try {
+            const { joinRule, joinMoney, ...otps } = this.formData
+            const params = {
+              joinMoney: joinRule === 2 ? joinMoney / 100 : joinMoney,
+              ...otps
+            }
+            this.formData.configId ? await updatePlatformComposeConfig(params) : await savePlatformComposeConfig(params)
+            loading.close()
+            this.$message({ message: `${this.formData.configId ? '编辑' : '添加'}成功!`, type: 'success' })
+            this.$emit('success')
+            this.visible = false
+          } catch (e) {
+            loading.close()
+          } finally {
+            loading.close()
+          }
+        } else {
+          this.$message({ message: '请输入相关信息', type: 'warning' })
+          return false
+        }
+      })
+    }
+  }
+}
+</script>
+

+ 234 - 0
src/views/active/combinationActivityConfiguration/index.vue

@@ -0,0 +1,234 @@
+<template>
+  <div class="app-container">
+    <!-- 查询和其他操作 -->
+    <div class="filter-container">
+      <el-select
+        v-model="listQuery.configType" clearable size="mini" class="filter-item"
+        style="width: 200px;" placeholder="请选择活动配置类型"
+      >
+        <el-option label="升级角色" :value="1" />
+        <el-option label="分佣" :value="2" />
+        <el-option label="社区服务" :value="3" />
+        <el-option label="代金券" :value="4" />
+        <el-option label="消费金" :value="5" />
+      </el-select>
+      <el-button
+        size="mini" class="filter-item" type="primary" icon="el-icon-search"
+        style="margin-left:10px;"
+        @click="handleSearch"
+      >
+        查找
+      </el-button>
+      <br />
+      <el-button
+        size="mini" type="primary" icon="el-icon-plus"
+        @click="$refs.EditModal && $refs.EditModal.handleOpen({ configId: '' })"
+      >
+        添加
+      </el-button>
+    </div>
+
+    <!-- 查询结果 -->
+    <div v-tableHeight>
+      <el-table
+        v-loading="listLoading" height="100%" element-loading-text="正在查询中。。。" :data="list"
+        v-bind="{ stripe: true, size: 'small', border: true, fit: true, highlightCurrentRow: true }"
+      >
+        <el-table-column align="center" width="100" label="ID" prop="configId" fixed="left" />
+        <el-table-column align="center" min-width="120" label="关联组合活动ID" prop="composeId">
+          <template slot-scope="{ row }">
+            <div>
+              <span>{{ row.composeId }}</span>
+              <el-button
+                v-if="row.composeId"
+                style="margin-left: 14px;" type="warning" size="mini"
+                @click="$refs.DetailModal1 && $refs.DetailModal1.handleOpen({ composeId: row.composeId })"
+              >
+                详情
+              </el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="活动配置类型" prop="configType">
+          <template slot-scope="{ row }">
+            <el-tag v-if="row.configType === 1" effect="plain">升级角色</el-tag>
+            <el-tag v-else-if="row.configType === 2" effect="plain">分佣</el-tag>
+            <el-tag v-else-if="row.configType === 3" effect="plain">社区服务</el-tag>
+            <el-tag v-else-if="row.configType === 4" effect="plain">代金券</el-tag>
+            <el-tag v-else-if="row.configType === 5" effect="plain">消费金</el-tag>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="是否参与" prop="joinRole">
+          <template slot-scope="{ row }">
+            <el-tag v-if="row.joinRole === 1" effect="plain">是</el-tag>
+            <el-tag v-else-if="row.joinRole === 2" effect="plain" type="danger">否</el-tag>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="规则" prop="joinRule">
+          <template slot-scope="{ row }">
+            <el-tag v-if="row.joinRule === 1" effect="plain">金额</el-tag>
+            <el-tag v-else-if="row.joinRule === 2" effect="plain" type="danger">比例</el-tag>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="升级类型" prop="roleType">
+          <template slot-scope="{ row }">
+            <el-tag v-if="row.roleType === 1" effect="plain">团长</el-tag>
+            <el-tag v-else-if="row.roleType === 2" effect="plain" type="danger">合伙人</el-tag>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" min-width="100" label="参与金额" prop="joinMoney">
+          <template slot-scope="{ row }">
+            <span>
+              ¥{{ typeof row.joinMoney === 'number' ? row.joinMoney : '--' }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" width="100" label="关联佣金配置ID" prop="ruleId" show-overflow-tooltip />
+        <el-table-column align="center" min-width="120" label="关联佣金配置ID" prop="ruleId">
+          <template slot-scope="{ row }">
+            <div>
+              <span>{{ row.ruleId }}</span>
+              <el-button
+                v-if="row.ruleId"
+                style="margin-left: 14px;" type="warning" size="mini"
+                @click="$refs.DetailModal1 && $refs.DetailModal1.handleOpen({ ruleId: row.ruleId })"
+              >
+                详情
+              </el-button>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" width="150" label="创建时间" prop="createTime" />
+        <el-table-column align="center" width="150" label="更新时间" prop="updateTime" />
+        <el-table-column align="center" label="操作" width="200" fixed="right" class-name="small-padding fixed-width">
+          <template slot-scope="{ row }">
+            <el-button type="warning" size="mini" @click="handleDetail(row)">
+              详情
+            </el-button>
+            <el-button size="mini" @click="handleEdit(row)">
+              编辑
+            </el-button>
+            <el-button type="danger" size="mini" @click="handleDelete(row)">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+
+    <div>
+      <el-pagination
+        :current-page="listQuery.page" :page-sizes="[10, 20, 50, 100]" :page-size="listQuery.pageSize"
+        layout="total, sizes, prev, pager, next, jumper" :total="total"
+        @size-change="(val) => ((listQuery.pageSize = val) && getList())"
+        @current-change="(val) => ((listQuery.page = val) && getList())"
+      />
+    </div>
+
+    <!-- 新增编辑 -->
+    <EditModal ref="EditModal" @success="getList" />
+    <!-- 查看详情 -->
+    <DetailModal ref="DetailModal" />
+    <!-- 佣金配置详情 -->
+    <DetailModal1 ref="DetailModal1" />
+    <!-- 组合活动详情 -->
+    <DetailModal2 ref="DetailModal2" />
+  </div>
+</template>
+
+<script>
+import EditModal from './components/EditModal'
+import DetailModal from './components/DetailModal'
+import DetailModal1 from '../../commissionAllocation/gradeCommission/components/DetailModal'
+import DetailModal2 from '../combinationActivities/components/DetailModal'
+import { getPlatformComposeConfigPage, deletePlatformComposeConfig } from '@/api/active/combinationActivities'
+
+export default {
+  name: 'CombinationActivityConfiguration',
+  components: {
+    EditModal,
+    DetailModal,
+    DetailModal1,
+    DetailModal2
+  },
+  data() {
+    return {
+      list: [],
+      total: 0,
+      listLoading: true,
+      listQuery: {
+        page: 1,
+        pageSize: 20,
+        configType: ''
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      this.listLoading = true
+      try {
+        const res = await getPlatformComposeConfigPage(this.listQuery)
+        this.list = res.data.list
+        this.total = res.data.total
+      } finally {
+        this.listLoading = false
+      }
+    },
+    handleSearch() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+    handleDetail(row) {
+      this.$refs.DetailModal && this.$refs.DetailModal.handleOpen(row)
+    },
+    handleEdit(row) {
+      this.$refs.EditModal && this.$refs.EditModal.handleOpen(row)
+    },
+    handleDelete(row) {
+      this.$confirm('确定删除此项?')
+        .then(async () => {
+          await deletePlatformComposeConfig({ id: row.configId })
+          this.$message({ message: '删除成功!', type: 'success' })
+          this.handleSearch()
+        })
+        .catch(() => {})
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.app-container {
+	padding: 20px;
+	display: flex;
+	flex-direction: column;
+
+	.filter-container {
+		.filter-item {
+			display: inline-block;
+			vertical-align: middle;
+			margin-bottom: 10px;
+		}
+	}
+
+	.small-padding {
+		.cell {
+			padding-left: 5px;
+			padding-right: 5px;
+		}
+	}
+
+	.fixed-width {
+		.el-button--mini {
+			padding: 7px 10px;
+		}
+	}
+}
+</style>

+ 1 - 1
src/views/business/paymentCode/index.vue

@@ -45,7 +45,7 @@
             </el-table>
         </div>
         <div class="fenye">
-            <el-pagination :current-page="payQuery.page" :page-sizes="[5, 10, 15, 20]" :page-size="10"
+            <el-pagination :current-page="payQuery.page" :page-sizes="[5, 10, 15, 20]" :page-size="5"
                 layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handleSizeChange"
                 @current-change="handleCurrentChange" />
         </div>

+ 1 - 0
src/views/commissionAllocation/gradeCommission/components/DetailModal.vue

@@ -2,6 +2,7 @@
   <el-dialog
     :visible.sync="visible"
     v-bind="modalOptions"
+    append-to-body
   >
     <el-form
       ref="formData"

+ 2 - 2
src/views/commissionAllocation/gradeCommission/components/EditModal.vue

@@ -52,7 +52,7 @@
         <el-input v-model="formData.partnerMoney" placeholder="请输入直接合伙人规则" style="width: 150px;">
           <template #append>
             <div v-if="formData.partnerRule === 1">%</div>
-            <div v-else-if="formData.leadersRule === 2">元</div>
+            <div v-else-if="formData.partnerRule === 2">元</div>
           </template>
         </el-input>
       </el-form-item>
@@ -60,7 +60,7 @@
         <el-input v-model="formData.partnerInMoney" placeholder="请输入间接合伙人规则" style="width: 150px;">
           <template #append>
             <div v-if="formData.partnerRule === 1">%</div>
-            <div v-else-if="formData.leadersRule === 2">元</div>
+            <div v-else-if="formData.partnerRule === 2">元</div>
           </template>
         </el-input>
       </el-form-item>

+ 2 - 2
src/views/commissionAllocation/gradeCommission/index.vue

@@ -4,7 +4,7 @@
     <div class="filter-container">
       <el-select
         v-model="listQuery.activityType" clearable size="mini" class="filter-item"
-        style="width: 200px;margin-left: 10px;" placeholder="请选择活动类型"
+        style="width: 200px;" placeholder="请选择活动类型"
       >
         <el-option label="499" :value="1" />
         <el-option label="商圈" :value="2" />
@@ -100,7 +100,7 @@
     <!-- 新增编辑 -->
     <EditModal ref="EditModal" @success="getList" />
     <!-- 查看详情 -->
-    <DetailModal ref="DetailModal" @success="getList" />
+    <DetailModal ref="DetailModal" />
   </div>
 </template>
 

+ 1 - 1
src/views/finance/withdrawal/components/RelatedCommissionLogs.vue

@@ -26,7 +26,7 @@
           <template slot-scope="{ row }">
           <el-image
           v-if="row.imgOne" lazy :src="common.seamingImgUrl(row.imgOne)"
-          style="width:40px; height:40px" fit="cover"
+          style="width:40px;height:40px;" fit="cover"
           :preview-src-list="[ common.seamingImgUrl(row.imgOne) ]"
           />
           <span v-else>--</span>

+ 1 - 1
src/views/finance/withdrawal/components/UserDetails.vue

@@ -19,7 +19,7 @@
       <el-form-item label="头像" prop="headImage">
         <el-image
           v-if="formData.headImage" lazy :src="common.seamingImgUrl(formData.headImage)"
-          style="width:40px; height:40px" fit="cover"
+          style="width:40px;height:40px;" fit="cover"
           :preview-src-list="[ common.seamingImgUrl(formData.headImage) ]"
         />
         <span v-else>--</span>

+ 1 - 1
src/views/relationshipChainManagement/relationshipLevel/index.vue

@@ -17,7 +17,7 @@
         <el-table-column align="center" label="等级图标" prop="levelLogo">
           <template slot-scope="scope">
             <el-image
-              v-if="scope.row.levelLogo" :src="scope.row.levelLogo" style="width:40px; height:40px" fit="cover"
+              v-if="scope.row.levelLogo" :src="scope.row.levelLogo" style="width:40px;height:40px;" fit="cover"
               :preview-src-list="[ scope.row.levelLogo ]"
             />
             <span v-else>--</span>

+ 7 - 6
src/views/setup/timedTasksList/components/EditModal.vue

@@ -39,10 +39,12 @@
         <el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" maxlength="520" :rows="3" show-word-limit />
       </el-form-item>
     </el-form>
-    <span slot="footer" class="dialog-footer">
-      <el-button size="mini" @click="handleClose">取 消</el-button>
-      <el-button type="primary" size="mini" @click="handleSubmit">确 定</el-button>
-    </span>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button size="mini" @click="handleClose">取 消</el-button>
+        <el-button type="primary" size="mini" @click="handleSubmit">确 定</el-button>
+      </span>
+    </template>
   </el-dialog>
 </template>
 
@@ -143,8 +145,7 @@ export default {
     handleSubmit() {
       this.$refs.formData.validate(async (valid) => {
         if (valid) {
-          await this.$validatorForm('formData')
-          const loading = this.$elLoading()
+          const loading = this.$loading({ text: '加载中' })
           try {
             const { ...otps } = this.formData
             const params = {

+ 2 - 1
src/views/setup/timedTasksList/index.vue

@@ -3,7 +3,8 @@
     <!-- 查询和其他操作 -->
     <div class="filter-container">
       <el-input
-        v-model="listQuery.beanName" clearable class="filter-item" style="width: 200px;"
+        v-model="listQuery.beanName" clearable size="mini" class="filter-item"
+        style="width: 200px;"
         placeholder="请输入 spring bean 名称"
       />
       <el-button