pangqijun 8 months ago
parent
commit
bac4937530

+ 93 - 0
src/api/distribution/appoint.js

@@ -0,0 +1,93 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/distribution/appoint/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/distribution/appoint/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/distribution/appoint/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/distribution/appoint/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/distribution/appoint/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const shipments = (id) => {
+  return request({
+    url: '/api/distribution/appoint/shipments',
+    method: 'post',
+    params: {
+      id,
+    }
+  })
+}
+
+export const shipmentsAll = (grouponId) => {
+  return request({
+    url: '/api/distribution/appoint/shipmnetsALl',
+    method: 'post',
+    params: {
+      grouponId,
+    }
+  })
+}
+
+export const goodsList = (current, size, arrivalCode) => {
+  return request({
+    url: '/api/finance/appointgoods/storeAppointGoodsList',
+    method: 'get',
+    params: {
+      arrivalCode,
+      current,
+      size,
+    }
+  })
+}
+
+export const appointStoreList = (current, size, grouponId) => {
+  return request({
+    url: '/api/distribution/appoint/appointAllList',
+    method: 'get',
+    params: {
+      grouponId,
+      current,
+      size,
+    }
+  })
+}

+ 50 - 0
src/api/groupon/filecontent.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/filecontent/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/filecontent/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/filecontent/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/filecontent/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/filecontent/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 88 - 0
src/api/groupon/groupon.js

@@ -0,0 +1,88 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/groupon/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/groupon/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/groupon/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/groupon/save',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/groupon/update',
+    method: 'post',
+    data: row
+  })
+}
+
+export const modifyStatus = (row) => {
+  return request({
+    url: '/api/groupon/groupon/modify-status',
+    method: 'post',
+    data: row
+  })
+}
+
+export const audit = (param) => {
+  return request({
+    url: '/api/groupon/groupon/audit',
+    method: 'post',
+    params: {
+      ...param
+    }
+  })
+}
+
+export const perfect = (param) => {
+  return request({
+    url: '/api/groupon/groupon/perfect',
+    method: 'post',
+    data: param
+  })
+}
+
+
+export const appointmentAll = (current, size, params) => {
+  return request({
+    url: '/api/tz/appointment/all',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}

+ 50 - 0
src/api/groupon/groupongoods.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/groupongoods/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/groupongoods/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/groupongoods/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/groupongoods/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/groupongoods/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/groupon/grouponimage.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/grouponimage/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/grouponimage/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/grouponimage/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/grouponimage/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/grouponimage/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/groupon/grouponselftake.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/grouponselftake/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/grouponselftake/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/grouponselftake/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/grouponselftake/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/grouponselftake/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 50 - 0
src/api/groupon/grouponuser.js

@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/grouponuser/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/grouponuser/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/grouponuser/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/grouponuser/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/grouponuser/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 70 - 0
src/api/groupon/selftake.js

@@ -0,0 +1,70 @@
+import request from '@/router/axios';
+
+
+
+export const addUserSelfTake = (params) => {
+  return request({
+    url: '/api/groupon/selftake/addUserSelfTake',
+    method: 'post',
+    data: params
+  })
+}
+
+export const listByUserId = (userId) => {
+  return request({
+    url: '/api/groupon/selftake/listByUserId?userId='+userId,
+    method: 'post',
+    params: {}
+  })
+}
+
+
+
+export const getList = (current, size, params) => {
+  return request({
+    url: '/api/groupon/selftake/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
+export const getDetail = (id) => {
+  return request({
+    url: '/api/groupon/selftake/detail',
+    method: 'get',
+    params: {
+      id
+    }
+  })
+}
+
+export const remove = (ids) => {
+  return request({
+    url: '/api/groupon/selftake/remove',
+    method: 'post',
+    params: {
+      ids,
+    }
+  })
+}
+
+export const add = (row) => {
+  return request({
+    url: '/api/groupon/selftake/submit',
+    method: 'post',
+    data: row
+  })
+}
+
+export const update = (row) => {
+  return request({
+    url: '/api/groupon/selftake/submit',
+    method: 'post',
+    data: row
+  })
+}
+

+ 313 - 0
src/views/appointment/index.vue

@@ -0,0 +1,313 @@
+<template>
+    <basic-container>
+        <avue-crud :option="option"
+                   :table-loading="loading"
+                   :data="data"
+                   :page.sync="page"
+                   :permission="permissionList"
+                   :before-open="beforeOpen"
+                   v-model="form"
+                   ref="crud"
+                   @row-update="rowUpdate"
+                   @row-save="rowSave"
+                   @row-del="rowDel"
+                   @search-change="searchChange"
+                   @search-reset="searchReset"
+                   @selection-change="selectionChange"
+                   @current-change="currentChange"
+                   @size-change="sizeChange"
+                   @refresh-change="refreshChange"
+                   @on-load="onLoad">
+            <template slot="menuLeft">
+            </template>
+
+            <template slot="menu" slot-scope="scope">
+<!--                <el-button type="text" size="small" @click="viewOrder(scope.row, 1)" >详情</el-button>-->
+                <el-button type="text" size="small" @click="downloadAppointment(scope.row)" >下载履约单</el-button>
+            </template>
+
+
+          <template slot="state" slot-scope="scope">
+            <el-tag v-if="scope.row.state === 0">{{ scope.row.$state }}</el-tag>
+            <el-tag v-else-if="scope.row.state === 1" type="warning">{{ scope.row.$state }}</el-tag>
+            <el-tag v-else-if="scope.row.state === 2" type="success">{{ scope.row.$state }}</el-tag>
+          </template>
+        </avue-crud>
+
+    </basic-container>
+</template>
+
+<script>
+import {appointmentAll as getList, exportAppointment} from "@/api/groupon/groupon";
+import {mapGetters} from "vuex";
+import {getToken} from '@/util/auth';
+
+export default {
+    data() {
+        return {
+            orderDetailBox: false,
+            state: 0,
+            form: {},
+            query: {},
+            loading: true,
+            page: {
+                pageSize: 10,
+                currentPage: 1,
+                total: 0
+            },
+            selectionList: [],
+            option: {
+              height:'auto',
+                searchShow: true,
+                searchMenuSpan: 6,
+                searchIcon: true,
+                searchIndex: 3,
+                searchLabelWidth: 90,
+                menuWidth: 170,
+                border: true,
+                viewBtn: true,
+                editBtn: false,
+                delBtn: false,
+                selection: false,
+                dialogClickModal: false,
+                column: [
+                    {
+                        label: "团购名称",
+                        prop: "mainTitle",
+                    },
+                    {
+                        label: "团购开始时间",
+                        prop: "grouponStartTime",
+                    },
+                    {
+                        label: "履约单状态",
+                        prop: "state",
+                        search: true,
+                        addDisplay: false,
+                        viewDisplay: false,
+                        type: "select",
+                        slot: true,
+                        dicData: [{
+                            label: '待发货',
+                            value: 0
+                        }, {
+                            label: '待提货',
+                            value: 1
+                        }, {
+                          label: '已完成',
+                          value: 2
+                        }],
+                        dataType: "number"
+                    },
+                ]
+            },
+          detailOption: {
+            height:'auto',
+            calcHeight: 30,
+            tip: false,
+            searchShow: true,
+            searchMenuSpan: 6,
+            searchIcon: true,
+            searchIndex: 3,
+            searchLabelWidth: 90,
+            menuWidth: 170,
+            refreshBtn: false,
+            columnBtn: false,
+            border: true,
+            viewBtn: true,
+            editBtn: false,
+            delBtn: false,
+            addBtn: false,
+            selection: false,
+            menu: false,
+            dialogClickModal: false,
+            column: [
+              {
+                label: "顾客昵称",
+                prop: "nickname",
+              },
+              {
+                label: "顾客手机号",
+                prop: "phone",
+              },
+              {
+                label: "取货码",
+                prop: "pickUpCode",
+              },
+              {
+                label: "商品名称",
+                prop: "goodsName",
+              },
+              {
+                label: "商品规格",
+                prop: "goodsSpec",
+              },
+              {
+                label: "商品编码",
+                prop: "goodsNo",
+              },
+              {
+                label: "商品数量",
+                prop: "goodsNum",
+              },
+            ]
+          },
+            data: []
+        };
+    },
+    computed: {
+        ...mapGetters(["permission"]),
+        permissionList() {
+            return {
+                addBtn: this.vaildData(this.permission.order_add, false),
+                viewBtn: this.vaildData(this.permission.order_view, false),
+                delBtn: this.vaildData(this.permission.order_delete, false),
+                editBtn: this.vaildData(this.permission.order_edit, false)
+            };
+        },
+        ids() {
+            let ids = [];
+            this.selectionList.forEach(ele => {
+                ids.push(ele.id);
+            });
+            return ids.join(",");
+        }
+    },
+    created() {
+        this.option.column[5].change = function (value) {
+            this.state = value.value;
+        }.bind(this);
+    },
+    methods: {
+        rowSave(row, done, loading) {
+            add(row).then(() => {
+                this.onLoad(this.page);
+                this.$message({
+                    type: "success",
+                    message: "操作成功!"
+                });
+                done();
+            }, error => {
+                loading();
+                window.console.log(error);
+            });
+        },
+        rowUpdate(row, index, done, loading) {
+            update(row).then(() => {
+                this.onLoad(this.page);
+                this.$message({
+                    type: "success",
+                    message: "操作成功!"
+                });
+                done();
+            }, error => {
+                loading();
+                console.log(error);
+            });
+        },
+        rowDel(row) {
+            this.$confirm("确定将选择数据删除?", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            })
+                .then(() => {
+                    return remove(row.id);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: "success",
+                        message: "操作成功!"
+                    });
+                });
+        },
+        handleDelete() {
+            if (this.selectionList.length === 0) {
+                this.$message.warning("请选择至少一条数据");
+                return;
+            }
+            this.$confirm("确定将选择数据删除?", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            })
+                .then(() => {
+                    return remove(this.ids);
+                })
+                .then(() => {
+                    this.onLoad(this.page);
+                    this.$message({
+                        type: "success",
+                        message: "操作成功!"
+                    });
+                    this.$refs.crud.toggleSelection();
+                });
+        },
+        beforeOpen(done, type) {
+            if (["edit", "view"].includes(type)) {
+                getDetail(this.form.id).then(res => {
+                    this.form = res.data.data;
+                });
+            }
+            done();
+        },
+        searchReset() {
+            this.query = {};
+            this.onLoad(this.page);
+        },
+        searchChange(params, done) {
+            this.query = params;
+            this.page.currentPage = 1;
+            this.onLoad(this.page, params);
+            done();
+        },
+        selectionChange(list) {
+            this.selectionList = list;
+        },
+        selectionClear() {
+            this.selectionList = [];
+            this.$refs.crud.toggleSelection();
+        },
+        currentChange(currentPage){
+            this.page.currentPage = currentPage;
+        },
+        sizeChange(pageSize){
+            this.page.pageSize = pageSize;
+        },
+        refreshChange() {
+            this.onLoad(this.page, this.query);
+        },
+        onLoad(page, params = {}) {
+            this.loading = true;
+            getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+                const data = res.data.data;
+                this.page.total = data.total;
+                this.data = data.records;
+                this.loading = false;
+                this.selectionClear();
+            });
+        },
+        viewOrder(row, queryType) {
+            this.orderDetailBox = true;
+            getDetail({
+                grouponId: row.id,
+                queryType: queryType,
+                state: this.state
+            }).then(res => {
+
+            })
+        },
+        handleClose() {
+            this.orderDetailBox = false;
+        },
+        downloadAppointment(row) {
+            window.location.href=`/api/tz/appointment/all/export?${this.website.tokenHeader}=${getToken()}&grouponId=${row.grouponId}
+            &grouponName=${row.mainTitle}&stateDesc=${row.$state}&grouponStartTime=${row.grouponStartTime}`
+        }
+    }
+};
+</script>
+
+<style>
+</style>

