licailing 5 лет назад
Родитель
Сommit
c436dc5dc1

+ 2 - 0
src/main/java/com/izouma/jiashanxia/domain/CommissionRecord.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.annotations.NotFound;
 import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
 import java.io.Serializable;
@@ -23,6 +24,7 @@ import java.math.BigDecimal;
 @Entity
 @Builder
 @Data
+@Where(clause = "del = 0")
 @ApiModel(value = "佣金记录", description = "CommissionRecord")
 public class CommissionRecord extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "用户ID", name = "userId")

+ 6 - 0
src/main/java/com/izouma/jiashanxia/repo/UserRepo.java

@@ -30,6 +30,12 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
     List<User> findAllByCompanyIdAndDelFalse(Long companyId);
 
+    @Query("select u.id from User u  where u.parent = ?1")
+    List<Long> findIdByParentAndDelFalse(Long parent);
+
+    @Query("select u.id from User u  where u.parent in ?1")
+    List<Long> findIdByParentInAndDelFalse(Iterable<Long> parent);
+
     long countByParentAndDelFalse(Long parentId);
 
     List<User> findAllByCompanyIdIsNullAndDelFalse();

+ 12 - 0
src/main/java/com/izouma/jiashanxia/service/CommissionRecordService.java

@@ -83,6 +83,18 @@ public class CommissionRecordService {
 
     }
 
+    public Page<CommissionRecord> backAll2(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
+        return commissionRecordRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, CommissionRecord.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+
+    }
+
     /*
     我的
      */

+ 24 - 0
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.config.Constants;
 import com.izouma.jiashanxia.domain.User;
@@ -425,4 +426,27 @@ public class UserService {
         user.setMember(Member.EXPERT);
         return userRepo.save(user);
     }
+
+    /*
+    下级
+     */
+    public Page<User> children(PageQuery pageQuery) {
+        Map<String, Object> query = pageQuery.getQuery();
+        String parent = (String) query.get("parent");
+        List<Long> users = userRepo.findIdByParentAndDelFalse(Long.parseLong(parent));
+
+        List<Long> children = new ArrayList<>(users);
+        while (CollUtil.isNotEmpty(users)) {
+            users = userRepo.findIdByParentInAndDelFalse(users);
+            children.addAll(users);
+        }
+//        return children;
+
+        query.remove("parent");
+        return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
+            and.add(root.in(children));
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
 }

+ 1 - 1
src/main/java/com/izouma/jiashanxia/web/CommissionRecordController.java

@@ -47,7 +47,7 @@ public class CommissionRecordController extends BaseController {
     @PreAuthorize("hasAnyRole('ADMIN','CREATOR')")
     @PostMapping("/backAll")
     public Page<CommissionRecord> backAll(@RequestBody PageQuery pageQuery) {
-        return commissionRecordService.backAll(pageQuery, SecurityUtils.getAuthenticatedUser());
+        return commissionRecordService.backAll2(pageQuery);
     }
 
     @GetMapping("/get/{id}")

+ 6 - 0
src/main/java/com/izouma/jiashanxia/web/UserController.java

@@ -195,4 +195,10 @@ public class UserController extends BaseController {
     public User becomeExpert() {
         return userService.becomeExpert(SecurityUtils.getAuthenticatedUser());
     }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/children")
+    public Page<User> children(@RequestBody PageQuery pageQuery) {
+        return userService.children(pageQuery);
+    }
 }

+ 2 - 2
src/main/resources/application.yaml

@@ -57,8 +57,8 @@ jwt:
     expiration: 2592000 #30days
 wx:
     mp:
-        app_id: wx2375cba2eec2c479
-        app_secret: 28e4829124860d9ef9e2f32aeefd1111
+        app_id: wxf09cb8115fd50795
+        app_secret: 806e4b2233d45d76081c5bc2ac632f76
     ma:
         app_id: wx29e886237ed709b2
         app_secret: 257c23ed1e257f260ab13ce6400ebf4f

+ 2 - 1
src/main/vue/src/components/PackageEdit.vue

@@ -207,7 +207,8 @@ export default {
                     this.$router.replace({
                         name: 'PackageEdit',
                         query: {
-                            id: res.id
+                            id: res.id,
+                            attractionsId: res.attractionsId
                         }
                     });
                 })

