licailing 5 år sedan
förälder
incheckning
3c1ccdaaae

+ 8 - 1
src/main/java/com/izouma/jiashanxia/domain/User.java

@@ -12,6 +12,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 import org.hibernate.annotations.BatchSize;
 import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Pattern;
@@ -84,8 +86,13 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty("是否微信授权")
     @ApiModelProperty("是否微信授权")
     private boolean wxAuthorized;
     private boolean wxAuthorized;
 
 
-    private boolean isVip;
+    private Boolean isVip;
 
 
     @Transient
     @Transient
     private String sessionKey;
     private String sessionKey;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "companyId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private Company company;
 }
 }

+ 18 - 0
src/main/java/com/izouma/jiashanxia/dto/EmployeeDTO.java

@@ -0,0 +1,18 @@
+package com.izouma.jiashanxia.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class EmployeeDTO {
+    private Long          id;
+    private String        nickname;
+    private String        avatar;
+    private LocalDateTime createdAt;
+    private String        companyName;
+}

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

@@ -26,5 +26,7 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
 
     List<User> findAllByParent(Long parent);
     List<User> findAllByParent(Long parent);
 
 
+    List<User> findAllByParentIn(Iterable<Long> parent);
+
     List<User> findAllByCompanyId(Long companyId);
     List<User> findAllByCompanyId(Long companyId);
 }
 }

+ 10 - 1
src/main/java/com/izouma/jiashanxia/service/CompanyService.java

@@ -4,15 +4,19 @@ import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.CompanyRepo;
 import com.izouma.jiashanxia.repo.CompanyRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
+import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
@@ -21,7 +25,12 @@ public class CompanyService {
     private CompanyRepo companyRepo;
     private CompanyRepo companyRepo;
     private UserRepo    userRepo;
     private UserRepo    userRepo;
 
 
-    public Page<Company> all(PageQuery pageQuery) {
+    public Page<Company> all(PageQuery pageQuery, User user) {
+        Set<Authority> authorities = user.getAuthorities();
+        if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN)) && authorities.contains(Authority.get(AuthorityName.ROLE_CREATOR))) {
+            Map<String, Object> query = pageQuery.getQuery();
+            query.put("userId", user.getId());
+        }
         return companyRepo.findAll(JpaUtils.toSpecification(pageQuery, Company.class), JpaUtils.toPageRequest(pageQuery));
         return companyRepo.findAll(JpaUtils.toSpecification(pageQuery, Company.class), JpaUtils.toPageRequest(pageQuery));
     }
     }
 
 

+ 3 - 10
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -1,6 +1,5 @@
 package com.izouma.jiashanxia.service;
 package com.izouma.jiashanxia.service;
 
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.*;
@@ -12,19 +11,13 @@ import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.*;
 import com.izouma.jiashanxia.repo.*;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
-import org.apache.poi.ss.formula.functions.T;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 
 
@@ -35,7 +28,6 @@ public class OrderInfoService {
     private OrderInfoRepo        orderInfoRepo;
     private OrderInfoRepo        orderInfoRepo;
     private SetMealRepo          setMealRepo;
     private SetMealRepo          setMealRepo;
     private SetGoodsRepo         setGoodsRepo;
     private SetGoodsRepo         setGoodsRepo;
-    private UserSetRepo          userSetRepo;
     private UserRepo             userRepo;
     private UserRepo             userRepo;
     private SysConfigService     sysConfigService;
     private SysConfigService     sysConfigService;
     private CommissionRecordRepo commissionRecordRepo;
     private CommissionRecordRepo commissionRecordRepo;
@@ -142,8 +134,9 @@ public class OrderInfoService {
         }
         }
         if (!flag) {
         if (!flag) {
             // 是否购买了套餐
             // 是否购买了套餐
-            List<UserSet> parentSets = userSetRepo.findAllByUserId(parent);
-            if (CollUtil.isNotEmpty(parentSets)) {
+//            List<UserSet> parentSets = userSetRepo.findAllByUserId(parent);
+//            if (CollUtil.isNotEmpty(parentSets)) {
+            if (parentUser.getIsVip()) {
                 flag = true;
                 flag = true;
             }
             }
         }
         }

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

@@ -7,8 +7,10 @@ import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.config.Constants;
 import com.izouma.jiashanxia.config.Constants;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.dto.EmployeeDTO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.UserRegister;
 import com.izouma.jiashanxia.dto.UserRegister;