+ 332 - 0
src/views/distribution/appoint.vue

@@ -0,0 +1,332 @@
+
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <!--        <el-button type="primary"-->
+        <!--                   size="small"-->
+        <!--                   plain-->
+        <!--                   @click="handleDelete">确认发货-->
+        <!--        </el-button>-->
+      </template>
+      <template slot-scope="scope" slot="menu">
+        <el-button type="text"
+                   size="small"
+                   @click="goodsListView(scope.row.grouponId)">查看详情</el-button>
+      </template>
+    </avue-crud>
+    <!--  商品列表dialog  -->
+    <el-dialog title="详情列表"
+               append-to-body
+               :visible.sync="goodsBox"
+               :before-close="handleClose"
+               width="50%"
+               heigh="30%">
+      <avue-crud :option="appointGoodsOption"
+                 :table-loading="goodsLoading"
+                 :data="appointGoodsData"
+                 :page.sync="goodsPage"
+                 ref="grouponCrud"
+                 @size-change="sizeAppointChange"
+                 @on-load="goodsOnLoad">
+        <template slot="menuLeft">
+          <el-button type="primary"
+                     size="small"
+                     plain
+                     @click="downLoadAppoint">下载详情
+          </el-button>
+        </template>
+        <template slot-scope="scope" slot="menu">
+
+        </template>
+      </avue-crud>
+    </el-dialog>
+  </basic-container>
+
+</template>
+
+<script>
+import {getList, getDetail, add, update, shipments, shipmentsAll, appointStoreList} from "@/api/distribution/appoint";
+import {mapGetters} from "vuex";
+import {appointGoodsOption} from "../../option/mall/appointGoodsOption"
+import {getToken} from '@/util/auth';
+
+export default {
+  data() {
+    return {
+      form: {},
+      query: {},
+      loading: true,
+      goodsBox: false,
+      goodsLoading: false,
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      grouponId: 0,
+      appointGoodsData: [],
+      goodsPage: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      selectionList: [],
+      appointGoodsOption,
+      option: {
+        height:'auto',
+        calcHeight: 30,
+        addBtn: false,
+        tip: false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        border: true,
+        index: true,
+        editBtn: false,
+        viewBtn: false,
+        delBtn: false,
+        selection: false,
+        searchSpan: 5,
+        dialogClickModal: false,
+        column: [
+          {
+            label: "团购标题",
+            labelWidth: 130,
+            prop: "grouponName",
+            rules: [{
+              required: true,
+              message: "请输入团购标题",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "团购开始时间",
+            labelWidth: 130,
+            prop: "grouponStartTime",
+
+          },
+          {
+            label: "履约单状态",
+            labelWidth: 130,
+            prop: "appointState",
+            searchLabelWidth: 130,
+            type: "select",
+            dicUrl: "/api/blade-system/dict-biz/dictionary?code=appoint_state",
+            props: {
+              label: "dictValue",
+              value: "dictKey"
+            },
+            dataType: "number",
+            search: true,
+            hide: false,
+            display: true,
+            rules: [{
+              required: true,
+              message: "选择状态",
+              trigger: "blur"
+            }]
+          },
+        ]
+      },
+      data: []
+    };
+  },
+  computed: {
+    ...mapGetters(["permission"]),
+    permissionList() {
+      return {
+        // addBtn: this.vaildData(this.permission.appoint_add, false),
+        // viewBtn: this.vaildData(this.permission.appoint_view, false),
+        // delBtn: this.vaildData(this.permission.appoint_delete, false),
+        // editBtn: this.vaildData(this.permission.appoint_edit, false)
+      };
+    },
+    ids() {
+      let ids = [];
+      this.selectionList.forEach(ele => {
+        ids.push(ele.id);
+      });
+      return ids.join(",");
+    }
+  },
+  methods: {
+    rowSave(row, done, loading) {
+      add(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        window.console.log(error);
+      });
+    },
+
+    downLoadAppoint(){
+      window.open(`/api/distribution/appoint/exportAllAppointGoods?${this.website.tokenHeader}=${getToken()}&grouponId=${this.grouponId}`);
+    },
+    rowUpdate(row, index, done, loading) {
+      update(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        console.log(error);
+      });
+    },
+
+    rowDel(row) {
+      this.$confirm("确定将选择数据删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+    },
+    shipments(id){
+      this.$confirm("确定将改履约单进行发货么?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+          .then(() => {
+            return shipments(id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.goodsOnLoad(this.goodsPage)
+            this.$refs.grouponCrud.toggleSelection();
+          });
+
+    },
+    shipmnetsALl(grouponId){
+      this.$confirm("确定将这个团的所有履约单进行发货么?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+          .then(() => {
+            return shipmentsAll(grouponId);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+    },
+    beforeOpen(done, type) {
+      if (["edit", "view"].includes(type)) {
+        getDetail(this.form.id).then(res => {
+          this.form = res.data.data;
+        });
+      }
+      done();
+    },
+    searchReset() {
+      this.query = {};
+      this.onLoad(this.page);
+    },
+    searchChange(params, done) {
+      this.query = params;
+      this.page.currentPage = 1;
+      this.onLoad(this.page, params);
+      done();
+    },
+    selectionChange(list) {
+      this.selectionList = list;
+    },
+    selectionClear() {
+      this.selectionList = [];
+      this.$refs.crud.toggleSelection();
+    },
+    currentChange(currentPage){
+      this.page.currentPage = currentPage;
+    },
+    sizeChange(pageSize){
+      this.page.pageSize = pageSize;
+    },
+    sizeAppointChange(pageSize){
+      this.goodsPage.pageSize = pageSize;
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.query);
+    },
+    onLoad(page, params = {}) {
+      this.loading = true;
+      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+        const data = res.data.data;
+        this.page.total = data.total;
+        this.data = data.records;
+        this.loading = false;
+        this.selectionClear();
+      });
+    },
+
+    goodsListView(grouponId) {
+      this.grouponId = grouponId;
+      this.goodsPage = {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      }
+      this.goodsOnLoad(this.goodsPage)
+      this.goodsBox = true;
+    },
+    handleClose() {
+      this.goodsBox = false;
+    },
+    goodsOnLoad(page){
+      this.goodsLoading = true;
+      appointStoreList(page.currentPage, page.pageSize, this.grouponId).then(res => {
+        const data = res.data.data;
+        this.goodsPage.total = data.total;
+        this.appointGoodsData = data.records;
+        this.goodsLoading = false;
+        this.selectionClear();
+      });
+    }
+  }
+};
+</script>
+
+<style>
+</style>

