Browse Source

套餐产品/企业修改

licailing 5 years ago
parent
commit
520b5194cf
28 changed files with 399 additions and 175 deletions
  1. 6 1
      src/main/java/com/izouma/jiashanxia/domain/Company.java
  2. 3 0
      src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java
  3. 4 8
      src/main/java/com/izouma/jiashanxia/domain/PackageGoods.java
  4. 2 0
      src/main/java/com/izouma/jiashanxia/dto/CompanyDTO.java
  5. 3 2
      src/main/java/com/izouma/jiashanxia/dto/OrderInfoVO.java
  6. 19 0
      src/main/java/com/izouma/jiashanxia/dto/PackageGoodsDTO.java
  7. 47 0
      src/main/java/com/izouma/jiashanxia/dto/PackageGoodsVO.java
  8. 10 0
      src/main/java/com/izouma/jiashanxia/repo/PackageGoodsRepo.java
  9. 2 0
      src/main/java/com/izouma/jiashanxia/service/CommissionRecordService.java
  10. 54 1
      src/main/java/com/izouma/jiashanxia/service/CompanyService.java
  11. 1 0
      src/main/java/com/izouma/jiashanxia/service/FeedbackService.java
  12. 21 25
      src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java
  13. 30 1
      src/main/java/com/izouma/jiashanxia/service/PackageService.java
  14. 9 9
      src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java
  15. 4 3
      src/main/java/com/izouma/jiashanxia/service/UserPackageService.java
  16. 1 0
      src/main/java/com/izouma/jiashanxia/service/UserService.java
  17. 1 0
      src/main/java/com/izouma/jiashanxia/service/WithdrawService.java
  18. 2 37
      src/main/java/com/izouma/jiashanxia/web/CompanyController.java
  19. 6 1
      src/main/java/com/izouma/jiashanxia/web/PackageController.java
  20. 26 5
      src/main/java/com/izouma/jiashanxia/web/PackageGoodsController.java
  21. 11 0
      src/main/java/com/izouma/jiashanxia/web/UserController.java
  22. 2 0
      src/main/java/com/izouma/jiashanxia/web/UserPackageController.java
  23. 33 11
      src/main/vue/src/views/CompanyEdit.vue
  24. 78 1
      src/main/vue/src/views/CompanyList.vue
  25. 4 1
      src/main/vue/src/views/EmployeeList.vue
  26. 15 12
      src/main/vue/src/views/OrderInfoEdit.vue
  27. 3 55
      src/main/vue/src/views/UserEdit.vue
  28. 2 2
      src/test/java/com/izouma/jiashanxia/service/OrderInfoServiceTest.java

+ 6 - 1
src/main/java/com/izouma/jiashanxia/domain/Company.java

@@ -8,7 +8,10 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.List;
 
 
 @Entity
@@ -17,7 +20,7 @@ import java.math.BigDecimal;
 @Builder
 @Data
 @ApiModel(value = "企业表")
-public class Company extends BaseEntity {
+public class Company extends BaseEntity implements Serializable {
 
     private Long userId;
 
@@ -26,4 +29,6 @@ public class Company extends BaseEntity {
 
     private BigDecimal amount;
 
+    @Transient
+    private List<Long> employee;
 }

+ 3 - 0
src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java

@@ -38,6 +38,9 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "订单状态")
     private OrderInfoStatus status;
 
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
     @Searchable
     @ApiModelProperty(value = "订单号")
     private String orderNumber;

+ 4 - 8
src/main/java/com/izouma/jiashanxia/domain/PackageGoods.java

@@ -25,20 +25,16 @@ public class PackageGoods extends BaseEntity {
 
     private Long goodsInfoId;
 
-    private String name;
+//    private String name;
 
-    private String unit;
+//    private String unit;
 
     @ApiModelProperty(value = "数量")
     private Integer num;
 
-    @ApiModelProperty(value = "价格")
-    private BigDecimal price;
+//    @ApiModelProperty(value = "价格")
+//    private BigDecimal price;
 
     private String remark;
 
-//    @ManyToOne(fetch = FetchType.LAZY)
-//    @JoinColumn(name = "goodsInfoId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-//    @NotFound(action = NotFoundAction.IGNORE)
-//    private GoodsInfo goodsInfo;
 }

+ 2 - 0
src/main/java/com/izouma/jiashanxia/dto/CompanyDTO.java

@@ -26,4 +26,6 @@ public class CompanyDTO {
     private BigDecimal amount;
 
     private List<Long> employee;
+
+    private boolean del;
 }

+ 3 - 2
src/main/java/com/izouma/jiashanxia/dto/OrderInfoVO.java

@@ -1,7 +1,6 @@
 package com.izouma.jiashanxia.dto;
 
 import com.izouma.jiashanxia.domain.Package;
-import com.izouma.jiashanxia.domain.PackageGoods;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
@@ -54,5 +53,7 @@ public class OrderInfoVO {
 
     private Package aPackage;
 
-    private List<PackageGoods> goods;
+    private LocalDateTime createdAt;
+
+    private List<PackageGoodsDTO> goods;
 }

+ 19 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageGoodsDTO.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.dto;
+
+import java.math.BigDecimal;
+
+public interface PackageGoodsDTO {
+    Long getId();
+
+    Long getPackageId();
+
+    String getName();
+
+    String getUnit();
+
+    String getRemark();
+
+    long getNum();
+
+    BigDecimal getPrice();
+}

+ 47 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageGoodsVO.java

@@ -0,0 +1,47 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.PackageGoods;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "套餐商品")
+public class PackageGoodsVO {
+    private Long id;
+
+    private Long packageId;
+
+    private Long goodsInfoId;
+
+    private String name;
+
+    private String unit;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "价格")
+    private BigDecimal price;
+
+    private String remark;
+
+    public PackageGoodsVO(PackageGoods packageGoods) {
+        this.id = packageGoods.getId();
+        this.packageId = packageGoods.getPackageId();
+        this.goodsInfoId = packageGoods.getGoodsInfoId();
+        this.num = packageGoods.getNum();
+        this.remark = packageGoods.getRemark();
+        this.price = BigDecimal.ZERO;
+    }
+
+}