+import com.izouma.jiashanxia.enums.AuthorityName;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.security.Authority;
@@ -31,10 +33,12 @@ import org.springframework.data.domain.Page;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.persistence.criteria.Predicate;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 @Service
 @Service
 @Slf4j
 @Slf4j
@@ -208,4 +212,65 @@ public class UserService {
         }
         }
         userRepo.save(user);
         userRepo.save(user);
     }
     }
+
+    /*
+    我的推广
+    */
+    public List<User> myPromotion(Long userId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        List<User> users = new ArrayList<>();
+        // 如果是企业创始人,查出下级所有推广
+        if (user.getTeamFounder()) {
+            List<User> employees = userRepo.findAllByCompanyId(user.getCompanyId());
+            List<Long> collect = employees.stream().map(User::getId).collect(Collectors.toList());
+            users.addAll(userRepo.findAllByParentIn(collect));
+        }
+        users.addAll(userRepo.findAllByParent(userId));
+        return users;
+    }
+
+    /*
+    我的推广
+    */
+    public Page<User> myPromotion(PageQuery pageQuery, Long userId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+
+        return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
+            if (user.getTeamFounder()) {
+                List<User> employees = userRepo.findAllByCompanyId(user.getCompanyId());
+                List<Long> collect = employees.stream().map(User::getId).collect(Collectors.toList());
+                and.add(root.get("parent").in(collect));
+            } else {
+                and.add(criteriaBuilder.equal(root.get("parent"), userId));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    我的员工
+    */
+    public Page<User> myEmployee(PageQuery pageQuery, User user) {
+//        User user = userRepo.findById(id).orElseThrow(new BusinessException("无用户"));
+        Set<Authority> authorities = user.getAuthorities();
+        // 管理员返回所有
+        if (authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN))) {
+            return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+                List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
+                and.add(root.get("companyId").isNotNull());
+                return criteriaBuilder.and(and.toArray(new Predicate[0]));
+            }), JpaUtils.toPageRequest(pageQuery));
+        }
+
+        if (ObjectUtil.isNull(user.getCompanyId())) {
+            throw new BusinessException("无企业");
+        }
+        // 返回企业员工
+        return userRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, User.class, root, criteriaQuery, criteriaBuilder);
+            and.add(criteriaBuilder.equal(root.get("companyId"), user.getCompanyId()));
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
 }
 }

+ 1 - 1
src/main/java/com/izouma/jiashanxia/service/UserSetFlowService.java