+ 274 - 0
src/views/groupon/filecontent.vue

@@ -0,0 +1,274 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.filecontent_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/groupon/filecontent";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          addBtn: false,
+          editBtn: false,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            // {
+            //   label: "处理人ID",
+            //   prop: "replyUserId",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入处理人ID",
+            //     trigger: "blur"
+            //   }]
+            // },
+            // {
+            //   label: "类型",
+            //   prop: "type",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入类型",
+            //     trigger: "blur"
+            //   }]
+            // },
+            // {
+            //   label: "状态",
+            //   prop: "status",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入状态",
+            //     trigger: "blur"
+            //   }]
+            // },
+            // {
+            //   label: "回复内容",
+            //   prop: "replyContent",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入回复内容",
+            //     trigger: "blur"
+            //   }]
+            // },
+            {
+              label: "内容",
+              prop: "content",
+              search: true,
+              rules: [{
+                required: true,
+                message: "请输入内容",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "截图",
+              prop: "imgUrl",
+              type: 'img',
+            },
+            {
+              label: "反馈用户",
+              prop: "feedbackPerson",
+            },
+            {
+              label: "联系方式",
+              prop: "feedbackPersonPhone",
+            },
+            {
+              label: "反馈时间",
+              prop: "createTime",
+            },
+            // {
+            //   label: "",
+            //   prop: "sessionKey",
+            //   rules: [{
+            //     required: true,
+            //     message: "请输入",
+            //     trigger: "blur"
+            //   }]
+            // },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.filecontent_add, false),
+          viewBtn: this.vaildData(this.permission.filecontent_view, false),
+          delBtn: this.vaildData(this.permission.filecontent_delete, false),
+          editBtn: this.vaildData(this.permission.filecontent_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 900 - 0
src/views/groupon/groupon.vue

@@ -0,0 +1,900 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               :upload-error="uploadError"
+               :upload-after="uploadAfter"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+
+      <template slot="status" slot-scope="scope">
+        <el-tag v-if="scope.row.status === 1" type="success">{{ scope.row.$status }}</el-tag>
+        <el-tag v-if="scope.row.status === 0" type="danger">{{ scope.row.$status }}</el-tag>
+      </template>
+
+      <template slot="auditStatus" slot-scope="scope">
+        <el-tag v-if="scope.row.auditStatus === 0">{{ scope.row.$auditStatus }}</el-tag>
+        <el-tag v-else-if="scope.row.auditStatus === 1" type="success">{{ scope.row.$auditStatus }}</el-tag>
+        <el-tag v-else-if="scope.row.auditStatus === 2" type="danger">{{ scope.row.$auditStatus }}</el-tag>
+      </template>
+
+      <template slot="menu" slot-scope="scope">
+        <el-button v-if="scope.row.auditStatus == 0"
+                   type="text"
+                   size="small"
+                   @click="openAuditBox(scope.row.id)"
+        >审核
+        </el-button>
+        <el-button v-if="scope.row.status == 0"
+                   type="text"
+                   size="small"
+                   @click="modifyState(scope.row, 1)"
+        >启用
+        </el-button>
+        <el-button v-if="scope.row.status == 1"
+                   type="text"
+                   size="small"
+                   @click="modifyState(scope.row, 0)"
+        >禁用
+        </el-button>
+      </template>
+
+      <!--  添加商品插槽    -->
+      <template slot="goodsForm">
+        <el-button type="primary" size="mini" @click="addGoodsBox = true">添 加</el-button>
+        <avue-crud :option="optionTable"
+                   :data="tableData"
+                   ref="crudGoods">
+          <template #menu="{row,index,size}">
+            <el-button type="danger"
+                       size="mini"
+                       @click="rowDelGoods(row,index)">删除</el-button>
+          </template>
+          <template slot="grouponPrice" slot-scope="scope" >
+            <avue-input-number precision="2" v-model="scope.row.grouponPrice"></avue-input-number>
+          </template>
+        </avue-crud>
+      </template>
+
+      <!--  添加自提点插槽    -->
+      <template slot="selfTakeIdsForm">
+        <el-button type="primary" size="mini" @click="addSelfTakeBox = true">添 加</el-button>
+        <avue-crud :option="optionSFTable"
+                   :data="selfTakeList"
+                   ref="crudGoods">
+          <template #menu="{row,index,size}">
+            <el-button type="danger"
+                       size="mini"
+                       @click="rowDelSelfTake(row,index)">删除</el-button>
+          </template>
+        </avue-crud>
+      </template>
+
+
+    </avue-crud>
+
+    <el-dialog title="拼团审核" @close="refreshChange"
+               append-to-body
+               :visible.sync="auditBox"
+               :before-close="handleClose"
+               width="600px"
+               heigh="40%">
+      <el-form :model="auditForm" label-width="80px">
+        <el-form-item label="审核意见:">
+          <el-select v-model="auditForm.auditStatus" placeholder="请选择">
+            <el-option
+                v-for="item in auditList"
+                :key="item.value"
+                :label="item.name"
+                :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="驳回描述:" v-if="auditForm.auditStatus == 2">
+          <el-input type="textarea" v-model="auditForm.remark" :autosize="{ minRows: 3, maxRows: 5}"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">取 消</el-button>
+        <el-button type="primary" @click="auditGoods()">确 定</el-button>
+      </div>
+    </el-dialog>
+
+    <!--  商品列表dialog  -->
+    <el-dialog title="添加商品"
+               append-to-body
+               :visible.sync="addGoodsBox"
+               :before-close="handleClose"
+               width="90%"
+               heigh="70%">
+      <avue-crud :option="grouponOption"
+                 :table-loading="grouponLoading"
+                 :data="grouponData"
+                 :page.sync="grouponPage"
+                 v-model="grouponForm"
+                 ref="grouponCrud"
+                 @search-change="grouponSearchChange"
+                 @search-reset="grouponSearchReset"
+                 @selection-change="grouponSelectionChange"
+                 @current-change="grouponCurrentChange"
+                 @size-change="grouponSizeChange"
+                 @refresh-change="grouponRefreshChange"
+                 @on-load="grouponOnLoad">
+
+        <template slot="menuLeft">
+          <el-button type="primary"
+                     size="small"
+                     @click="submit()">提 交
+          </el-button>
+        </template>
+      </avue-crud>
+    </el-dialog>
+
+
+    <!--  自提点列表dialog  -->
+    <el-dialog title="添加自提点"
+               append-to-body
+               :visible.sync="addSelfTakeBox"
+               :before-close="handleClose"
+               width="90%"
+               heigh="70%">
+      <avue-crud :option="selfTakeOption"
+                 :table-loading="selfTakeLoading"
+                 :data="selfTakeData"
+                 :page.sync="selfTakePage"
+                 v-model="selfTakeForm"
+                 ref="selfTakeCrud"
+                 @search-change="selfTakeSearchChange"
+                 @search-reset="selfTakeSearchReset"
+                 @selection-change="selfTakeSelectionChange"
+                 @current-change="selfTakeCurrentChange"
+                 @size-change="selfTakeSizeChange"
+                 @refresh-change="selfTakeRefreshChange"
+                 @on-load="selfTakeOnLoad">
+        <template slot="menuLeft">
+          <el-button type="primary"
+                     size="small"
+                     @click="submitSelfTake()">提 交
+          </el-button>
+        </template>
+      </avue-crud>
+    </el-dialog>
+  </basic-container>
+</template>
+
+<script>
+import {getList, getDetail, add, update, remove, audit, modifyStatus} from "@/api/groupon/groupon";
+import {getList as getGoodsList} from "@/api/mall/goodsinfo";
+import {getList as getSelfTakeList} from "@/api/groupon/selftake";
+import {grouponOption} from "../../option/groupon/grouponOption"
+import {mapGetters} from "vuex";
+
+export default {
+  data() {
+    return {
+      grouponOption: grouponOption,
+      tableData: [],
+      selfTakeList: [],
+      auditList: [
+        {name: '通过', value: 1}, {name: '驳回', value: 2}
+      ],
+      form: {},
+      query: {},
+      loading: true,
+      page: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      auditBox: false,
+      addGoodsBox: false,
+      addSelfTakeBox: false,
+      auditForm: {
+        auditStatus: '',
+        id: '',
+        remark: ''
+      },
+      selectionList: [],
+      optionSFTable: {
+        menuWidth: 90,
+        refreshBtn: false,
+        columnBtn: false,
+        addBtn: false,
+        viewBtn: false,
+        editBtn: false,
+        delBtn: false,
+        column: [{
+          label: "名称",
+          prop: "name",
+        },
+          {
+            label: "地址",
+            prop: "address",
+          },]
+      },
+      optionTable: {
+        menuWidth: 90,
+        refreshBtn: false,
+        columnBtn: false,
+        addBtn: false,
+        viewBtn: false,
+        editBtn: false,
+        delBtn: false,
+        sortable: true,
+        column: [{
+          label: '商品图片',
+          prop: 'goodsCover',
+          type: 'img',
+          width: 70,
+        }, {
+          label: '商品名称',
+          prop: 'goodsName',
+        }, {
+          label: '规格',
+          prop: 'goodsSpec',
+        }, {
+          label: '供应商',
+          prop: 'supplierName',
+        },
+        //   {
+        //   label: '团购价',
+        //   prop: 'grouponPrice',
+        //   slot:true
+        // }
+        ]
+      },
+      option: {
+        // dialogType: 'drawer',
+        // dialogDirection: 'rtl',
+        height: 'auto',
+        calcHeight: 30,
+        tip: false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        border: true,
+        index: false,
+        viewBtn: true,
+        editBtn: true,
+        delBtn: false,
+        selection: true,
+        dialogClickModal: false,
+        addBtnText: '发布团购',
+        column: [
+          {
+            label: "主标题",
+            prop: "mainTitle",
+            labelWidth: 120,
+            search: true,
+            rules: [{
+              required: true,
+              message: "请输入主标题",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "副标题",
+            prop: "subTitle",
+            labelWidth: 120,
+            hide: true,
+            rules: [{
+              required: true,
+              message: "请输入副标题",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "团购开始时间",
+            prop: "grouponStartTime",
+            valueFormat: 'yyyy-MM-dd HH:mm:ss',
+            type: "datetime",
+            labelWidth: 120,
+            rules: [{
+              required: true,
+              message: "请输入团购开始时间",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "团购结束时间",
+            prop: "grouponEndTime",
+            valueFormat: 'yyyy-MM-dd HH:mm:ss',
+            type: "datetime",
+            labelWidth: 120,
+            rules: [{
+              required: true,
+              message: "请输入团购结束时间",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "取货开始时间",
+            prop: "takeStartTime",
+            type: "datetime",
+            labelWidth: 120,
+            valueFormat: 'yyyy-MM-dd HH:mm:ss',
+            hide: true,
+            rules: [{
+              required: true,
+              message: "请输入取货开始时间",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "取货结束时间",
+            prop: "takeEndTime",
+            labelWidth: 120,
+            type: "datetime",
+            valueFormat: 'yyyy-MM-dd HH:mm:ss',
+            hide: true,
+            rules: [{
+              required: true,
+              message: "请输入取货结束时间",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "浏览量",
+            prop: "views",
+            labelWidth: 120,
+            addDisplay: false,
+            editDisplay: false,
+            hide: true,
+            width: 80,
+            rules: [{
+              required: true,
+              message: "请输入浏览量",
+              trigger: "blur"
+            }]
+          },
+          {
+            label: "状态",
+            prop: "status",
+            labelWidth: 120,
+            search: true,
+            slot: true,
+            rules: [{
+              required: true,
+              message: "请选择状态",
+              trigger: "blur"
+            }],
+            type: "select",
+            dicUrl: "/api/blade-system/dict-biz/getEnumDict?enumName=StatusEnum",
+            props: {
+              label: "name",
+              value: "value"
+            },
+            dataType: "number",
+          },
+          {
+            label: "审核状态",
+            prop: "auditStatus",
+            labelWidth: 120,
+            addDisplay: false,
+            editDisplay: false,
+            rules: [{
+              required: true,
+              message: "请输入审核状态",
+              trigger: "blur"
+            }],
+            search: true,
+            slot: true,
+            type: "select",
+            dicUrl: "/api/blade-system/dict-biz/getEnumDict?enumName=AuditStatusEnum",
+            props: {
+              label: "name",
+              value: "value"
+            },
+            dataType: "number",
+          },
+          {
+            label: "团长",
+            prop: "organizerUserId",
+            labelWidth: 120,
+            rules: [{
+              required: true,
+              message: "请选择团长",
+              trigger: "blur"
+            }],
+            hide: true,
+            remote: true,
+            editDisplay: false,
+            viewDisplay: false,
+            editDisabled: true,
+            type: "select",
+            dicUrl: "/api/platform/userApp/list?username={{key}}&state=1&livingHall=1&size100",
+            props: {
+              label: "username",
+              value: "userId"
+            },
+            dicFormatter: function (res) {
+              return res.data.records;
+            },
+          },
+          {
+            label: "自提点",
+            prop: "selfTakeIds",
+            span: 24,
+            fromslot: true,
+            hide: true,
+            editDisplay: false,
+            viewDisplay: false,
+            editDisabled: true,
+          },
+          {
+            label: "团购商品",
+            prop: "goods",
+            span: 24,
+            fromslot: true,
+            editDisplay: false,
+            viewDisplay: false,
+            hide: true
+          },
+        ]
+      },
+      data: [],
+
+      grouponPage: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      grouponData: [],
+      grouponLoading: false,
+      grouponForm: {},
+      grouponQuery: {},
+      grouponSelectionList: [],
+
+      selfTakePage: {
+        pageSize: 10,
+        currentPage: 1,
+        total: 0
+      },
+      selfTakeData: [],
+      selfTakeLoading: false,
+      selfTakeForm: {},
+      selfTakeQuery: {},
+      selfTakeSelectionList: [],
+      selfTakeOption: {
+        tip: false,
+        searchShow: true,
+        searchMenuSpan: 6,
+        border: true,
+        index: true,
+        viewBtn: false,
+        addBtn: false,
+        delBtn: false,
+        menu: false,
+        selection: true,
+        dialogClickModal: false,
+        column: [
+          {
+            label: "名称",
+            prop: "name",
+            search: true
+          },
+          {
+            label: "地址",
+            prop: "address",
+          },
+          {
+            label: "营业开始时间",
+            prop: "busStartTime",
+            valueFormat: 'HH:mm:ss',
+            type: "time",
+          },
+          {
+            label: "营业结束时间",
+            prop: "busEndTime",
+            valueFormat: 'HH:mm:ss',
+            type: "time",
+          },
+        ]
+      },
+    };
+  },
+  computed: {
+    ...mapGetters(["permission"]),
+    permissionList() {
+      return {
+        addBtn: this.vaildData(this.permission.groupon_add, false),
+        viewBtn: this.vaildData(this.permission.groupon_view, false),
+        delBtn: this.vaildData(this.permission.groupon_delete, false),
+        editBtn: this.vaildData(this.permission.groupon_edit, false)
+      };
+    },
+    ids() {
+      let ids = [];
+      this.selectionList.forEach(ele => {
+        ids.push(ele.id);
+      });
+      return ids.join(",");
+    }
+  },
+  methods: {
+    rowSave(row, done, loading) {
+      if (this.tableData.length === 0) {
+        this.$message.warning("请选择商品");
+        return;
+      }
+      if (this.selfTakeList.length === 0) {
+        this.$message.warning("请选择自提点");
+        return;
+      }
+      let grouponGoodsList = [];
+      this.tableData.forEach(e => {
+        let g = {
+          goodsId: e.goodsId,
+          grouponPrice: e.grouponPrice
+        }
+        grouponGoodsList.push(g)
+      })
+      row.grouponGoodsList = grouponGoodsList;
+
+      let selfTakeIds = [];
+      this.selfTakeList.forEach(e => {
+        selfTakeIds.push(e.id)
+      })
+      row.selfTakeIds = selfTakeIds;
+
+      add(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        window.console.log(error);
+      });
+    },
+    rowUpdate(row, index, done, loading) {
+      update(row).then(() => {
+        this.onLoad(this.page);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+        done();
+      }, error => {
+        loading();
+        console.log(error);
+      });
+    },
+    rowDel(row) {
+      this.$confirm("确定将选择数据删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+    },
+    handleDelete() {
+      if (this.selectionList.length === 0) {
+        this.$message.warning("请选择至少一条数据");
+        return;
+      }
+      this.$confirm("确定将选择数据删除?", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+    },
+    beforeOpen(done, type) {
+      if (["edit", "view"].includes(type)) {
+        getDetail(this.form.id).then(res => {
+          this.form = res.data.data;
+        });
+      }
+      this.tableData = [];
+      this.selfTakeList = [];
+      this.grouponSelectionList = [];
+      done();
+    },
+    searchReset() {
+      this.query = {};
+      this.onLoad(this.page);
+    },
+    searchChange(params, done) {
+      this.query = params;
+      this.page.currentPage = 1;
+      this.onLoad(this.page, params);
+      done();
+    },
+    selectionChange(list) {
+      this.selectionList = list;
+    },
+    selectionClear() {
+      this.selectionList = [];
+      this.$refs.crud.toggleSelection();
+    },
+    currentChange(currentPage) {
+      this.page.currentPage = currentPage;
+    },
+    sizeChange(pageSize) {
+      this.page.pageSize = pageSize;
+    },
+    refreshChange() {
+      this.onLoad(this.page, this.query);
+    },
+    onLoad(page, params = {}) {
+      this.loading = true;
+      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+        const data = res.data.data;
+        this.page.total = data.total;
+        this.data = data.records;
+        this.loading = false;
+        this.selectionClear();
+      });
+    },
+    openAuditBox(id) {
+      this.auditBox = true;
+      this.auditForm.id = id;
+    },
+    auditGoods() {
+      audit(this.auditForm).then(() => {
+        this.auditBox = false;
+        this.onLoad(this.page, this.query);
+        this.$message({
+          type: "success",
+          message: "操作成功!"
+        });
+      }, error => {
+        loading();
+        console.log(error);
+      });
+    },
+    handleClose() {
+      this.addSelfTakeBox = false;
+      this.addGoodsBox = false;
+      this.auditBox = false;
+      this.auditForm = {
+        auditStatus: '',
+        id: '',
+        remark: ''
+      };
+    },
+    modifyState(row, status) {
+      let title = status === 0 ? '确定禁用?' : '确定启用?';
+      this.$confirm(title, {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(() => {
+        const loading = this.$loading({
+          lock: true,
+          text: '修改中,请稍等...',
+          spinner: 'el-icon-loading',
+          background: 'rgba(0, 0, 0, 0.7)'
+        });
+        row.status = status;
+        modifyStatus(row).then(() => {
+          loading.close();
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+        }, error => {
+          loading.close();
+          console.log(error);
+        });
+      })
+
+    },
+    uploadError(error, column) {
+      this.$message.success('上传失败:' + error)
+      // console.log(error, column)
+    },
+    uploadAfter(res, done, loading, column) {
+      // console.log(res,column)
+      done()
+    },
+
+
+    grouponSearchReset() {
+      this.grouponQuery = {};
+      this.grouponOnLoad(this.grouponPage);
+    },
+    grouponSearchChange(params, done) {
+      this.grouponQuery = params;
+      this.grouponPage.currentPage = 1;
+      this.grouponOnLoad(this.grouponPage, params);
+      done();
+    },
+    grouponSelectionChange(list) {
+      this.grouponSelectionList = list;
+    },
+    grouponSelectionClear() {
+      this.grouponSelectionList = [];
+      this.$refs.grouponCrud.toggleSelection();
+    },
+    grouponCurrentChange(currentPage){
+      this.grouponPage.currentPage = currentPage;
+    },
+    grouponSizeChange(pageSize){
+      this.grouponPage.pageSize = pageSize;
+    },
+    grouponRefreshChange() {
+      this.grouponOnLoad(this.grouponPage, this.grouponQuery);
+    },
+    grouponOnLoad(page, params = {}) {
+      this.grouponLoading = true;
+      if (this.grouponQuery.categoryIdArr) {
+        this.grouponQuery.goodsCategoryId = this.grouponQuery.categoryIdArr.join("-");
+        this.grouponQuery.categoryIdArr = null;
+      }
+      this.grouponQuery.auditStatus = 1;
+      this.grouponQuery.isSale = 1;
+
+      getGoodsList(page.currentPage, page.pageSize, Object.assign(params, this.grouponQuery)).then(res => {
+        const data = res.data.data;
+        this.grouponPage.total = data.total;
+        this.grouponData = data.records;
+        this.grouponLoading = false;
+      });
+    },
+
+    // 提交选择的商品
+    submit() {
+      if (this.grouponSelectionList.length === 0) {
+        this.$message.warning("请选择至少一条数据");
+        return;
+      }
+
+      let map = new Map();
+      this.tableData.forEach(row => {
+        map.set(row.goodsId, row.goodsId);
+      })
+
+      this.grouponSelectionList.forEach(e => {
+        let g = map.get(e.id);
+        if (!g) {
+          let goods = {
+            id: e.id,
+            goodsId: e.id,
+            goodsName: e.goodsName,
+            goodsCover: e.goodsCover,
+            goodsSpec: e.goodsSpec,
+            supplierName: e.supplierName,
+            grouponPrice: 0.00
+          }
+          this.tableData.push(goods);
+        }
+      })
+      this.addGoodsBox = false;
+      this.grouponSelectionClear();
+    },
+
+    /**
+     * 提交选择的自提点
+     */
+    submitSelfTake() {
+      if (this.selfTakeSelectionList.length === 0) {
+        this.$message.warning("请选择至少一条数据");
+        return;
+      }
+
+      let map = new Map();
+      this.selfTakeList.forEach(row => {
+        map.set(row.id, row.id);
+      })
+
+      this.selfTakeSelectionList.forEach(e => {
+        let g = map.get(e.id);
+        if (!g) {
+          let selfTake = {
+            id: e.id,
+            goodsId: e.id,
+            name: e.name,
+            address: e.address,
+            busStartTime: e.busStartTime,
+            busEndTime: e.busEndTime
+          }
+          this.selfTakeList.push(selfTake);
+        }
+      })
+      this.addSelfTakeBox = false;
+      this.selfTakeSelectionClear();
+    },
+
+    /**
+     * 删除商品
+     * @param row
+     * @param index
+     */
+    rowDelGoods(row, index) {
+      this.tableData.splice(index, 1);
+    },
+
+    /**
+     * 删除自提点
+     * @param row
+     * @param index
+     */
+    rowDelSelfTake(row, index) {
+      this.selfTakeList.splice(index, 1);
+    },
+
+    // 自提点curd相关方法
+    selfTakeSearchReset() {
+      this.selfTakeQuery = {};
+      this.selfTakeOnLoad(this.selfTakePage);
+    },
+    selfTakeSearchChange(params, done) {
+      this.selfTakeQuery = params;
+      this.selfTakePage.currentPage = 1;
+      this.selfTakeOnLoad(this.selfTakePage, params);
+      done();
+    },
+    selfTakeSelectionChange(list) {
+      this.selfTakeSelectionList = list;
+    },
+    selfTakeSelectionClear() {
+      this.selfTakeSelectionList = [];
+      this.$refs.selfTakeCrud.toggleSelection();
+    },
+    selfTakeCurrentChange(currentPage){
+      this.selfTakePage.currentPage = currentPage;
+    },
+    selfTakeSizeChange(pageSize){
+      this.selfTakePage.pageSize = pageSize;
+    },
+    selfTakeRefreshChange() {
+      this.selfTakeOnLoad(this.selfTakePage, this.selfTakeQuery);
+    },
+    selfTakeOnLoad(page, params = {}) {
+      this.selfTakeLoading = true;
+      this.selfTakeQuery.status = 1;
+      getSelfTakeList(page.currentPage, page.pageSize, Object.assign(params, this.selfTakeQuery)).then(res => {
+        const data = res.data.data;
+        this.selfTakePage.total = data.total;
+        this.selfTakeData = data.records;
+        this.selfTakeLoading = false;
+      });
+
+    },
+    addSelfTakeHandle() {
+      this.addSelfTakeBox = true;
+    }
+  },
+
+};
+</script>
+
+<style>
+</style>

+ 373 - 0
src/views/groupon/groupon_perfact.vue

@@ -0,0 +1,373 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :upload-error="uploadError"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+
+      <template slot="isPerfect" slot-scope="scope" >
+        <el-tag v-if="scope.row.isPerfect === 1" type="success">已完善</el-tag>
+        <el-tag v-if="scope.row.isPerfect === 0">待完善</el-tag>
+      </template>
+
+      <template slot="menuLeft">
+
+      </template>
+      <template slot-scope="scope" slot="menu">
+
+      </template>
+
+      <!--  添加商品插槽    -->
+      <template slot="goodsForm">
+        <avue-crud :option="goodsTableOption"
+                   :data="tableData"
+                   ref="crudGoods">
+          <template #menu="{row,index,size}">
+            <el-button type="danger"
+                       size="mini"
+                       @click="rowDelGoods(row,index)">删除</el-button>
+          </template>
+          <template slot="grouponPrice" slot-scope="scope" >
+            <avue-input-number precision="2" v-model="scope.row.grouponPrice"></avue-input-number>
+          </template>
+        </avue-crud>
+      </template>
+
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove, perfect} from "@/api/groupon/groupon";
+  import {mapGetters} from "vuex";
+  import {goodsTableOption} from "../../option/groupon/grouponPerfact"
+
+  export default {
+    data() {
+      return {
+        goodsTableOption: goodsTableOption,
+        tableData: [],
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: false,
+          addBtn: false,
+          viewBtn: true,
+          editBtn: true,
+          editBtnText: '完善信息',
+          delBtn: false,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "主标题",
+              prop: "mainTitle",
+              labelWidth: 120,
+              editDisplay: false,
+              search: true,
+              rules: [{
+                required: true,
+                message: "请输入团购名称",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "副标题",
+              prop: "subTitle",
+              labelWidth: 120,
+              editDisplay: false,
+              hide: true,
+            },
+            {
+              label: "团购开始时间",
+              labelWidth: 120,
+              editDisplay: false,
+              prop: "grouponStartTime",
+              rules: [{
+                required: true,
+                message: "请输入团购开始时间",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "团购结束时间",
+              prop: "grouponEndTime",
+              labelWidth: 120,
+              editDisplay: false,
+              rules: [{
+                required: true,
+                message: "请输入团购结束时间",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "信息是否完善",
+              prop: "isPerfect",
+              editDisplay: false,
+              viewDisplay: false,
+            },
+            {
+              labelWidth: 120,
+              label: '团购分享图',
+              prop: 'shareImage',
+              type: 'upload',
+              listType: 'picture-img',
+              loadText: '上传中,请稍等',
+              accept: 'image/png, image/jpeg',
+              fileSize: 500,
+              tip: '建议尺寸:800×640;只能上传jpg/png文件,且不超过500kb',
+              span: 24,
+              hide: true,
+              propsHttp: {
+                res: 'data',
+                url: 'link',
+              },
+              action: "/api/blade-resource/oss/endpoint/put-file-attach"
+            },
+            {
+              label: '团购轮播图',
+              labelWidth: 120,
+              prop: 'slideshow',
+              type: 'upload',
+              dataType: 'array',
+              listType: 'picture-card',
+              loadText: '上传中,请稍等',
+              accept: 'image/png, image/jpeg',
+              fileSize: 500,
+              tip: '建议尺寸:750×420;只能上传jpg/png文件,且不超过500kb',
+              span: 24,
+              hide: true,
+              propsHttp: {
+                res: 'data',
+                url: 'link',
+              },
+              action: "/api/blade-resource/oss/endpoint/put-file-attach"
+            },
+            {
+              label: '团购详情图',
+              labelWidth: 120,
+              prop: 'detailImage',
+              type: 'upload',
+              dataType: 'array',
+              listType: 'picture-card',
+              loadText: '上传中,请稍等',
+              accept: 'image/png, image/jpeg',
+              fileSize: 1024,
+              tip: '只能上传jpg/png文件,且不超过1M',
+              limit: 25,
+              span: 24,
+              hide: true,
+              propsHttp: {
+                res: 'data',
+                url: 'link',
+              },
+              action: "/api/blade-resource/oss/endpoint/put-file-attach"
+            },
+            {
+              label: "团购商品",
+              prop: "goods",
+              labelWidth: 120,
+              span: 24,
+              fromslot: true,
+              // editDisplay: false,
+              // viewDisplay: false,
+              hide: true
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.groupon_add, false),
+          viewBtn: this.vaildData(this.permission.groupon_view, false),
+          delBtn: this.vaildData(this.permission.groupon_delete, false),
+          editBtn: this.vaildData(this.permission.groupon_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        this.tableData.forEach(e => {
+          e.sort = e.$index;
+        })
+        console.log("2--", this.tableData)
+        row.goodsList = this.tableData;
+        perfect(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          this.tableData = [];
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+            res.data.data.goodsList.forEach(e => {
+              let goods = {
+                id: e.id,
+                goodsId: e.id,
+                goodsName: e.goodsName,
+                goodsCover: e.goodsCover,
+                goodsSpec: e.goodsSpec,
+                supplierName: e.supplierName,
+                grouponPrice: e.grouponPrice
+              }
+              this.tableData.push(goods)
+            })
+            console.log("1--", this.tableData)
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      },
+      uploadError(error, column) {
+        this.$message.error('上传失败:' + error)
+        console.log(error, column)
+      },
+      /**
+       * 删除商品
+       * @param row
+       * @param index
+       */
+      rowDelGoods(row, index) {
+        this.tableData.splice(index, 1);
+      },
+    }
+  };
+</script>
+
+<style>
+</style>

+ 227 - 0
src/views/groupon/groupongoods.vue

@@ -0,0 +1,227 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.groupongoods_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/groupon/groupongoods";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "团购id",
+              prop: "grouponId",
+              rules: [{
+                required: true,
+                message: "请输入团购id",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "商品ID",
+              prop: "goodsId",
+              rules: [{
+                required: true,
+                message: "请输入商品ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "商品数量",
+              prop: "goodsNum",
+              rules: [{
+                required: true,
+                message: "请输入商品数量",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.groupongoods_add, false),
+          viewBtn: this.vaildData(this.permission.groupongoods_view, false),
+          delBtn: this.vaildData(this.permission.groupongoods_delete, false),
+          editBtn: this.vaildData(this.permission.groupongoods_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 218 - 0
src/views/groupon/grouponselftake.vue

@@ -0,0 +1,218 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.grouponselftake_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/groupon/grouponselftake";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "团购id",
+              prop: "grouponId",
+              rules: [{
+                required: true,
+                message: "请输入团购id",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "自提点id",
+              prop: "selfTakeId",
+              rules: [{
+                required: true,
+                message: "请输入自提点id",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.grouponselftake_add, false),
+          viewBtn: this.vaildData(this.permission.grouponselftake_view, false),
+          delBtn: this.vaildData(this.permission.grouponselftake_delete, false),
+          editBtn: this.vaildData(this.permission.grouponselftake_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 227 - 0
src/views/groupon/grouponuser.vue

@@ -0,0 +1,227 @@
+<template>
+  <basic-container>
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+      <template slot="menuLeft">
+        <el-button type="danger"
+                   size="small"
+                   icon="el-icon-delete"
+                   plain
+                   v-if="permission.grouponuser_delete"
+                   @click="handleDelete">删 除
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/groupon/grouponuser";
+  import {mapGetters} from "vuex";
+
+  export default {
+    data() {
+      return {
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "团购id",
+              prop: "grouponId",
+              rules: [{
+                required: true,
+                message: "请输入团购id",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "用户ID",
+              prop: "userId",
+              rules: [{
+                required: true,
+                message: "请输入用户ID",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "用户头像",
+              prop: "userAvatar",
+              rules: [{
+                required: true,
+                message: "请输入用户头像",
+                trigger: "blur"
+              }]
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.grouponuser_add, false),
+          viewBtn: this.vaildData(this.permission.grouponuser_view, false),
+          delBtn: this.vaildData(this.permission.grouponuser_delete, false),
+          editBtn: this.vaildData(this.permission.grouponuser_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      }
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>

+ 382 - 0
src/views/groupon/selftake.vue

@@ -0,0 +1,382 @@
+<template>
+
+  <basic-container>
+
+    <avue-crud :option="option"
+               :table-loading="loading"
+               :data="data"
+               :page.sync="page"
+               :permission="permissionList"
+               :before-open="beforeOpen"
+               v-model="form"
+               ref="crud"
+               @row-update="rowUpdate"
+               @row-save="rowSave"
+               @row-del="rowDel"
+               @search-change="searchChange"
+               @search-reset="searchReset"
+               @selection-change="selectionChange"
+               @current-change="currentChange"
+               @size-change="sizeChange"
+               @refresh-change="refreshChange"
+               @on-load="onLoad">
+
+      <template slot="status" slot-scope="scope" >
+        <el-tag v-if="scope.row.status === 1" type="success">{{scope.row.$status}}</el-tag>
+        <el-tag v-if="scope.row.status === 0" type="danger">{{scope.row.$status}}</el-tag>
+      </template>
+
+      <template slot="menu" slot-scope="scope">
+        <el-button v-if="scope.row.status == 0"
+                   type="text"
+                   size="small"
+                   @click="modifyState(scope.row, 1)"
+        >启用</el-button>
+        <el-button v-if="scope.row.status == 1"
+                   type="text"
+                   size="small"
+                   @click="modifyState(scope.row, 0)"
+        >禁用
+        </el-button>
+      </template>
+    </avue-crud>
+  </basic-container>
+</template>
+
+<script>
+  import {getList, getDetail, add, update, remove} from "@/api/groupon/selftake";
+  import {mapGetters} from "vuex";
+  import {getUsualLogs} from "../../api/logs";
+
+  export default {
+    data() {
+      return {
+        lo: 0.0,
+        la: 0.0,
+        address: '',
+        form: {},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        option: {
+          height:'auto',
+          calcHeight: 30,
+          tip: false,
+          searchShow: true,
+          searchMenuSpan: 6,
+          border: true,
+          index: true,
+          viewBtn: true,
+          delBtn: false,
+          selection: true,
+          dialogClickModal: false,
+          column: [
+            {
+              label: "名称",
+              prop: "name",
+              search: true,
+              labelWidth: 120,
+              rules: [{
+                required: true,
+                message: "请输入自提点名字",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "地址",
+              prop: "addressTemp",
+              labelWidth: 120,
+              type: 'map',
+              // component: 'avueMap',
+              hide: true,
+              rules: [{
+                required: true,
+                message: "请输入自提点地址",
+                trigger: "blur"
+              }],
+            },
+            {
+              label: "地址",
+              prop: "address",
+              addDisplay: false,
+              editDisplay: false,
+              labelWidth: 120,
+            },
+            {
+              label: "联系人",
+              prop: "contactPerson",
+              hide: true,
+              labelWidth: 120,
+            },
+            {
+              label: "联系电话",
+              prop: "contactNumber",
+              hide: true,
+              labelWidth: 120,
+            },
+            {
+              label: "营业开始时间",
+              prop: "busStartTime",
+              valueFormat: 'HH:mm:ss',
+              labelWidth: 120,
+              type: "time",
+              pickerOptions:{
+                start: '08:00',
+                step: '00:15',
+                end: '22:00'
+              },
+              rules: [{
+                required: true,
+                message: "请输入营业开始时间",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "营业结束时间",
+              prop: "busEndTime",
+              valueFormat: 'HH:mm:ss',
+              labelWidth: 120,
+              type: "time",
+              pickerOptions:{
+                start: '08:00',
+                step: '00:15',
+                end: '22:00'
+              },
+              rules: [{
+                required: true,
+                message: "请输入营业结束时间",
+                trigger: "blur"
+              }]
+            },
+            {
+              label: "状态",
+              prop: "status",
+              labelWidth: 120,
+              rules: [{
+                required: true,
+                message: "请输入状态",
+                trigger: "blur"
+              }],
+              search: true,
+              slot:true,
+              type: "select",
+              dicUrl: "/api/blade-system/dict-biz/getEnumDict?enumName=StatusEnum",
+              props: {
+                label: "name",
+                value: "value"
+              },
+              dataType: "number",
+            },
+          ]
+        },
+        data: []
+      };
+    },
+    computed: {
+      ...mapGetters(["permission"]),
+      permissionList() {
+        return {
+          addBtn: this.vaildData(this.permission.selftake_add, false),
+          viewBtn: this.vaildData(this.permission.selftake_view, false),
+          delBtn: this.vaildData(this.permission.selftake_delete, false),
+          editBtn: this.vaildData(this.permission.selftake_edit, false)
+        };
+      },
+      ids() {
+        let ids = [];
+        this.selectionList.forEach(ele => {
+          ids.push(ele.id);
+        });
+        return ids.join(",");
+      },
+    },
+    created() {
+      this.option.column[1].change = function (column) {
+        if (column.value.length > 0) {
+          let value = column.value;
+          this.getAddress(value[0], value[1], (result) => {
+            column.value[2] = result;
+          });
+        }
+
+      }.bind(this);
+    },
+    methods: {
+      rowSave(row, done, loading) {
+        row.longitude = row.addressTemp[0];
+        row.latitude = row.addressTemp[1];
+        row.address = this.address;
+        console.log(row)
+        add(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          window.console.log(error);
+        });
+      },
+      rowUpdate(row, index, done, loading) {
+        row.longitude = row.addressTemp[0];
+        row.latitude = row.addressTemp[1];
+        row.address = this.address;
+        update(row).then(() => {
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "操作成功!"
+          });
+          done();
+        }, error => {
+          loading();
+          console.log(error);
+        });
+      },
+      rowDel(row) {
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(row.id);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          });
+      },
+      handleDelete() {
+        if (this.selectionList.length === 0) {
+          this.$message.warning("请选择至少一条数据");
+          return;
+        }
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+            return remove(this.ids);
+          })
+          .then(() => {
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+            this.$refs.crud.toggleSelection();
+          });
+      },
+      beforeOpen(done, type) {
+        if (["edit", "view"].includes(type)) {
+          getDetail(this.form.id).then(res => {
+            this.form = res.data.data;
+            let addressTemp = [];
+            addressTemp.push(this.form.longitude)
+            addressTemp.push(this.form.latitude)
+            addressTemp.push(this.form.address)
+            this.form.addressTemp = addressTemp;
+          });
+        }
+        done();
+      },
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage){
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize){
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}) {
+        this.loading = true;
+        this.query.isAdmin = "true";
+        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          const data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          this.selectionClear();
+        });
+      },
+      modifyState(row, status) {
+        let title = status === 0 ? '确定禁用?' : '确定启用?';
+        this.$confirm(title, {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          const loading = this.$loading({
+            lock: true,
+            text: '修改中,请稍等...',
+            spinner: 'el-icon-loading',
+            background: 'rgba(0, 0, 0, 0.7)'
+          });
+          row.status = status;
+          update(row).then(() => {
+            loading.close();
+            this.onLoad(this.page);
+            this.$message({
+              type: "success",
+              message: "操作成功!"
+            });
+          }, error => {
+            loading.close();
+            console.log(error);
+          });
+        })
+      },
+      getAddress (r, p, callback) {
+        new window.AMap.service("AMap.Geocoder", () => {
+          //回调函数
+          let geocoder = new window.AMap.Geocoder({});
+          geocoder.getAddress([r, p], (status, result) => {
+            if (status === "complete" && result.info === "OK") {
+              var address = result.regeocode.formattedAddress;
+              this.address = address;
+              callback(address);
+            } else {
+              this.$message({
+                type: "error",
+                message: "高德地图调用失败!"
+              });
+            }
+          });
+        });
+      }
+    }
+  };
+</script>
+
+<style>
+</style>