+ 10 - 0
src/main/java/com/izouma/jiashanxia/repo/PackageGoodsRepo.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.repo;
 
 import com.izouma.jiashanxia.domain.PackageGoods;
+import com.izouma.jiashanxia.dto.PackageGoodsDTO;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -16,4 +17,13 @@ public interface PackageGoodsRepo extends JpaRepository<PackageGoods, Long>, Jpa
     void softDelete(Long id);
 
     List<PackageGoods> findAllByPackageId(Long packageId);
+
+    @Query(value = "select gi.name,gi.unit," +
+            "gi.id AS id," +
+            "ifnull(pg.num, 0) AS num ," +
+            "ifnull(pg.num * gi.price, 0) AS price " +
+            "from goods_info AS gi " +
+            "left join package_goods AS pg on gi.id = pg.goods_info_id and pg.package_id = ?1 " +
+            "where gi.del = 0 and pg.del = 0", nativeQuery = true)
+    List<PackageGoodsDTO> packageGoods(Long packageId);
 }

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

@@ -21,6 +21,7 @@ public class CommissionRecordService {
     private CommissionRecordRepo commissionRecordRepo;
 
     public Page<CommissionRecord> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return commissionRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, CommissionRecord.class), JpaUtils.toPageRequest(pageQuery));
     }
 
@@ -28,6 +29,7 @@ public class CommissionRecordService {
     后台列表
      */
     public Page<CommissionRecord> backAll(PageQuery pageQuery, User user) {
+        pageQuery.setSort("createdAt,desc");
         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();

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

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
@@ -10,10 +11,10 @@ import com.izouma.jiashanxia.repo.CompanyRepo;
 import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.security.Authority;
 import com.izouma.jiashanxia.utils.JpaUtils;
+import com.izouma.jiashanxia.utils.ObjUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -26,6 +27,7 @@ public class CompanyService {
     private UserRepo    userRepo;
 
     public Page<Company> all(PageQuery pageQuery, User user) {
+        pageQuery.setSort("createdAt,desc");
         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();
@@ -77,4 +79,55 @@ public class CompanyService {
             }
         });
     }
+
+    /*
+    新建企业
+     */
+    public Company save(Company record) {
+        // 团队权限
+        Authority creator = Authority.get(AuthorityName.ROLE_CREATOR);
+        // 修改
+        if (record.getId() != null) {
+            Company orig = companyRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            // 更换团队管理人
+            if (!record.getUserId().equals(orig.getUserId())) {
+                userRepo.findById(orig.getUserId()).ifPresent(user1 -> {
+                    user1.setTeamFounder(false);
+                    Set<Authority> authorities1 = user1.getAuthorities();
+                    authorities1.remove(creator);
+                    userRepo.save(user1);
+                });
+                // 新团队管理人增加权限
+                this.teamFounder(record.getUserId(), creator, record.getId());
+            }
+            ObjUtils.merge(orig, record);
+            List<Long> employee = record.getEmployee();
+            // 员工加入团队
+            if (CollUtil.isNotEmpty(employee)) {
+                this.batchEmployee(record.getEmployee(), record.getId());
+            }
+            return companyRepo.save(orig);
+        }
+
+        // 增加
+        Company save = companyRepo.save(record);
+        this.teamFounder(save.getUserId(), creator, save.getId());
+        return save;
+    }
+
+    /*
+    修改团队权限
+     */
+    public void teamFounder(Long userId, Authority creator, Long companyId) {
+        // 新团队管理人增加权限
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        Set<Authority> authorities = user.getAuthorities();
+        if (!authorities.contains(creator) || !user.getTeamFounder()) {
+            authorities.add(creator);
+            user.setTeamFounder(true);
+            user.setCompanyId(companyId);
+            userRepo.save(user);
+        }
+    }
+
 }

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