@@ -42,7 +42,7 @@ public class UserSetFlowService {
     public Page<UserSetFlow> writeOffAll(PageQuery pageQuery) {
     public Page<UserSetFlow> writeOffAll(PageQuery pageQuery) {
         return userSetFlowRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
         return userSetFlowRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, UserSetFlow.class, root, criteriaQuery, criteriaBuilder);
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, UserSetFlow.class, root, criteriaQuery, criteriaBuilder);
-            and.add(criteriaBuilder.equal(root.join("type"), FlowType.WRITE_OFF));
+            and.add(criteriaBuilder.equal(root.get("type"), FlowType.WRITE_OFF));
             if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
             if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
                 List<Predicate> or = new ArrayList<>();
                 List<Predicate> or = new ArrayList<>();
                 or.add(and.get(and.size() - 1));
                 or.add(and.get(and.size() - 1));

+ 10 - 12
src/main/java/com/izouma/jiashanxia/service/UserSetService.java

@@ -9,6 +9,7 @@ import com.izouma.jiashanxia.domain.UserSetFlow;
 import com.izouma.jiashanxia.dto.GoodsDTO;
 import com.izouma.jiashanxia.dto.GoodsDTO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.FlowType;
 import com.izouma.jiashanxia.enums.FlowType;
+import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.repo.UserSetFlowRepo;
 import com.izouma.jiashanxia.repo.UserSetFlowRepo;
 import com.izouma.jiashanxia.repo.UserSetRepo;
 import com.izouma.jiashanxia.repo.UserSetRepo;
@@ -25,9 +26,9 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @AllArgsConstructor
 public class UserSetService {
 public class UserSetService {
 
 
-    private UserSetRepo userSetRepo;
+    private UserSetRepo     userSetRepo;
     private UserSetFlowRepo userSetFlowRepo;
     private UserSetFlowRepo userSetFlowRepo;
-    private UserRepo userRepo;
+    private UserRepo        userRepo;
 
 
     public Page<UserSet> all(PageQuery pageQuery) {
     public Page<UserSet> all(PageQuery pageQuery) {
         return userSetRepo.findAll(JpaUtils.toSpecification(pageQuery, UserSet.class), JpaUtils.toPageRequest(pageQuery));
         return userSetRepo.findAll(JpaUtils.toSpecification(pageQuery, UserSet.class), JpaUtils.toPageRequest(pageQuery));
@@ -50,6 +51,7 @@ public class UserSetService {
             if (ObjectUtil.isNotEmpty(goods)) {
             if (ObjectUtil.isNotEmpty(goods)) {
                 goods.setNum(goods.getNum() + setGoods.getNum());
                 goods.setNum(goods.getNum() + setGoods.getNum());
                 goods.setRemark(setGoods.getRemark());
                 goods.setRemark(setGoods.getRemark());
+
             } else {
             } else {
                 goods = UserSet.builder()
                 goods = UserSet.builder()
                         .userId(userId)
                         .userId(userId)
@@ -60,7 +62,12 @@ public class UserSetService {
             }
             }
             userSetRepo.save(goods);
             userSetRepo.save(goods);
         });
         });
-
+        // 设置用户为vip
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        if (!user.getIsVip()) {
+            user.setIsVip(true);
+            userRepo.save(user);
+        }
         // 记录套餐流水
         // 记录套餐流水
         List<GoodsDTO> goodsDTOS = JSONObject.parseArray(JSONObject.toJSONString(setGoodsList), GoodsDTO.class);
         List<GoodsDTO> goodsDTOS = JSONObject.parseArray(JSONObject.toJSONString(setGoodsList), GoodsDTO.class);
         userSetFlowRepo.save(UserSetFlow.builder()
         userSetFlowRepo.save(UserSetFlow.builder()
@@ -69,13 +76,4 @@ public class UserSetService {
                 .content(JSONObject.toJSONString(goodsDTOS))
                 .content(JSONObject.toJSONString(goodsDTOS))
                 .build());
                 .build());
     }
     }
-
-    /*
-    我的推广
-     */
-    public List<User> myPromotion(Long userId) {
-        List<User> children = userRepo.findAllByParent(userId);
-        return null;
-    }
-
 }
 }

+ 14 - 2
src/main/java/com/izouma/jiashanxia/web/CompanyController.java

@@ -7,6 +7,7 @@ import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.CompanyRepo;
 import com.izouma.jiashanxia.repo.CompanyRepo;
 import com.izouma.jiashanxia.utils.ObjUtils;
 import com.izouma.jiashanxia.utils.ObjUtils;
+import com.izouma.jiashanxia.utils.SecurityUtils;
 import com.izouma.jiashanxia.utils.excel.ExcelUtils;
 import com.izouma.jiashanxia.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -37,10 +38,10 @@ public class CompanyController extends BaseController {
     }
     }
 
 
 
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasAnyRole('ADMIN','CREATOR')")
     @PostMapping("/all")
     @PostMapping("/all")
     public Page<Company> all(@RequestBody PageQuery pageQuery) {
     public Page<Company> all(@RequestBody PageQuery pageQuery) {
-        return companyService.all(pageQuery);
+        return companyService.all(pageQuery, SecurityUtils.getAuthenticatedUser());
     }
     }
 
 
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
@@ -71,5 +72,16 @@ public class CompanyController extends BaseController {
         return companyService.employee(userId);
         return companyService.employee(userId);
     }
     }
 
 
+    @PostMapping("/addEmp")
+    @ApiOperation("添加员工")
+    public void addEmp(@RequestParam Long userId, @RequestParam Long companyId) {
+        companyService.addUser(userId, companyId);
+    }
+
+    @PostMapping("/removeEmp")
+    @ApiOperation("添加员工")
+    public void removeEmp(@RequestParam Long userId, @RequestParam Long companyId) {
+        companyService.removeUser(userId, companyId);
+    }
 }
 }
 
 

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