+ 14 - 12
src/main/vue/src/components/PackageGoodsTable.vue

@@ -71,8 +71,7 @@ export default {
                 ]
             },
             goodsList: [],
-            goods: {},
-            attractionsId: ''
+            goods: {}
         };
     },
     computed: {
@@ -81,15 +80,19 @@ export default {
         }
     },
     mounted() {
-        this.$http
-            .post('goodsInfo/allList')
-            .then(res => {
-                this.goodsList = res;
-            })
-            .catch(e => {
-                console.log(e);
-                this.$message.error(e.error);
-            });
+        if (this.$route.query.attractionsId) {
+            this.$http
+                .post('goodsInfo/byAttractions', {
+                    attractionsId: this.$route.query.attractionsId
+                })
+                .then(res => {
+                    this.goodsList = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
     },
     methods: {
         /*beforeGetData() {
@@ -118,7 +121,6 @@ export default {
                 };
             }
             this.formData = { ...row };
-            console.log(this.formData);
             this.showDialog = true;
         },
         download() {

+ 8 - 0
src/main/vue/src/router.js

@@ -87,6 +87,14 @@ const router = new Router({
                         title: '员工列表'
                     }
                 },
+                {
+                    path: '/childrenList',
+                    name: 'childrenList',
+                    component: () => import(/* webpackChunkName: "userEdit" */ '@/views/ChildrenList.vue'),
+                    meta: {
+                        title: '下级列表'
+                    }
+                },
                 {
                     path: '/userPackageFlowList1',
                     name: 'UserPackageFlowList1',

+ 160 - 0
src/main/vue/src/views/ChildrenList.vue

@@ -0,0 +1,160 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <!-- <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button> -->
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            height="tableHeight"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <!--<el-table-column prop="id" label="ID" width="100"> </el-table-column>-->
+            <el-table-column prop="username" label="用户名" min-width="100"> </el-table-column>
+            <el-table-column prop="nickname" label="昵称" min-width="100"> </el-table-column>
+            <el-table-column label="头像" min-width="100">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="row.avatar"
+                        fit="cover"
+                        :preview-src-list="[row.avatar]"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="member" label="身份" :formatter="memberFormatter"></el-table-column>
+            <!-- <el-table-column prop="parentNickname" label="推广人" min-width="100"> </el-table-column> -->
+            <!--<el-table-column label="操作" align="center" fixed="right">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                </template>
+            </el-table-column>-->
+        </el-table>
+        <div class="pagination-wrapper">
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+export default {
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/user/children',
+            downloading: false,
+            members: [
+                { label: '普通用户', value: 'NORMAL' },
+                { label: '达人', value: 'EXPERT' },
+                { label: '108将', value: 'GENERAL' },
+                { label: '创客', value: 'MAKER' },
+                { label: '全职', value: 'EMPLOYEE' },
+                { label: '108将/创客', value: 'GENERAL_MAKER' }
+            ]
+        };
+    },
+    computed: {
+        // ...mapState(['userInfo']),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        memberFormatter(row, column, cellValue, index) {
+            let selectedOption = this.members.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return {
+                search: this.search,
+                query: {
+                    parent: this.$route.query.id
+                }
+            };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/userEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/userEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/user/excel', { responseType: 'blob' })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 218 - 0
src/main/vue/src/views/CommissionRecordList copy.vue

@@ -0,0 +1,218 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <!-- <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button> -->
+            <!-- <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button> -->
+            <el-select
+                v-model="transactionType"
+                multiple
+                clearable
+                @change="getData"
+                collapse-tags
+                placeholder="请选择交易类型"
+            >
+                <el-option
+                    v-for="item in transactionTypeOptions"
+                    :key="item.value"
+                    :value="item.value"
+                    :label="item.label"
+                >
+                </el-option>
+            </el-select>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="80"> </el-table-column>
+            <el-table-column prop="user.nickname" label="昵称"> </el-table-column>
+            <el-table-column prop="transactionType" label="交易类型">
+                <template slot-scope="{ row }">
+                    <el-tag type="success" v-if="row.transactionType == 'WITHDRAW'">提现</el-tag>
+                    <el-tag v-else-if="row.transactionType == 'PROMOTE'">推广新会员</el-tag>
+                    <el-tag v-else-if="row.transactionType == 'EMPLOYEES_PROMOTE'">员工推广新会员</el-tag>
+                    <el-tag type="danger" v-else>退款</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="amount" label="交易金额"> </el-table-column>
+            <el-table-column prop="payMethod" label="支付方式" :formatter="payMethodFormatter"> </el-table-column>
+            <el-table-column prop="transactionId" label="交易单号" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="remark" label="备注"> </el-table-column>
+            <el-table-column prop="createdAt" label="交易时间" show-overflow-tooltip> </el-table-column>
+            <!-- <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column> -->
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'CommissionRecordList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/commissionRecord/backAll',
+            downloading: false,
+            transactionTypeOptions: [
+                { label: '提现', value: 'WITHDRAW' },
+                { label: '推广新会员', value: 'PROMOTE' },
+                { label: '员工推广新会员', value: 'EMPLOYEES_PROMOTE' },
+                { label: '退款', value: 'REFUND' }
+            ],
+            payMethodOptions: [
+                { label: '微信', value: 'WEIXIN' },
+                { label: '余额', value: 'YUE' }
+            ],
+            transactionType: []
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        transactionTypeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.transactionTypeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        payMethodFormatter(row, column, cellValue, index) {
+            let selectedOption = this.payMethodOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return {
+                sort: 'createdAt,desc',
+                search: this.search,
+                query: {
+                    transactionType: this.transactionType,
+                    companyId: this.$route.query.id,
+                    del: false
+                }
+            };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/commissionRecordEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/commissionRecordEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/commissionRecord/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/commissionRecord/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 37 - 12
src/main/vue/src/views/CommissionRecordList.vue

@@ -18,6 +18,7 @@
                 clearable
                 @change="getData"
                 collapse-tags
+                class="filter-item"
                 placeholder="请选择交易类型"
             >
                 <el-option
@@ -28,6 +29,18 @@
                 >
                 </el-option>
             </el-select>
+            <el-date-picker
+                v-model="dateRange"
+                type="daterange"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                start-placeholder="请选择开始时间"
+                end-placeholder="请选择结束时间"
+                range-separator="至"
+                :default-time="['00:00:00', '23:59:59']"
+                class="filter-item"
+                @change="getData"
+            >
+            </el-date-picker>
         </div>
         <el-table
             :data="tableData"
@@ -46,7 +59,9 @@
                 <template slot-scope="{ row }">
                     <el-tag type="success" v-if="row.transactionType == 'WITHDRAW'">提现</el-tag>
                     <el-tag v-else-if="row.transactionType == 'PROMOTE'">推广新会员</el-tag>
-                    <el-tag v-else-if="row.transactionType == 'EMPLOYEES_PROMOTE'">员工推广新会员</el-tag>
+                    <el-tag v-else-if="row.transactionType == 'MAKER'">创客奖励</el-tag>
+                    <el-tag v-else-if="row.transactionType == 'GENERAL'">108将奖励</el-tag>
+                    <el-tag v-else-if="row.transactionType == 'CHILD_PROMOTE'" type="warning">间推</el-tag>
                     <el-tag type="danger" v-else>退款</el-tag>
                 </template>
             </el-table-column>
@@ -88,6 +103,8 @@
 <script>
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
+import startOfDay from 'date-fns/startOfDay';
+import endOfDay from 'date-fns/endOfDay';
 
 export default {
     name: 'CommissionRecordList',
@@ -101,14 +118,17 @@ export default {
             transactionTypeOptions: [
                 { label: '提现', value: 'WITHDRAW' },
                 { label: '推广新会员', value: 'PROMOTE' },
-                { label: '员工推广新会员', value: 'EMPLOYEES_PROMOTE' },
+                { label: '创客奖励', value: 'MAKER' },
+                { label: '108将奖励', value: 'GENERAL' },
+                { label: '间推', value: 'CHILD_PROMOTE' },
                 { label: '退款', value: 'REFUND' }
             ],
             payMethodOptions: [
                 { label: '微信', value: 'WEIXIN' },
                 { label: '余额', value: 'YUE' }
             ],
-            transactionType: []
+            transactionType: [],
+            dateRange: []
         };
     },
     computed: {
@@ -132,15 +152,20 @@ export default {
             return '';
         },
         beforeGetData() {
-            return {
-                sort: 'createdAt,desc',
-                search: this.search,
-                query: {
-                    transactionType: this.transactionType,
-                    companyId: this.$route.query.id,
-                    del: false
-                }
-            };
+            let data = { sort: 'createdAt,desc', query: {} };
+            if (this.search) {
+                data.search = this.search;
+            }
+            if (this.dateRange && this.dateRange.length > 0) {
+                data.query.createdAt = this.dateRange[0] + ',' + this.dateRange[1];
+            }
+            if (this.$route.query.id) {
+                data.query.userId = this.$route.query.id;
+            }
+            if (this.transactionType) {
+                data.query.transactionType = this.transactionType;
+            }
+            return data;
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 216 - 0
src/main/vue/src/views/EmployeeList copy.vue

@@ -0,0 +1,216 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <!-- <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button> -->
+            <el-select
+                v-model="companyId"
+                placeholder="请选择公司"
+                clearable
+                filterable
+                @change="getData"
+                v-if="display"
+            >
+                <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name"></el-option>
+            </el-select>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            height="tableHeight"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <!--<el-table-column prop="id" label="ID" width="100"> </el-table-column>-->
+            <el-table-column prop="username" label="用户名" min-width="80"> </el-table-column>
+            <el-table-column prop="nickname" label="昵称" min-width="80"> </el-table-column>
+            <el-table-column label="头像" min-width="80">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="row.avatar"
+                        fit="cover"
+                        :preview-src-list="[row.avatar]"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="amount" label="余额">
+                <!-- <template slot-scope="{ row }">
+                    <span>{{ row.amount }}</span>
+                    <i class="el-icon-user-solid" v-if="row.teamFounder"></i>
+                </template> -->
+            </el-table-column>
+            <el-table-column prop="company.name" label="企业名称" show-overflow-tooltip> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right">
+                <template slot-scope="{ row }">
+                    <el-button
+                        @click="remove(row)"
+                        type="warning"
+                        size="mini"
+                        plain
+                        :loading="$store.state.fetchingData"
+                        v-if="!row.teamFounder"
+                    >
+                        移除
+                    </el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+export default {
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/user/myEmployee',
+            downloading: false,
+            companyId: '',
+            companies: [],
+            display: false
+        };
+    },
+    created() {
+        if (this.$route.query.id) {
+            this.companyId = this.$route.query.id;
+        }
+        this.$http
+            .get('/company/allList')
+            .then(res => {
+                this.companies = res;
+            })
+            .catch(e => {
+                console.log(e);
+            });
+        this.getAdmin();
+    },
+    computed: {
+        ...mapState(['userInfo']),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return {
+                search: this.search,
+                query: {
+                    companyId: this.companyId || this.$route.query.id
+                }
+            };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/userEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/userEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/user/excel', { responseType: 'blob' })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        remove(row) {
+            this.$alert('确认该员工移除' + row.company.name + '么?', '提示', { type: 'primary' })
+                .then(() => {
+                    return this.$http.post('/company/removeEmp', {
+                        userId: row.id,
+                        companyId: row.companyId
+                    });
+                })
+                .then(() => {
+                    this.$message.success('移除成功');
+                    history.go(0);
+                })
+                .catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('移除取消');
+                    } else {
+                        this.$message.error('移除失败');
+                        console.log(action);
+                    }
+                });
+        },
+        getAdmin() {
+            let data = this.userInfo.authorities;
+            for (let item in data) {
+                if (data[item].name === 'ROLE_ADMIN') {
+                    this.display = true;
+                    break;
+                }
+            }
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 22 - 25
src/main/vue/src/views/EmployeeList.vue

@@ -11,16 +11,6 @@
                 class="filter-item"
                 >导出EXCEL
             </el-button> -->
-            <el-select
-                v-model="companyId"
-                placeholder="请选择公司"
-                clearable
-                filterable
-                @change="getData"
-                v-if="display"
-            >
-                <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name"></el-option>
-            </el-select>
         </div>
         <el-table
             :data="tableData"
@@ -52,10 +42,11 @@
                     <i class="el-icon-user-solid" v-if="row.teamFounder"></i>
                 </template> -->
             </el-table-column>
-            <el-table-column prop="company.name" label="企业名称" show-overflow-tooltip> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right">
                 <template slot-scope="{ row }">
-                    <el-button
+                    <el-button size="mini" @click="handleCommand2(row.id)">收益</el-button>
+                    <el-button size="mini" @click="handleCommand1(row.id)">下级</el-button>
+                    <!-- <el-button
                         @click="remove(row)"
                         type="warning"
                         size="mini"
@@ -64,7 +55,7 @@
                         v-if="!row.teamFounder"
                     >
                         移除
-                    </el-button>
+                    </el-button> -->
                 </template>
             </el-table-column>
         </el-table>
@@ -92,10 +83,8 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/user/myEmployee',
+            url: '/user/all',
             downloading: false,
-            companyId: '',
-            companies: [],
             display: false
         };
     },
@@ -103,14 +92,6 @@ export default {
         if (this.$route.query.id) {
             this.companyId = this.$route.query.id;
         }
-        this.$http
-            .get('/company/allList')
-            .then(res => {
-                this.companies = res;
-            })
-            .catch(e => {
-                console.log(e);
-            });
         this.getAdmin();
     },
     computed: {
@@ -124,7 +105,7 @@ export default {
             return {
                 search: this.search,
                 query: {
-                    companyId: this.companyId || this.$route.query.id
+                    member: 'EMPLOYEE'
                 }
             };
         },
@@ -209,6 +190,22 @@ export default {
                     break;
                 }
             }
+        },
+        handleCommand2(id) {
+            this.$router.push({
+                path: '/commissionRecordList',
+                query: {
+                    id: id
+                }
+            });
+        },
+        handleCommand1(id) {
+            this.$router.push({
+                path: '/childrenList',
+                query: {
+                    id: id
+                }
+            });
         }
     }
 };