@@ -15,6 +15,7 @@ public class FeedbackService {
     private FeedbackRepo feedbackRepo;
 
     public Page<Feedback> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return feedbackRepo.findAll(JpaUtils.toSpecification(pageQuery, Feedback.class), JpaUtils.toPageRequest(pageQuery));
     }
 }

+ 21 - 25
src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.domain.Package;
 import com.izouma.jiashanxia.dto.OrderInfoVO;
+import com.izouma.jiashanxia.dto.PackageGoodsDTO;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
@@ -23,10 +24,7 @@ import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -45,6 +43,7 @@ public class OrderInfoService {
     private WithdrawService      withdrawService;
 
     public Page<OrderInfo> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
     }
 
@@ -52,6 +51,7 @@ public class OrderInfoService {
     后台列表
      */
     public Page<OrderInfo> backAll(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = JpaUtils.toPredicates(pageQuery, OrderInfo.class, root, criteriaQuery, criteriaBuilder);
             if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
@@ -78,6 +78,7 @@ public class OrderInfoService {
                 .orderNumber(localTime + num)
                 .price(setInfo.getAmount())
                 .name(setInfo.getName())
+                .num(1)
                 .build();
         return orderInfoRepo.save(order);
     }
@@ -104,7 +105,7 @@ public class OrderInfoService {
             userRepo.save(user);
         }
         // 加入套餐商品
-        userPackageService.joinUserPackage(userId, setGoodsList);
+        userPackageService.joinUserPackage(userId, setGoodsList, 1);
 
         // 用户id和上级id相同
         if (user.getParent() != null && !userId.equals(user.getParent())) {
@@ -168,7 +169,6 @@ public class OrderInfoService {
                 .transactionType(TransactionType.PROMOTE)
                 .transactionId(transactionId)
                 .build());
-
     }
 
     /*
@@ -201,6 +201,9 @@ public class OrderInfoService {
     用户订单
      */
     public Page<OrderInfoVO> my(Pageable pageable, Long userId, List<OrderInfoStatus> status) {
+        Map<Long, Package> packageMap = packageRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(Package::getId, aPackage -> aPackage));
         return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
             List<Predicate> and = new ArrayList<>();
             and.add(criteriaBuilder.equal(root.get("userId"), userId));
@@ -211,17 +214,16 @@ public class OrderInfoService {
                 );
                 and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
             }
+            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("createdAt")));
             return criteriaBuilder.and(and.toArray(new Predicate[0]));
-        }), pageable).map(this::toVo);
-    }
-
-    public OrderInfoVO toVo(OrderInfo orderInfo) {
-        OrderInfoVO vo = new OrderInfoVO();
-        BeanUtil.copyProperties(orderInfo, vo);
-        vo.setAPackage(packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐")));
-        List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
-        vo.setGoods(packageGoods);
-        return vo;
+        }), pageable).map(orderInfo -> {
+            OrderInfoVO vo = new OrderInfoVO();
+            BeanUtil.copyProperties(orderInfo, vo);
+            vo.setAPackage(packageMap.get(orderInfo.getPackageId()));
+            List<PackageGoodsDTO> packageGoodsDTOS = packageGoodsRepo.packageGoods(orderInfo.getPackageId());
+            vo.setGoods(packageGoodsDTOS);
+            return vo;
+        });
     }
 
     public List<OrderInfoVO> toVO(List<OrderInfo> orderInfos) {
@@ -238,15 +240,9 @@ public class OrderInfoService {
             OrderInfoVO vo = new OrderInfoVO();
             BeanUtil.copyProperties(orderInfo, vo);
             vo.setAPackage(packageMap.get(orderInfo.getPackageId()));
-            List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
-//            List<GoodsVO> goodsVOS = new ArrayList<>();
-//            packageGoods.forEach(goods -> {
-//                goodsVOS.add(GoodsVO.builder()
-//                        .name(goodsMap.get(goods.getGoodsInfoId()))
-//                        .num(goods.getNum().longValue())
-//                        .build());
-//            });
-            vo.setGoods(packageGoods);
+//            List<PackageGoods> packageGoods = packageGoodsRepo.findAllByPackageId(orderInfo.getPackageId());
+            List<PackageGoodsDTO> packageGoodsDTOS = packageGoodsRepo.packageGoods(orderInfo.getPackageId());
+            vo.setGoods(packageGoodsDTOS);
             orderInfoVOS.add(vo);
         });
         return orderInfoVOS;

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