@@ -149,4 +149,26 @@ public class UserController extends BaseController {
     public void updateUserInfo(@RequestBody Map<String, Object> map) {
     public void updateUserInfo(@RequestBody Map<String, Object> map) {
         userService.updateUserInfo(map);
         userService.updateUserInfo(map);
     }
     }
+
+    @GetMapping("/myPromotion")
+    @ApiOperation("我的推广列表")
+    public List<User> myPromotion() {
+        return userService.myPromotion(SecurityUtils.getAuthenticatedUser().getId());
+    }
+
+    @PostMapping("/promotion")
+    @ApiOperation("企业端推广列表")
+    public Page<User> promotion(@RequestBody PageQuery pageQuery) {
+        Map<String, Object> query = pageQuery.getQuery();
+        String userId = String.valueOf(query.get("userId"));
+        query.remove("userId");
+        return userService.myPromotion(pageQuery, Long.parseLong(userId));
+    }
+
+    @PreAuthorize("hasAnyRole('ADMIN','CREATOR')")
+    @PostMapping("/myEmployee")
+    @ApiOperation("员工列表")
+    public Page<User> myEmployee(@RequestBody PageQuery pageQuery) {
+        return userService.myEmployee(pageQuery, SecurityUtils.getAuthenticatedUser());
+    }
 }
 }

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

@@ -71,6 +71,22 @@ const router = new Router({
                         title: '菜单权限'
                         title: '菜单权限'
                     }
                     }
                 },
                 },
+                {
+                    path: '/promotionList',
+                    name: 'promotionList',
+                    component: () => import(/* webpackChunkName: "userEdit" */ '@/views/PromotionList.vue'),
+                    meta: {
+                        title: '推广列表'
+                    }
+                },
+                {
+                    path: '/employeeList',
+                    name: 'employeeList',
+                    component: () => import(/* webpackChunkName: "userEdit" */ '@/views/EmployeeList.vue'),
+                    meta: {
+                        title: '员工列表'
+                    }
+                },
                 {
                 {
                     path: '/userEdit',
                     path: '/userEdit',
                     name: 'userEdit',
                     name: 'userEdit',

+ 10 - 22
src/main/vue/src/views/CompanyList.vue

@@ -29,9 +29,9 @@
             <el-table-column prop="amount" label="团队余额"> </el-table-column>
             <el-table-column prop="amount" label="团队余额"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
-                    <el-button @click="showEmployee(row)" type="success" size="mini" plain>员工</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <el-button size="mini" @click="handleCommand(row.userId)">推广</el-button>
+                    <!--<el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>
@@ -55,13 +55,6 @@
                 :total="totalElements"
                 :total="totalElements"
             >
             >
             </el-pagination>
             </el-pagination>
-
-            <el-dialog :visible.sync="userDialog" width="400px" title="员工列表">
-                <el-table :data="employee">
-                    <el-table-column label="昵称" prop="nickname"></el-table-column>
-                    <el-table-column label="时间" prop="createdAt"></el-table-column>
-                </el-table>
-            </el-dialog>
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
@@ -78,11 +71,11 @@ export default {
             search: '',
             search: '',
             url: '/company/all',
             url: '/company/all',
             downloading: false,
             downloading: false,
-            userDialog: false,
             employee: []
             employee: []
         };
         };
     },
     },
     computed: {
     computed: {
+        ...mapState(['userInfo']),
         selection() {
         selection() {
             return this.$refs.table.selection.map(i => i.id);
             return this.$refs.table.selection.map(i => i.id);
         }
         }
@@ -161,18 +154,13 @@ export default {
                     }
                     }
                 });
                 });
         },
         },
-        showEmployee(row) {
-            this.userDialog = true;
-            this.$http
-                .post('/user/employee', {
-                    companyId: row.id
-                })
-                .then(res => {
-                    this.employee = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                });
+        handleCommand(id) {
+            this.$router.push({
+                path: '/promotionList',
+                query: {
+                    id: id
+                }
+            });
         }
         }
     }
     }
 };
 };

+ 145 - 0
src/main/vue/src/views/EmployeeList.vue