+ 2 - 1
src/main/vue/src/views/PackageEdit.vue

@@ -24,7 +24,8 @@ export default {
     data() {
         return {
             active: 'first',
-            id: 0
+            id: 0,
+            formData: {}
         };
     },
     // mounted() {

+ 2 - 1
src/main/vue/src/views/PackageList.vue

@@ -126,7 +126,8 @@ export default {
             this.$router.push({
                 path: '/packageEdit',
                 query: {
-                    id: row.id
+                    id: row.id,
+                    attractionsId: row.attractionsId
                 }
             });
         },

+ 19 - 1
src/main/vue/src/views/UserEdit.vue

@@ -42,6 +42,16 @@
                     我的团队
                 </el-button> -->
             <!-- </el-form-item> -->
+            <el-form-item prop="member" label="身份">
+                <el-select v-model="formData.member" style="width:100%">
+                    <el-option
+                        v-for="item in members"
+                        :key="item.value"
+                        :value="item.value"
+                        :label="item.label"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
             <el-form-item prop="authorities" label="角色">
                 <el-select
                     v-model="formData.authorities"
@@ -137,7 +147,15 @@ export default {
             companies: [],
             userDialog: false,
             employee: [],
-            id: 0
+            id: 0,
+            members: [
+                { label: '普通用户', value: 'NORMAL' },
+                { label: '达人', value: 'EXPERT' },
+                { label: '108将', value: 'GENERAL' },
+                { label: '创客', value: 'MAKER' },
+                { label: '全职', value: 'EMPLOYEE' },
+                { label: '108将/创客', value: 'GENERAL_MAKER' }
+            ]
         };
     },
     methods: {

+ 13 - 3
src/main/vue/src/views/UserList.vue

@@ -38,6 +38,7 @@
                 </template>
             </el-table-column>
             <el-table-column prop="amount" label="余额"> </el-table-column>
+            <el-table-column prop="member" label="身份" :formatter="memberFormatter"></el-table-column>
             <el-table-column prop="createdAt" label="注册时间" show-overflow-tooltip> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right">
                 <template slot-scope="{ row }">
@@ -74,11 +75,13 @@ export default {
             url: '/user/all',
             downloading: false,
             sortStr: 'createdAt,desc',
-            member: [
+            members: [
                 { label: '普通用户', value: 'NORMAL' },
                 { label: '达人', value: 'EXPERT' },
-                { label: '大达人', value: 'BIG_EXPERT' },
-                { label: '创客', value: 'MAKER' }
+                { label: '108将', value: 'GENERAL' },
+                { label: '创客', value: 'MAKER' },
+                { label: '全职', value: 'EMPLOYEE' },
+                { label: '108将/创客', value: 'GENERAL_MAKER' }
             ]
         };
     },
@@ -89,6 +92,13 @@ export default {
         }
     },
     methods: {
+        memberFormatter(row, column, cellValue, index) {
+            let selectedOption = this.members.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         beforeGetData() {
             if (this.search) {
                 return { search: this.search };

+ 13 - 0
src/test/java/com/izouma/jiashanxia/service/CommissionRecordServiceTest.java

@@ -1,6 +1,8 @@
 package com.izouma.jiashanxia.service;
 
+import com.izouma.jiashanxia.domain.CommissionRecord;
 import com.izouma.jiashanxia.dto.CommissionRecordDTO;
+import com.izouma.jiashanxia.dto.PageQuery;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -8,6 +10,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.List;
+import java.util.Map;
 
 
 @SpringBootTest
@@ -16,9 +19,19 @@ public class CommissionRecordServiceTest {
 
     @Autowired
     private CommissionRecordService commissionRecordService;
+
     @Test
     public void my() {
         List<CommissionRecordDTO> my = commissionRecordService.my(497L);
         my.forEach(System.out::println);
     }
+
+    @Test
+    public void test() {
+        PageQuery pageQuery = new PageQuery();
+        Map<String, Object> query = pageQuery.getQuery();
+        query.put("transactionType", "REFUND");
+        List<CommissionRecord> content = commissionRecordService.backAll2(pageQuery).getContent();
+        content.forEach(System.out::println);
+    }
 }

+ 14 - 4
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -15,6 +15,7 @@ import org.springframework.test.context.junit4.SpringRunner;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 
@@ -30,7 +31,7 @@ public class UserServiceTest {
     @Test
     public void myPromotion() {
 //        Page<PromotionDTO> users = userService.myPromotion(new PageQuery(), 40L);
-        Set<User> users = userService.myPromotion( 125L);
+        Set<User> users = userService.myPromotion(125L);
         users.forEach(System.out::println);
     }
 
@@ -44,10 +45,10 @@ public class UserServiceTest {
     public void test2() {
 //        System.out.println(userService.overview(102L));
 //        System.out.println(1 * 0.01);
-        List<Integer> newList = CollUtil.newArrayList(1,2,3,4,5,6,7);
+        List<Integer> newList = CollUtil.newArrayList(1, 2, 3, 4, 5, 6, 7);
 //        List<Integer> newList1= new ArrayList<>(newList);
-        List<Integer> oldList = CollUtil.newArrayList(4,5,6,7,8,9,10);
-        List<Integer> oldList1= new ArrayList<>(oldList);
+        List<Integer> oldList = CollUtil.newArrayList(4, 5, 6, 7, 8, 9, 10);
+        List<Integer> oldList1 = new ArrayList<>(oldList);
         System.out.println(oldList.removeAll(newList));
         System.out.println(newList);
         System.out.println(oldList);
@@ -56,4 +57,13 @@ public class UserServiceTest {
         System.out.println(newList);
         System.out.println(oldList1);
     }
+
+    @Test
+    public void test3() {
+        PageQuery pageQuery = new PageQuery();
+        Map<String, Object> query = pageQuery.getQuery();
+        query.put("parent", 908L);
+        Page<User> children = userService.children(pageQuery);
+        children.getContent().forEach(System.out::println);
+    }
 }