@@ -57,6 +57,7 @@ public class PackageService {
                 .payMethod(PayMethod.OFFLINE)
                 .name(set.getName())
                 .orderNumber(localTime + num)
+                .num(1)
                 .status(OrderInfoStatus.OFFLINE_PAID)
                 .build());
 
@@ -64,7 +65,7 @@ public class PackageService {
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
         // 加入套餐商品
         List<PackageGoods> setGoodsList = packageGoodsRepo.findAllByPackageId(packageId);
-        userPackageService.joinUserPackage(userId, setGoodsList);
+        userPackageService.joinUserPackage(userId, setGoodsList, 1);
 
         // 新建公司
         Company company = companyRepo.findByUserId(userId);
@@ -88,4 +89,32 @@ public class PackageService {
         }
     }
 
+    /*
+    充值
+    冲谁头上
+     */
+    public void recharge(Long userId, Long packageId, Integer num) {
+        Package set = packageRepo.findById(packageId).orElseThrow(new BusinessException("无套餐"));
+        if (!PackageType.TEAM.equals(set.getType())) {
+            throw new BusinessException("不是团队套餐");
+        }
+        // 新建订单
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String localTime = df.format(LocalDateTime.now());
+        String orderNumber = String.format("%05d", orderInfoRepo.orderNum() + 1);
+        orderInfoRepo.save(OrderInfo.builder()
+                .packageId(packageId)
+                .userId(userId)
+                .payMethod(PayMethod.OFFLINE)
+                .name(set.getName())
+                .orderNumber(localTime + orderNumber)
+                .status(OrderInfoStatus.OFFLINE_PAID)
+                .num(num)
+                .build());
+
+        // 加入套餐商品
+        List<PackageGoods> setGoodsList = packageGoodsRepo.findAllByPackageId(packageId);
+        userPackageService.joinUserPackage(userId, setGoodsList, num);
+    }
+
 }

+ 9 - 9
src/main/java/com/izouma/jiashanxia/service/UserPackageFlowService.java

@@ -31,6 +31,7 @@ public class UserPackageFlowService {
     private UserPackageRepo     userPackageRepo;
 
     public Page<UserPackageFlow> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return userPackageFlowRepo
                 .findAll(JpaUtils.toSpecification(pageQuery, UserPackageFlow.class), JpaUtils.toPageRequest(pageQuery));
     }
@@ -91,12 +92,6 @@ public class UserPackageFlowService {
         List<UserPackageFlowVO> vos = new ArrayList<>();
         // 查找用户相关
         List<UserPackageFlow> flows = userPackageFlowRepo.findAllByUserIdOrderByCreatedAtDesc(userId);
-//        Set<Long> goodsId = new HashSet<>();
-//        // 找出相关商品
-//        flows.forEach(flow -> {
-//            List<GoodsDTO> goodsDTOS = JSONObject.parseArray(flow.getContent(), GoodsDTO.class);
-//            goodsId.addAll(goodsDTOS.stream().map(GoodsDTO::getGoodsInfoId).collect(Collectors.toSet()));
-//        });
         Map<Long, String> goodsMap = goodsInfoRepo.findAll()
                 .stream()
                 .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
@@ -175,12 +170,17 @@ public class UserPackageFlowService {
                 .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
         List<GoodsVO> goodsVOS = this.toGoodsVO(writeOffRecord.getContent(), goodsMap);
 
-        return WriteOffRecordDTO.builder()
+        WriteOffRecordDTO build = WriteOffRecordDTO.builder()
                 .id(writeOffRecord.getId())
                 .createdAt(writeOffRecord.getCreatedAt())
-                .nickname(writeOffRecord.getUser().getNickname())
-                .writeOffNickname(writeOffRecord.getWriteOffUser().getNickname())
                 .goods(goodsVOS)
                 .build();
+        if (writeOffRecord.getUser() != null) {
+            build.setNickname(writeOffRecord.getUser().getNickname());
+        }
+        if (writeOffRecord.getWriteOffUser() != null) {
+            build.setWriteOffNickname(writeOffRecord.getWriteOffUser().getNickname());
+        }
+        return build;
     }
 }

+ 4 - 3
src/main/java/com/izouma/jiashanxia/service/UserPackageService.java

@@ -14,6 +14,7 @@ import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.repo.UserPackageFlowRepo;
 import com.izouma.jiashanxia.repo.UserPackageRepo;
 import com.izouma.jiashanxia.utils.JpaUtils;