@@ -0,0 +1,145 @@
+<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="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="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/myEmployee',
+            downloading: false
+        };
+    },
+    computed: {
+        ...mapState(['userInfo']),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        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>

+ 1 - 1
src/main/vue/src/views/OrderInfoList.vue

@@ -12,7 +12,7 @@
                 class="filter-item"
                 class="filter-item"
                 >导出EXCEL
                 >导出EXCEL
             </el-button>
             </el-button>
-            <el-select v-model="status" multiple clearable @change="getData">
+            <el-select v-model="status" multiple clearable @change="getData" placeholder="请选择订单状态">
                 <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label">
                 <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label">
                 </el-option>
                 </el-option>
             </el-select>
             </el-select>

+ 143 - 0
src/main/vue/src/views/PromotionList.vue

@@ -0,0 +1,143 @@
+<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 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/promotion',
+            downloading: false
+        };
+    },
+    computed: {
+        ...mapState(['userInfo']),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return {
+                search: this.search,
+                query: {
+                    userId: this.$route.query.id || this.userInfo.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>

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

@@ -37,7 +37,7 @@
                     <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name">
                     <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name">
                     </el-option>
                     </el-option>
                 </el-select>
                 </el-select>
-                <el-button style="margin-left: 20px" @click="showDialog = true" v-if="!formData.isTeamFounder">
+                <el-button style="margin-left: 20px" @click="showDialog = true" v-if="!formData.teamFounder">
                     新建团队
                     新建团队
                 </el-button>
                 </el-button>
                 <el-button @click="showEmployee" v-else>
                 <el-button @click="showEmployee" v-else>

+ 1 - 0
src/main/vue/src/views/UserList.vue

@@ -38,6 +38,7 @@
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
             <el-table-column prop="amount" label="余额"> </el-table-column>
             <el-table-column prop="amount" label="余额"> </el-table-column>
+            <el-table-column prop="createdAt" label="注册时间" show-overflow-tooltip> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right">
             <el-table-column label="操作" align="center" fixed="right">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>

+ 1 - 1
src/main/vue/src/views/UserSetFlowList.vue

@@ -27,7 +27,7 @@
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
             <el-table-column prop="user.nickname" label="被核销人"> </el-table-column>
             <el-table-column prop="user.nickname" label="被核销人"> </el-table-column>
             <el-table-column prop="writeOffUser.nickname" label="核销人"> </el-table-column>
             <el-table-column prop="writeOffUser.nickname" label="核销人"> </el-table-column>
-            <el-table-column prop="createdAt" 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">
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>

+ 1 - 1
src/main/vue/src/views/WithdrawList.vue

@@ -31,11 +31,11 @@
             <el-table-column prop="id" label="ID" width="80"> </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="user.nickname" label="昵称"> </el-table-column>
             <el-table-column prop="amount" label="提现金额"> </el-table-column>
             <el-table-column prop="amount" label="提现金额"> </el-table-column>
-            <el-table-column prop="auditTime" label="审核时间"> </el-table-column>
             <el-table-column prop="payMethod" label="提现方式" :formatter="payMethodFormatter"> </el-table-column>
             <el-table-column prop="payMethod" label="提现方式" :formatter="payMethodFormatter"> </el-table-column>
             <el-table-column prop="status" label="提现状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column prop="status" label="提现状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column prop="account" label="账号"> </el-table-column>
             <el-table-column prop="account" label="账号"> </el-table-column>
             <el-table-column prop="realName" label="真实姓名"> </el-table-column>
             <el-table-column prop="realName" label="真实姓名"> </el-table-column>
+            <el-table-column prop="auditTime" label="审核时间" show-overflow-tooltip> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right" min-width="200">
             <el-table-column label="操作" align="center" fixed="right" min-width="200">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>

+ 35 - 0
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -0,0 +1,35 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.UserRepo;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Page;
+import org.springframework.test.context.junit4.SpringRunner;
+
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class UserServiceTest {
+
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private UserRepo userRepo;
+
+    @Test
+    public void myPromotion() {
+        Page<User> users = userService.myPromotion(new PageQuery(), 40L);
+        users.getContent().forEach(System.out::println);
+    }
+
+    @Test
+    public void test1() {
+        User user = userRepo.findById(1L).orElseThrow(new BusinessException("无用户"));
+        System.out.println(userService.myEmployee(new PageQuery(), user).getContent());
+    }
+}

+ 1 - 2
src/test/java/com/izouma/jiashanxia/service/UserSetServiceTest.java

@@ -1,13 +1,12 @@
 package com.izouma.jiashanxia.service;
 package com.izouma.jiashanxia.service;
 
 
+
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.context.junit4.SpringRunner;
 
 
-
-
 @SpringBootTest
 @SpringBootTest
 @RunWith(SpringRunner.class)
 @RunWith(SpringRunner.class)
 public class UserSetServiceTest {
 public class UserSetServiceTest {

+ 4 - 0
src/test/java/com/izouma/jiashanxia/service/WithdrawServiceTest.java

@@ -20,4 +20,8 @@ public class WithdrawServiceTest {
     public void apply() {
     public void apply() {
         System.out.println(withdrawService.apply(40L, new BigDecimal("100"), PayMethod.WEIXIN, "xxx", "xxx"));
         System.out.println(withdrawService.apply(40L, new BigDecimal("100"), PayMethod.WEIXIN, "xxx", "xxx"));
     }
     }
+
+    @Test
+    public void test() {
+    }
 }
 }