+import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
@@ -38,7 +39,7 @@ public class UserPackageService {
 
     用户套餐和企业套餐重叠怎么办?
     */
-    public void joinUserPackage(Long userId, List<PackageGoods> packageGoodsList) {
+    public void joinUserPackage(Long userId, List<PackageGoods> packageGoodsList, Integer num) {
         // 用户已有套餐
         Map<Long, UserPackage> userPackageMap = userPackageRepo.findAllByUserId(userId)
                 .stream()
@@ -48,14 +49,14 @@ public class UserPackageService {
         packageGoodsList.forEach(setGoods -> {
             UserPackage goods = userPackageMap.get(setGoods.getGoodsInfoId());
             if (ObjectUtil.isNotEmpty(goods)) {
-                goods.setNum(goods.getNum() + setGoods.getNum());
+                goods.setNum(goods.getNum() + setGoods.getNum() * num);
                 goods.setRemark(setGoods.getRemark());
 
             } else {
                 goods = UserPackage.builder()
                         .userId(userId)
                         .goodsInfoId(setGoods.getGoodsInfoId())
-                        .num(setGoods.getNum())
+                        .num(setGoods.getNum() * num)
                         .remark(setGoods.getRemark())
                         .build();
             }

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

@@ -57,6 +57,7 @@ public class UserService {
     private CommissionRecordRepo commissionRecordRepo;
 
     public Page<User> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return userRepo.findAll(JpaUtils.toSpecification(pageQuery, User.class), JpaUtils.toPageRequest(pageQuery));
     }
 

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

@@ -35,6 +35,7 @@ public class WithdrawService {
     private CommissionRecordRepo commissionRecordRepo;
 
     public Page<Withdraw> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
         return withdrawRepo.findAll(JpaUtils.toSpecification(pageQuery, Withdraw.class), JpaUtils.toPageRequest(pageQuery));
     }
 

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

@@ -1,15 +1,11 @@
 package com.izouma.jiashanxia.web;
 
-import cn.hutool.core.collection.CollUtil;
 import com.izouma.jiashanxia.domain.Company;
 import com.izouma.jiashanxia.domain.User;
-import com.izouma.jiashanxia.dto.CompanyDTO;
-import com.izouma.jiashanxia.repo.UserRepo;
 import com.izouma.jiashanxia.service.CompanyService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.CompanyRepo;
-import com.izouma.jiashanxia.utils.ObjUtils;
 import com.izouma.jiashanxia.utils.SecurityUtils;
 import com.izouma.jiashanxia.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
@@ -20,7 +16,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.util.List;
 
 @RestController
@@ -29,41 +24,11 @@ import java.util.List;
 public class CompanyController extends BaseController {
     private CompanyService companyService;
     private CompanyRepo    companyRepo;
-    private UserRepo       userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
-    public Company save(@RequestBody CompanyDTO record) {
-        if (record.getId() != null) {
-            Company orig = companyRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-            ObjUtils.merge(orig, record);
-            List<Long> employee = record.getEmployee();
-            if (CollUtil.isNotEmpty(employee)) {
-                List<User> employees = userRepo.findAllById(employee);
-                employees.forEach(yee -> {
-                    if (yee.getCompanyId() == null || !yee.getCompanyId().equals(record.getId())) {
-                        yee.setCompanyId(record.getId());
-                        userRepo.save(yee);
-                    }
-                });
-            }
-            return companyRepo.save(orig);
-        }
-        Company save = companyRepo.save(Company.builder()
-                .amount(BigDecimal.ZERO)
-                .name(record.getName())
-                .userId(record.getUserId())
-                .build());
-        if (CollUtil.isNotEmpty(record.getEmployee())) {
-            List<User> employees = userRepo.findAllById(record.getEmployee());
-            employees.forEach(yee -> {
-                if (yee.getCompanyId() == null || !yee.getCompanyId().equals(record.getId())) {
-                    yee.setCompanyId(record.getId());
-                    userRepo.save(yee);
-                }
-            });
-        }
-        return save;
+    public Company save(@RequestBody Company record) {
+        return companyService.save(record);
     }
 
     @PreAuthorize("hasAnyRole('ADMIN','CREATOR')")

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

@@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.Comparator;
 import java.util.List;
 
 @RestController
@@ -73,6 +72,12 @@ public class PackageController extends BaseController {
         packageService.openTeamSet(userId, packageId);
     }
 
+    @PostMapping("/recharge")
+    @ApiOperation("充值团队套餐")
+    public void recharge(Long userId, Long packageId, Integer num) {
+        packageService.recharge(userId, packageId, num);
+    }
+
     @GetMapping("/allList")
     public List<Package> allList() {
         return packageRepo.findAll();

+ 26 - 5
src/main/java/com/izouma/jiashanxia/web/PackageGoodsController.java

@@ -1,6 +1,11 @@
 package com.izouma.jiashanxia.web;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.izouma.jiashanxia.domain.GoodsInfo;
 import com.izouma.jiashanxia.domain.PackageGoods;
+import com.izouma.jiashanxia.dto.PackageGoodsDTO;
+import com.izouma.jiashanxia.dto.PackageGoodsVO;
+import com.izouma.jiashanxia.repo.GoodsInfoRepo;
 import com.izouma.jiashanxia.service.PackageGoodsService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -14,7 +19,10 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/packageGoods")
@@ -22,6 +30,7 @@ import java.util.List;
 public class PackageGoodsController extends BaseController {
     private PackageGoodsService packageGoodsService;
     private PackageGoodsRepo    packageGoodsRepo;
+    private GoodsInfoRepo       goodsInfoRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -37,8 +46,20 @@ public class PackageGoodsController extends BaseController {
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/all")
-    public Page<PackageGoods> all(@RequestBody PageQuery pageQuery) {
-        return packageGoodsService.all(pageQuery);
+    public Page<PackageGoodsVO> all(@RequestBody PageQuery pageQuery) {
+        Map<Long, GoodsInfo> goodsInfoMap = goodsInfoRepo.findAll()
+                .stream()
+                .collect(Collectors.toMap(GoodsInfo::getId, goods -> goods));
+        return packageGoodsService.all(pageQuery).map(packageGoods -> {
+            PackageGoodsVO vo = new PackageGoodsVO(packageGoods);
+            GoodsInfo goodsInfo = goodsInfoMap.get(packageGoods.getGoodsInfoId());
+            if (ObjectUtil.isNotEmpty(goodsInfo)) {
+                vo.setName(goodsInfo.getName());
+                vo.setUnit(goodsInfo.getUnit());
+                vo.setPrice(goodsInfo.getPrice().multiply(BigDecimal.valueOf(packageGoods.getNum())));
+            }
+            return vo;
+        });
     }
 
     @GetMapping("/get/{id}")
@@ -54,14 +75,14 @@ public class PackageGoodsController extends BaseController {
     @GetMapping("/excel")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<PackageGoods> data = all(pageQuery).getContent();
+        List<PackageGoods> data = packageGoodsService.all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
 
     @PostMapping("/getSetGoods")
     @ApiOperation("获取套餐内商品信息")
-    public List<PackageGoods> getSetGoods(@RequestParam Long packageId) {
-        return packageGoodsRepo.findAllByPackageId(packageId);
+    public List<PackageGoodsDTO> getSetGoods(@RequestParam Long packageId) {
+        return packageGoodsRepo.packageGoods(packageId);
     }
 }
 

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

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.web;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.dto.UserRegister;
@@ -176,4 +177,14 @@ public class UserController extends BaseController {
     public Map<String, Object> overview() {
         return userService.overview(SecurityUtils.getAuthenticatedUser().getId());
     }
+
+    @PostMapping("/user")
+    @ApiOperation("无公司的用户")
+    public List<User> user(Long companyId) {
+        List<User> users = userRepo.findAllByCompanyIdIsNull();
+        if (ObjectUtil.isNotEmpty(companyId)) {
+            users.addAll(userRepo.findAllByCompanyId(companyId));
+        }
+        return users;
+    }
 }

+ 2 - 0
src/main/java/com/izouma/jiashanxia/web/UserPackageController.java

@@ -1,7 +1,9 @@
 package com.izouma.jiashanxia.web;
 
+import com.izouma.jiashanxia.domain.GoodsInfo;
 import com.izouma.jiashanxia.domain.UserPackage;
 import com.izouma.jiashanxia.dto.UserPackageDTO;
+import com.izouma.jiashanxia.repo.GoodsInfoRepo;
 import com.izouma.jiashanxia.service.UserPackageService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;

+ 33 - 11
src/main/vue/src/views/CompanyEdit.vue

@@ -14,7 +14,13 @@
             </el-form-item>
             <el-form-item prop="userId" label="管理人员">
                 <div class="subform">
-                    <el-select v-model="formData.userId" style="width: 360px" filterable clearable>
+                    <el-select
+                        v-model="formData.userId"
+                        style="width: 360px"
+                        filterable
+                        clearable
+                        @change="chooseAdmin"
+                    >
                         <el-option v-for="item in users" :key="item.id" :value="item.id" :label="item.nickname">
                             <span style="float: left">{{ item.nickname }}</span>
                             <span style="float: right; color: #8492a6; font-size: 13px">{{ item.phone }}</span>
@@ -57,22 +63,32 @@ export default {
                     console.log(e);
                     this.$message.error(e.error);
                 });
+            this.$http
+                .post('user/user', { companyId: this.$route.query.id })
+                .then(res => {
+                    this.users = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        } else {
+            this.$http
+                .post('user/user')
+                .then(res => {
+                    this.users = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
         }
-        this.$http
-            .post('user/all', {}, { body: 'json' })
-            .then(res => {
-                this.users = res.content;
-            })
-            .catch(e => {
-                console.log(e);
-                this.$message.error(e.error);
-            });
     },
     data() {
         return {
             saving: false,
             formData: {
-                userId: 0
+                userId: ''
             },
             rules: {},
             users: [],
@@ -91,6 +107,7 @@ export default {
         },
         submit() {
             let data = { ...this.formData };
+            data.emplyee = this.emps;
 
             this.saving = true;
             this.$http
@@ -121,6 +138,11 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        chooseAdmin(id) {
+            this.user = this.users.find(item => {
+                return item.id === id;
+            });
         }
     }
 };

+ 78 - 1
src/main/vue/src/views/CompanyList.vue

@@ -30,7 +30,9 @@
             <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 size="mini" @click="showDialog = true" type="warning" plain>充值</el-button>
                     <el-button size="mini" @click="handleCommand(row.userId)">推广</el-button>
+                    <el-button size="mini" @click="handleCommand1(row.id)">员工</el-button>
                     <!--<el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
                 </template>
             </el-table-column>
@@ -56,6 +58,28 @@
             >
             </el-pagination>
         </div>
+
+        <el-dialog :visible.sync="showDialog" width="500px" title="选择套餐">
+            <el-form label-width="80px" label-position="right" size="small">
+                <el-form-item prop="packageId" label="套餐">
+                    <el-select v-model="packageId" style="margin-bottom: 10px;width: 300px" placeholder="请选择套餐">
+                        <el-option v-for="item in packages" :key="item.id" :value="item.id" :label="item.name" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item prop="num" label="数量">
+                    <el-input-number
+                        type="number"
+                        v-model="num"
+                        class="cl-input"
+                        :min="1"
+                        style="width: 300px"
+                    ></el-input-number>
+                </el-form-item>
+            </el-form>
+            <div slot="footer">
+                <el-button type="primary" size="mini" @click="addCompany" :loading="saving">创建</el-button>
+            </div>
+        </el-dialog>
     </div>
 </template>
 <script>
@@ -71,9 +95,25 @@ export default {
             search: '',
             url: '/company/all',
             downloading: false,
-            employee: []
+            employee: [],
+            packages: [],
+            packageId: '',
+            showDialog: false,
+            num: 1,
+            userId: '',
+            saving: false
         };
     },
+    created() {
+        this.$http
+            .get('/package/team')
+            .then(res => {
+                this.packages = res;
+            })
+            .catch(e => {
+                console.log(e);
+            });
+    },
     computed: {
         ...mapState(['userInfo']),
         selection() {
@@ -161,6 +201,43 @@ export default {
                     id: id
                 }
             });
+        },
+        handleCommand1(id) {
+            this.$router.push({
+                path: '/employeeList',
+                query: {
+                    id: id
+                }
+            });
+        },
+        recharge(row) {
+            this.userId = row.userId;
+            this.packageId = '';
+            this.num = 1;
+            this.showDialog = true;
+        },
+        addCompany() {
+            this.showDialog = true;
+            this.$alert('确认要创建么?', '提醒', { type: 'error' })
+                .then(() => {
+                    return this.$http.post('/package/recharge', {
+                        packageId: this.packageId,
+                        num: this.num
+                    });
+                })
+                .then(() => {
+                    this.$message.success('创建成功');
+                    this.showDialog = false;
+                    this.saving = false;
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                        this.saving = false;
+                    }
+                });
         }
     }
 };

+ 4 - 1
src/main/vue/src/views/EmployeeList.vue

@@ -91,6 +91,9 @@ export default {
         };
     },
     created() {
+        if (this.$route.query.id) {
+            this.companyId = this.$route.query.id;
+        }
         this.$http
             .get('/company/allList')
             .then(res => {
@@ -111,7 +114,7 @@ export default {
             return {
                 search: this.search,
                 query: {
-                    companyId: this.companyId
+                    companyId: this.companyId || this.$route.query.id
                 }
             };
         },

+ 15 - 12
src/main/vue/src/views/OrderInfoEdit.vue

@@ -10,7 +10,7 @@
             style="max-width: 500px;"
         >
             <el-form-item prop="userId" label="昵称">
-                <el-input v-model="formData.user.nickname"></el-input>
+                <el-input v-model="user.nickname"></el-input>
             </el-form-item>
             <el-form-item prop="payMethod" label="支付方式">
                 <el-select v-model="formData.payMethod" clearable filterable placeholder="请选择">
@@ -64,6 +64,9 @@ export default {
                 .get('orderInfo/get/' + this.$route.query.id)
                 .then(res => {
                     this.formData = res;
+                    if (res.user != null) {
+                        this.user = res.user;
+                    }
                 })
                 .catch(e => {
                     console.log(e);
@@ -74,17 +77,16 @@ export default {
     data() {
         return {
             saving: false,
-            formData: {
-                user: {}
-            },
+            formData: {},
+            user: {},
             rules: {
-                userId: [
-                    {
-                        required: true,
-                        message: '请输入userId',
-                        trigger: 'blur'
-                    }
-                ],
+                // userId: [
+                //     {
+                //         required: true,
+                //         message: '请输入userId',
+                //         trigger: 'blur'
+                //     }
+                // ],
                 status: [
                     {
                         required: true,
@@ -100,7 +102,8 @@ export default {
             statusOptions: [
                 { label: '未支付', value: 'UNPAID' },
                 { label: '已支付', value: 'PAID' },
-                { label: '已取消', value: 'CANCELLED' }
+                { label: '已取消', value: 'CANCELLED' },
+                { label: '线下支付', value: 'OFFLINE_PAID' }
             ]
         };
     },

+ 3 - 55
src/main/vue/src/views/UserEdit.vue

@@ -27,17 +27,11 @@
                 <el-input v-model="formData.phone"></el-input>
             </el-form-item>
             <el-form-item prop="companyId" label="团队">
-                <el-select
-                    v-model="formData.companyId"
-                    placeholder="请选择团队"
-                    style="width: 70%;"
-                    clearable
-                    v-if="!formData.teamFounder"
-                >
+                <el-select v-model="formData.companyId" placeholder="请选择团队" clearable v-if="!formData.teamFounder">
                     <el-option v-for="item in companies" :key="item.id" :value="item.id" :label="item.name">
                     </el-option>
                 </el-select>
-                <el-button
+                <!-- <el-button
                     style="margin-left: 20px"
                     @click="showDialog = true"
                     v-if="!formData.teamFounder && id !== 0"
@@ -46,7 +40,7 @@
                 </el-button>
                 <el-button @click="showEmployee" v-if="formData.teamFounder">
                     我的团队
-                </el-button>
+                </el-button> -->
             </el-form-item>
             <el-form-item prop="authorities" label="角色">
                 <el-select
@@ -69,18 +63,6 @@
             </el-form-item>
         </el-form>
 
-        <el-dialog :visible.sync="showDialog" width="400px">
-            <el-form label-width="80px" label-position="right" size="small">
-                <el-form-item prop="packageId" label="选择套餐">
-                    <el-select v-model="packageId">
-                        <el-option v-for="item in packages" :key="item.id" :value="item.id" :label="item.name" />
-                    </el-select>
-                </el-form-item>
-            </el-form>
-            <div slot="footer">
-                <el-button type="primary" size="mini" @click="addCompany" :loading="saving">创建</el-button>
-            </div>
-        </el-dialog>
         <el-dialog :visible.sync="userDialog" width="400px" title="员工列表">
             <el-table :data="employee">
                 <el-table-column label="昵称" prop="nickname"></el-table-column>
@@ -120,14 +102,6 @@ export default {
             .catch(e => {
                 console.log(e);
             });
-        this.$http
-            .get('/package/team')
-            .then(res => {
-                this.packages = res;
-            })
-            .catch(e => {
-                console.log(e);
-            });
     },
     data() {
         return {
@@ -161,9 +135,6 @@ export default {
             },
             authorities: [],
             companies: [],
-            packages: [],
-            packageId: '',
-            showDialog: false,
             userDialog: false,
             employee: [],
             id: 0
@@ -235,29 +206,6 @@ export default {
                 })
                 .catch(() => {});
         },
-        addCompany() {
-            this.showDialog = true;
-            this.$alert('确认要创建么?', '提醒', { type: 'error' })
-                .then(() => {
-                    return this.$http.post('/package/openTeamSet', {
-                        userId: this.formData.id,
-                        packageId: this.packageId
-                    });
-                })
-                .then(() => {
-                    this.$message.success('创建成功');
-                    this.showDialog = false;
-                    this.saving = false;
-                    this.getData();
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error(e.error);
-                        this.saving = false;
-                    }
-                });
-        },
         showEmployee() {
             this.userDialog = true;
             this.$http

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

@@ -37,7 +37,7 @@ public class OrderInfoServiceTest {
 
     @Test
     public void test() {
-        List<OrderInfoVO> content = orderInfoService.my(Pageable.unpaged(), 125L, CollUtil.newArrayList(OrderInfoStatus.PAID,OrderInfoStatus.OFFLINE_PAID)).getContent();
-        content.forEach(System.out::println);
+        List<OrderInfoVO> contents = orderInfoService.my(Pageable.unpaged(), 68L, null).getContent();
+        contents.forEach(content -> System.out.println(content.getCreatedAt()));
     }
 }