فهرست منبع

用户昵称搜索/管理后台

licailing 5 سال پیش
والد
کامیت
fbd2478805
30فایلهای تغییر یافته به همراه337 افزوده شده و 664 حذف شده
  1. 16 3
      src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java
  2. 23 4
      src/main/java/com/izouma/jiashanxia/domain/UserSetFlow.java
  3. 10 5
      src/main/java/com/izouma/jiashanxia/domain/Withdraw.java
  4. 0 48
      src/main/java/com/izouma/jiashanxia/domain/WriteOffRecord.java
  5. 33 0
      src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java
  6. 1 0
      src/main/java/com/izouma/jiashanxia/enums/AuthorityName.java
  7. 0 16
      src/main/java/com/izouma/jiashanxia/repo/WriteOffRecordRepo.java
  8. 21 0
      src/main/java/com/izouma/jiashanxia/service/OrderInfoService.java
  9. 5 4
      src/main/java/com/izouma/jiashanxia/service/SetMealService.java
  10. 84 5
      src/main/java/com/izouma/jiashanxia/service/UserSetFlowService.java
  11. 24 2
      src/main/java/com/izouma/jiashanxia/service/WithdrawService.java
  12. 0 107
      src/main/java/com/izouma/jiashanxia/service/WriteOffRecordService.java
  13. 6 0
      src/main/java/com/izouma/jiashanxia/web/OrderInfoController.java
  14. 23 0
      src/main/java/com/izouma/jiashanxia/web/UserSetFlowController.java
  15. 10 2
      src/main/java/com/izouma/jiashanxia/web/WithdrawController.java
  16. 0 68
      src/main/java/com/izouma/jiashanxia/web/WriteOffRecordController.java
  17. 0 1
      src/main/resources/genjson/WriteOffRecord.json
  18. 0 18
      src/main/vue/src/router.js
  19. 1 1
      src/main/vue/src/views/Menus.vue
  20. 7 5
      src/main/vue/src/views/OrderInfoEdit.vue
  21. 15 5
      src/main/vue/src/views/OrderInfoList.vue
  22. 1 1
      src/main/vue/src/views/UserEdit.vue
  23. 31 15
      src/main/vue/src/views/UserSetFlowEdit.vue
  24. 5 5
      src/main/vue/src/views/UserSetFlowList.vue
  25. 4 2
      src/main/vue/src/views/WithdrawEdit.vue
  26. 15 5
      src/main/vue/src/views/WithdrawList.vue
  27. 0 128
      src/main/vue/src/views/WriteOffRecordEdit.vue
  28. 0 170
      src/main/vue/src/views/WriteOffRecordList.vue
  29. 2 1
      src/test/java/com/izouma/jiashanxia/service/WithdrawServiceTest.java
  30. 0 43
      src/test/java/com/izouma/jiashanxia/service/WriteOffRecordServiceTest.java

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

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.domain;
 
+import com.izouma.jiashanxia.annotations.Searchable;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
 import com.izouma.jiashanxia.enums.PayMethod;
 import io.swagger.annotations.ApiModel;
@@ -8,10 +9,11 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.Where;
 
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
+import javax.persistence.*;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
@@ -20,6 +22,7 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 @NoArgsConstructor
 @Entity
+@Where(clause = "del = 0")
 @ApiModel(value = "订单")
 public class OrderInfo extends BaseEntity {
 
@@ -35,12 +38,14 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "订单状态")
     private OrderInfoStatus status;
 
+    @Searchable
     @ApiModelProperty(value = "订单号")
     private String orderNumber;
 
     @ApiModelProperty(value = "交易单号")
     private String transactionId;
 
+    @Searchable
     @ApiModelProperty(value = "名称")
     private String name;
 
@@ -50,4 +55,12 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "价钱")
     private BigDecimal price;
 
+//    @ApiModelProperty(value = "用户端是否显示")
+//    private Boolean isShow;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User user;
+
 }

+ 23 - 4
src/main/java/com/izouma/jiashanxia/domain/UserSetFlow.java

@@ -1,27 +1,46 @@
 package com.izouma.jiashanxia.domain;
 
 import com.izouma.jiashanxia.enums.FlowType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
+import javax.persistence.*;
 
 @Entity
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
 @Data
+@ApiModel(value = "套餐流水")
 public class UserSetFlow extends BaseEntity {
     private Long userId;
 
     @Enumerated(EnumType.STRING)
     private FlowType type;
 
+    /*
+    存储内容
+    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1},{"goodsInfoId":13,"num":4}]
+     */
     @Column(columnDefinition = "TEXT")
     private String content;
+
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User user;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "writeOffUserId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User writeOffUser;
 }

+ 10 - 5
src/main/java/com/izouma/jiashanxia/domain/Withdraw.java

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.domain;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.izouma.jiashanxia.annotations.Searchable;
 import com.izouma.jiashanxia.enums.PayMethod;
 import com.izouma.jiashanxia.enums.WithdrawStatus;
@@ -9,6 +10,9 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 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;
@@ -21,6 +25,7 @@ import java.time.LocalDateTime;
 @NoArgsConstructor
 @AllArgsConstructor
 @ApiModel(value = "提现申请表")
+@Where(clause = "del = 0")
 public class Withdraw extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "用户ID", name = "userId")
@@ -55,11 +60,11 @@ public class Withdraw extends BaseEntity implements Serializable {
 //    @Column(nullable = false)
 //    private Boolean consent;
 
-//    @ManyToOne(fetch = FetchType.LAZY)
-//    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
-//    @NotFound(action = NotFoundAction.IGNORE)
-//    @ExcelIgnore
-//    private User user;
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private User user;
 
 //    @ApiModelProperty(value = "是否经销商流水", name = "isDealer")
 //    private Boolean isDealer;

+ 0 - 48
src/main/java/com/izouma/jiashanxia/domain/WriteOffRecord.java

@@ -1,48 +0,0 @@
-package com.izouma.jiashanxia.domain;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.hibernate.annotations.NotFound;
-import org.hibernate.annotations.NotFoundAction;
-
-import javax.persistence.*;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-@Builder
-@Entity
-@ApiModel(value = "核销记录")
-public class WriteOffRecord extends BaseEntity {
-
-    @ApiModelProperty(value = "被核销人")
-    private Long userId;
-
-    @ApiModelProperty(value = "核销人")
-    private Long writeOffUserId;
-
-    /*
-    存储内容
-    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1},{"goodsInfoId":13,"num":4}]
-     */
-    @Column(columnDefinition = "TEXT")
-    @ApiModelProperty(value = "核销内容")
-    private String content;
-
-//    @Enumerated(EnumType.STRING)
-//    private SetType type;
-
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    @NotFound(action = NotFoundAction.IGNORE)
-    private User user;
-
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "writeOffUserId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    @NotFound(action = NotFoundAction.IGNORE)
-    private User writeOffUser;
-}

+ 33 - 0
src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java

@@ -0,0 +1,33 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import javax.persistence.*;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "核销记录保存")
+public class WriteOffSaveVO extends BaseEntity {
+
+    @ApiModelProperty(value = "被核销人")
+    private Long userId;
+
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    /*
+    存储内容
+    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1},{"goodsInfoId":13,"num":4}]
+     */
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty(value = "核销内容")
+    private String content;
+
+}

+ 1 - 0
src/main/java/com/izouma/jiashanxia/enums/AuthorityName.java

@@ -4,6 +4,7 @@ public enum AuthorityName {
     ROLE_USER("普通用户"),
     ROLE_DEV("开发者"),
     ROLE_WRITER("核销者"),
+    ROLE_CREATOR("创建者"),
     ROLE_ADMIN("管理员");
     private final String description;
 

+ 0 - 16
src/main/java/com/izouma/jiashanxia/repo/WriteOffRecordRepo.java

@@ -1,16 +0,0 @@
-package com.izouma.jiashanxia.repo;
-
-import com.izouma.jiashanxia.domain.WriteOffRecord;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-
-import javax.transaction.Transactional;
-
-public interface WriteOffRecordRepo extends JpaRepository<WriteOffRecord, Long>, JpaSpecificationExecutor<WriteOffRecord> {
-    @Query("update WriteOffRecord t set t.del = true where t.id = ?1")
-    @Modifying
-    @Transactional
-    void softDelete(Long id);
-}

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

@@ -2,6 +2,7 @@ package com.izouma.jiashanxia.service;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.*;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.enums.OrderInfoStatus;
@@ -12,11 +13,14 @@ import com.izouma.jiashanxia.repo.*;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+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;
 
 
@@ -38,6 +42,23 @@ public class OrderInfoService {
         return orderInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrderInfo.class), JpaUtils.toPageRequest(pageQuery));
     }
 
+    /*
+    后台列表
+     */
+    public Page<OrderInfo> backAll(PageQuery pageQuery) {
+        return orderInfoRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, OrderInfo.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                List<Predicate> or = new ArrayList<>();
+                or.add(and.get(and.size() - 1));
+                and.remove(and.get(and.size() - 1));
+                or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
+
     /*
     下订单
      */

+ 5 - 4
src/main/java/com/izouma/jiashanxia/service/SetMealService.java

@@ -63,12 +63,13 @@ public class SetMealService {
         }
         User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
         // 团队创始人
-        if (!user.getTeamFounder()) {
-            user.setTeamFounder(true);
+        Set<Authority> authorities = user.getAuthorities();
+        if (!authorities.contains(Authority.get(AuthorityName.ROLE_CREATOR))) {
             user.setCompanyId(company.getId());
-            userRepo.save(user);
+            user.setTeamFounder(true);
+            authorities.add(Authority.get(AuthorityName.ROLE_CREATOR));
+            user.setAuthorities(authorities);
         }
-
     }
 
 }

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

@@ -1,21 +1,26 @@
 package com.izouma.jiashanxia.service;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.izouma.jiashanxia.domain.GoodsInfo;
+import com.izouma.jiashanxia.domain.OrderInfo;
+import com.izouma.jiashanxia.domain.UserSet;
 import com.izouma.jiashanxia.domain.UserSetFlow;
-import com.izouma.jiashanxia.dto.GoodsDTO;
-import com.izouma.jiashanxia.dto.GoodsVO;
-import com.izouma.jiashanxia.dto.PageQuery;
-import com.izouma.jiashanxia.dto.UserSetFlowVO;
+import com.izouma.jiashanxia.dto.*;
+import com.izouma.jiashanxia.enums.FlowType;
 import com.izouma.jiashanxia.exception.BusinessException;
 import com.izouma.jiashanxia.repo.GoodsInfoRepo;
 import com.izouma.jiashanxia.repo.UserSetFlowRepo;
+import com.izouma.jiashanxia.repo.UserSetRepo;
 import com.izouma.jiashanxia.utils.JpaUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Predicate;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -25,11 +30,31 @@ public class UserSetFlowService {
 
     private UserSetFlowRepo userSetFlowRepo;
     private GoodsInfoRepo   goodsInfoRepo;
+    private UserSetRepo     userSetRepo;
 
     public Page<UserSetFlow> all(PageQuery pageQuery) {
         return userSetFlowRepo.findAll(JpaUtils.toSpecification(pageQuery, UserSetFlow.class), JpaUtils.toPageRequest(pageQuery));
     }
 
+    /*
+    核销列表
+     */
+    public Page<UserSetFlow> writeOffAll(PageQuery pageQuery) {
+        return userSetFlowRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, UserSetFlow.class, root, criteriaQuery, criteriaBuilder);
+            and.add(criteriaBuilder.equal(root.join("type"), FlowType.WRITE_OFF));
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                List<Predicate> or = new ArrayList<>();
+                or.add(and.get(and.size() - 1));
+                and.remove(and.get(and.size() - 1));
+                or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
+                or.add(criteriaBuilder.like(root.join("writeOffUser")
+                        .get("nickname"), "%" + pageQuery.getSearch() + "%"));
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
 
     public List<UserSetFlowVO> my(Long userId) {
         List<UserSetFlowVO> vos = new ArrayList<>();
@@ -46,7 +71,7 @@ public class UserSetFlowService {
                 .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
         // 转vo
         flows.forEach(flow -> {
-            List<GoodsVO> goodsVOS = this.toGoodsVO(flow.getContent(),goodsMap);
+            List<GoodsVO> goodsVOS = this.toGoodsVO(flow.getContent(), goodsMap);
             UserSetFlowVO vo = new UserSetFlowVO();
             BeanUtil.copyProperties(flow, vo);
             vo.setContent(goodsVOS);
@@ -67,4 +92,58 @@ public class UserSetFlowService {
         );
         return goodsVOS;
     }
+
+    /*
+    核销
+    */
+    public UserSetFlow writeOff(WriteOffSaveVO writeOffSaveVO) {
+        if (writeOffSaveVO.getUserId().equals(writeOffSaveVO.getWriteOffUserId())) {
+            throw new BusinessException("不可自己核销自己");
+        }
+
+        // 用户已有套餐
+        Map<Long, UserSet> userSetMap = userSetRepo.findAllByUserId(writeOffSaveVO.getUserId())
+                .stream()
+                .collect(Collectors.toMap(UserSet::getGoodsInfoId, userSet -> userSet));
+
+        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffSaveVO.getContent(), GoodsDTO.class);
+        goodsDTOS.forEach(goodsDTO -> {
+            UserSet userSet = userSetMap.get(goodsDTO.getGoodsInfoId());
+            if (ObjectUtil.isEmpty(userSet)) {
+                throw new BusinessException("无此项目");
+            }
+            if (goodsDTO.getNum() > userSet.getNum()) {
+                throw new BusinessException("核销数量大于套餐数量");
+            }
+        });
+
+        // 保存套餐流水
+        return userSetFlowRepo.save(
+                UserSetFlow.builder()
+                        .userId(writeOffSaveVO.getUserId())
+                        .content(writeOffSaveVO.getContent())
+                        .type(FlowType.WRITE_OFF)
+                        .writeOffUserId(writeOffSaveVO.getWriteOffUserId())
+                        .build());
+    }
+
+    public WriteOffRecordDTO getDTO(Long id) {
+        UserSetFlow writeOffRecord = userSetFlowRepo.findById(id).orElseThrow(new BusinessException("无核销记录"));
+        // 转vo
+        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffRecord.getContent(), GoodsDTO.class);
+        Set<Long> ids = goodsDTOS.stream().map(GoodsDTO::getGoodsInfoId).collect(Collectors.toSet());
+        Map<Long, String> goodsMap = goodsInfoRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
+        List<GoodsVO> goodsVOS = this.toGoodsVO(writeOffRecord.getContent(), goodsMap);
+
+        return WriteOffRecordDTO.builder()
+                .id(writeOffRecord.getId())
+                .createdAt(writeOffRecord.getCreatedAt())
+                .nickname(writeOffRecord.getUser().getNickname())
+                .writeOffNickname(writeOffRecord.getWriteOffUser().getNickname())
+                .goods(goodsVOS)
+                .build();
+    }
+
 }

+ 24 - 2
src/main/java/com/izouma/jiashanxia/service/WithdrawService.java

@@ -1,6 +1,8 @@
 package com.izouma.jiashanxia.service;
 
+import cn.hutool.core.util.StrUtil;
 import com.izouma.jiashanxia.domain.CommissionRecord;
+import com.izouma.jiashanxia.domain.OrderInfo;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.domain.Withdraw;
 import com.izouma.jiashanxia.dto.PageQuery;
@@ -16,8 +18,11 @@ import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Predicate;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 @AllArgsConstructor
@@ -31,10 +36,27 @@ public class WithdrawService {
         return withdrawRepo.findAll(JpaUtils.toSpecification(pageQuery, Withdraw.class), JpaUtils.toPageRequest(pageQuery));
     }
 
+    /*
+    后台列表
+     */
+    public Page<Withdraw> backAll(PageQuery pageQuery) {
+        return withdrawRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, Withdraw.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                List<Predicate> or = new ArrayList<>();
+                or.add(and.get(and.size() - 1));
+                and.remove(and.get(and.size() - 1));
+                or.add(criteriaBuilder.like(root.join("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
+                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+    }
+
     /*
     提现申请
      */
-    public Withdraw apply(Long userId, BigDecimal amount, String realName, String account) {
+    public Withdraw apply(Long userId, BigDecimal amount, PayMethod payMethod,String realName, String account) {
         if (BigDecimal.ZERO.compareTo(amount) >= 0) {
             throw new BusinessException("提现金额小于等于零");
         }
@@ -56,7 +78,7 @@ public class WithdrawService {
                         .amount(amount)
                         .balance(subtract)
                         .status(WithdrawStatus.PENDING)
-                        .payMethod(PayMethod.WEIXIN)
+                        .payMethod(payMethod)
                         .build());
 
     }

+ 0 - 107
src/main/java/com/izouma/jiashanxia/service/WriteOffRecordService.java

@@ -1,107 +0,0 @@
-package com.izouma.jiashanxia.service;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.izouma.jiashanxia.domain.*;
-import com.izouma.jiashanxia.dto.GoodsDTO;
-import com.izouma.jiashanxia.dto.GoodsVO;
-import com.izouma.jiashanxia.dto.PageQuery;
-import com.izouma.jiashanxia.dto.WriteOffRecordDTO;
-import com.izouma.jiashanxia.enums.FlowType;
-import com.izouma.jiashanxia.exception.BusinessException;
-import com.izouma.jiashanxia.repo.GoodsInfoRepo;
-import com.izouma.jiashanxia.repo.UserSetFlowRepo;
-import com.izouma.jiashanxia.repo.UserSetRepo;
-import com.izouma.jiashanxia.repo.WriteOffRecordRepo;
-import com.izouma.jiashanxia.utils.JpaUtils;
-import lombok.AllArgsConstructor;
-import org.springframework.data.domain.Page;
-import org.springframework.stereotype.Service;
-
-import javax.persistence.criteria.Predicate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Service
-@AllArgsConstructor
-public class WriteOffRecordService {
-
-    private WriteOffRecordRepo writeOffRecordRepo;
-    private UserSetFlowRepo    userSetFlowRepo;
-    private UserSetRepo        userSetRepo;
-    private GoodsInfoRepo      goodsInfoRepo;
-    private UserSetFlowService userSetFlowService;
-
-    public Page<WriteOffRecord> all(PageQuery pageQuery) {
-//        return writeOffRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, WriteOffRecord.class), JpaUtils.toPageRequest(pageQuery));
-        return writeOffRecordRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
-            List<Predicate> and = JpaUtils.toPredicates(pageQuery, WriteOffRecord.class, root, criteriaQuery, criteriaBuilder);
-            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
-                List<Predicate> or = new ArrayList<>();
-                or.add(criteriaBuilder.like(root.get("user").get("nickname"), "%" + pageQuery.getSearch() + "%"));
-                or.add(criteriaBuilder.like(root.get("writeOffUser")
-                        .get("nickname"), "%" + pageQuery.getSearch() + "%"));
-                and.add(criteriaBuilder.or(or.toArray(new Predicate[0])));
-            }
-            return criteriaBuilder.and(and.toArray(new Predicate[0]));
-        }), JpaUtils.toPageRequest(pageQuery));
-    }
-
-    /*
-    核销
-     */
-    public WriteOffRecord save(WriteOffRecord writeOffRecord) {
-        if (writeOffRecord.getUserId().equals(writeOffRecord.getWriteOffUserId())) {
-            throw new BusinessException("不可自己核销自己");
-        }
-
-        // 用户已有套餐
-        Map<Long, UserSet> userSetMap = userSetRepo.findAllByUserId(writeOffRecord.getUserId())
-                .stream()
-                .collect(Collectors.toMap(UserSet::getGoodsInfoId, userSet -> userSet));
-
-        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffRecord.getContent(), GoodsDTO.class);
-        goodsDTOS.forEach(goodsDTO -> {
-            UserSet userSet = userSetMap.get(goodsDTO.getGoodsInfoId());
-            if (ObjectUtil.isEmpty(userSet)) {
-                throw new BusinessException("无此项目");
-            }
-            if (goodsDTO.getNum() > userSet.getNum()) {
-                throw new BusinessException("核销数量大于套餐数量");
-            }
-        });
-
-        // 保存套餐流水
-        userSetFlowRepo.save(
-                UserSetFlow.builder()
-                        .userId(writeOffRecord.getUserId())
-                        .content(writeOffRecord.getContent())
-                        .type(FlowType.WRITE_OFF)
-                        .build());
-
-        return writeOffRecordRepo.save(writeOffRecord);
-    }
-
-    public WriteOffRecordDTO getDTO(Long id) {
-        WriteOffRecord writeOffRecord = writeOffRecordRepo.findById(id).orElseThrow(new BusinessException("无核销记录"));
-        // 转vo
-        List<GoodsDTO> goodsDTOS = JSONObject.parseArray(writeOffRecord.getContent(), GoodsDTO.class);
-        Set<Long> ids = goodsDTOS.stream().map(GoodsDTO::getGoodsInfoId).collect(Collectors.toSet());
-        Map<Long, String> goodsMap = goodsInfoRepo.findAllById(ids)
-                .stream()
-                .collect(Collectors.toMap(GoodsInfo::getId, GoodsInfo::getName));
-        List<GoodsVO> goodsVOS = userSetFlowService.toGoodsVO(writeOffRecord.getContent(), goodsMap);
-
-        return WriteOffRecordDTO.builder()
-                .id(writeOffRecord.getId())
-                .createdAt(writeOffRecord.getCreatedAt())
-                .nickname(writeOffRecord.getUser().getNickname())
-                .writeOffNickname(writeOffRecord.getWriteOffUser().getNickname())
-                .goods(goodsVOS)
-                .build();
-    }
-}

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

@@ -44,6 +44,12 @@ public class OrderInfoController extends BaseController {
         return orderInfoService.all(pageQuery);
     }
 
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/backAll")
+    public Page<OrderInfo> backAll(@RequestBody PageQuery pageQuery) {
+        return orderInfoService.backAll(pageQuery);
+    }
+
     @GetMapping("/get/{id}")
     public OrderInfo get(@PathVariable Long id) {
         return orderInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));

+ 23 - 0
src/main/java/com/izouma/jiashanxia/web/UserSetFlowController.java

@@ -1,6 +1,8 @@
 package com.izouma.jiashanxia.web;
 
 import com.izouma.jiashanxia.domain.UserSetFlow;
+import com.izouma.jiashanxia.dto.WriteOffRecordDTO;
+import com.izouma.jiashanxia.dto.WriteOffSaveVO;
 import com.izouma.jiashanxia.service.UserSetFlowService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -8,6 +10,7 @@ import com.izouma.jiashanxia.repo.UserSetFlowRepo;
 import com.izouma.jiashanxia.utils.ObjUtils;
 import com.izouma.jiashanxia.utils.SecurityUtils;
 import com.izouma.jiashanxia.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -63,5 +66,25 @@ public class UserSetFlowController extends BaseController {
     public List<UserSetFlow> my() {
         return userSetFlowRepo.findAllByUserId(SecurityUtils.getAuthenticatedUser().getId());
     }
+
+    @GetMapping("/getDTO/{id}")
+    public WriteOffRecordDTO getDTO(@PathVariable Long id) {
+        return userSetFlowService.getDTO(id);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/writeOffAll")
+    @ApiOperation("核销记录")
+    public Page<UserSetFlow> writeOffAll(@RequestBody PageQuery pageQuery) {
+        return userSetFlowService.writeOffAll(pageQuery);
+    }
+
+    @PreAuthorize("hasAnyAuthority('ADMIN','WRITER')")
+    @PostMapping("/writeOff")
+    @ApiOperation("核销")
+    public UserSetFlow writeOff(@RequestBody WriteOffSaveVO vo) {
+        return userSetFlowService.writeOff(vo);
+    }
+
 }
 

+ 10 - 2
src/main/java/com/izouma/jiashanxia/web/WithdrawController.java

@@ -1,6 +1,7 @@
 package com.izouma.jiashanxia.web;
 
 import com.izouma.jiashanxia.domain.Withdraw;
+import com.izouma.jiashanxia.enums.PayMethod;
 import com.izouma.jiashanxia.service.WithdrawService;
 import com.izouma.jiashanxia.dto.PageQuery;
 import com.izouma.jiashanxia.exception.BusinessException;
@@ -44,6 +45,12 @@ public class WithdrawController extends BaseController {
         return withdrawService.all(pageQuery);
     }
 
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/backAll")
+    public Page<Withdraw> backAll(@RequestBody PageQuery pageQuery) {
+        return withdrawService.backAll(pageQuery);
+    }
+
     @GetMapping("/get/{id}")
     public Withdraw get(@PathVariable Long id) {
         return withdrawRepo.findById(id).orElseThrow(new BusinessException("无记录"));
@@ -63,8 +70,9 @@ public class WithdrawController extends BaseController {
 
     @PostMapping("/apply")
     @ApiOperation("提现申请")
-    public Withdraw apply(BigDecimal amount, String realName, String account) {
-        return withdrawService.apply(SecurityUtils.getAuthenticatedUser().getId(), amount, realName, account);
+    public Withdraw apply(BigDecimal amount, PayMethod payMethod, String realName, String account) {
+        return withdrawService.apply(SecurityUtils.getAuthenticatedUser()
+                .getId(),  amount, payMethod, realName, account);
     }
 
     @PostMapping("/audit")

+ 0 - 68
src/main/java/com/izouma/jiashanxia/web/WriteOffRecordController.java

@@ -1,68 +0,0 @@
-package com.izouma.jiashanxia.web;
-
-import com.izouma.jiashanxia.domain.WriteOffRecord;
-import com.izouma.jiashanxia.dto.GoodsVO;
-import com.izouma.jiashanxia.dto.WriteOffRecordDTO;
-import com.izouma.jiashanxia.service.WriteOffRecordService;
-import com.izouma.jiashanxia.dto.PageQuery;
-import com.izouma.jiashanxia.exception.BusinessException;
-import com.izouma.jiashanxia.repo.WriteOffRecordRepo;
-import com.izouma.jiashanxia.utils.ObjUtils;
-import com.izouma.jiashanxia.utils.excel.ExcelUtils;
-import lombok.AllArgsConstructor;
-import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-
-@RestController
-@RequestMapping("/writeOffRecord")
-@AllArgsConstructor
-public class WriteOffRecordController extends BaseController {
-    private WriteOffRecordService writeOffRecordService;
-    private WriteOffRecordRepo    writeOffRecordRepo;
-
-    @PreAuthorize("hasAnyRole('ADMIN','WRITER')")
-    @PostMapping("/save")
-    public WriteOffRecord save(@RequestBody WriteOffRecord record) {
-        if (record.getId() != null) {
-            WriteOffRecord orig = writeOffRecordRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-            ObjUtils.merge(orig, record);
-            return writeOffRecordRepo.save(orig);
-        }
-        return writeOffRecordService.save(record);
-    }
-
-
-    //@PreAuthorize("hasRole('ADMIN')")
-    @PostMapping("/all")
-    public Page<WriteOffRecord> all(@RequestBody PageQuery pageQuery) {
-        return writeOffRecordService.all(pageQuery);
-    }
-
-    @GetMapping("/get/{id}")
-    public WriteOffRecord get(@PathVariable Long id) {
-        return writeOffRecordRepo.findById(id).orElseThrow(new BusinessException("无记录"));
-    }
-
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        writeOffRecordRepo.softDelete(id);
-    }
-
-    @GetMapping("/excel")
-    @ResponseBody
-    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<WriteOffRecord> data = all(pageQuery).getContent();
-        ExcelUtils.export(response, data);
-    }
-
-    @GetMapping("/getDTO/{id}")
-    public WriteOffRecordDTO getDTO(@PathVariable Long id) {
-        return writeOffRecordService.getDTO(id);
-    }
-}
-

+ 0 - 1
src/main/resources/genjson/WriteOffRecord.json

@@ -1 +0,0 @@
-{"tableName":"WriteOffRecord","className":"WriteOffRecord","remark":"核销记录","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/java/com/izouma/jiashanxia","viewPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/jiashanxia/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"被核销人","showInList":true,"showInForm":true,"formType":"number"},{"name":"writeOffUserId","modelName":"writeOffUserId","remark":"核销人","showInList":true,"showInForm":true,"formType":"number"},{"name":"content","modelName":"content","remark":"核销内容","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"type","modelName":"type","remark":"类别","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"TEAM\",\"value\":\"TEAM\"},{\"label\":\"PERSONAL\",\"value\":\"PERSONAL\"}]"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.jiashanxia","tablePackage":"com.izouma.jiashanxia.domain.WriteOffRecord"}

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

@@ -240,24 +240,6 @@ const router = new Router({
                     meta: {
                         title: '团队信息'
                     }
-                },
-                {
-                    path: '/writeOffRecordEdit',
-                    name: 'WriteOffRecordEdit',
-                    component: () =>
-                        import(/* webpackChunkName: "writeOffRecordEdit" */ '@/views/WriteOffRecordEdit.vue'),
-                    meta: {
-                        title: '核销记录编辑'
-                    }
-                },
-                {
-                    path: '/writeOffRecordList',
-                    name: 'WriteOffRecordList',
-                    component: () =>
-                        import(/* webpackChunkName: "writeOffRecordList" */ '@/views/WriteOffRecordList.vue'),
-                    meta: {
-                        title: '核销记录'
-                    }
                 }
                 /**INSERT_LOCATION**/
             ]

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

@@ -76,7 +76,7 @@
                         </el-form>
                         <div slot="footer">
                             <el-button @click="dialogVisible = false">取消 </el-button>
-                            <el-button type="primary" @click="addMenu" :loading="loading">保存 </el-button>
+                            <el-button type="primary" @click="addMenu" :loading="loading">保存</el-button>
                         </div>
                     </div>
                 </el-col>

+ 7 - 5
src/main/vue/src/views/OrderInfoEdit.vue

@@ -9,8 +9,8 @@
             size="small"
             style="max-width: 500px;"
         >
-            <el-form-item prop="userId" label="userId">
-                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            <el-form-item prop="userId" label="昵称">
+                <el-input v-model="formData.user.nickname"></el-input>
             </el-form-item>
             <el-form-item prop="payMethod" label="支付方式">
                 <el-select v-model="formData.payMethod" clearable filterable placeholder="请选择">
@@ -44,9 +44,9 @@
             <el-form-item prop="name" label="名称">
                 <el-input v-model="formData.name"></el-input>
             </el-form-item>
-            <el-form-item prop="setId" label="充值套餐">
+            <!--<el-form-item prop="setId" label="充值套餐">
                 <el-input v-model="formData.setId"></el-input>
-            </el-form-item>
+            </el-form-item>-->
             <el-form-item>
                 <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
                 <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
@@ -74,7 +74,9 @@ export default {
     data() {
         return {
             saving: false,
-            formData: {},
+            formData: {
+                user: {}
+            },
             rules: {
                 userId: [
                     {

+ 15 - 5
src/main/vue/src/views/OrderInfoList.vue

@@ -12,6 +12,10 @@
                 class="filter-item"
                 >导出EXCEL
             </el-button>
+            <el-select v-model="status" multiple clearable @change="getData">
+                <el-option v-for="item in statusOptions" :key="item.value" :value="item.value" :label="item.label">
+                </el-option>
+            </el-select>
         </div>
         <el-table
             :data="tableData"
@@ -26,11 +30,11 @@
             <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="orderNumber" label="订单号" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="userId" label="userId"> </el-table-column>
+            <el-table-column prop="user.nickname" label="昵称"> </el-table-column>
             <el-table-column prop="payMethod" label="支付方式" :formatter="payMethodFormatter"> </el-table-column>
-            <el-table-column prop="paidAt" label="支付时间"> </el-table-column>
             <el-table-column prop="status" label="订单状态" :formatter="statusFormatter"> </el-table-column>
             <el-table-column prop="name" label="名称" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="paidAt" label="支付时间" show-overflow-tooltip> </el-table-column>
             <!--<el-table-column prop="setId" label="充值套餐"> </el-table-column>-->
             <el-table-column label="操作" align="center" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
@@ -73,7 +77,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/orderInfo/all',
+            url: '/orderInfo/backAll',
             downloading: false,
             payMethodOptions: [
                 { label: '微信', value: 'WEIXIN' },
@@ -83,7 +87,8 @@ export default {
                 { label: '未支付', value: 'UNPAID' },
                 { label: '已支付', value: 'PAID' },
                 { label: '已取消', value: 'CANCELLED' }
-            ]
+            ],
+            status: []
         };
     },
     computed: {
@@ -107,7 +112,12 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    status: this.status
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 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>
                 </el-select>
-                <el-button style="margin-left: 20px" @click="showDialog = true" v-if="!formData.teamFounder">
+                <el-button style="margin-left: 20px" @click="showDialog = true" v-if="!formData.isTeamFounder">
                     新建团队
                 </el-button>
                 <el-button @click="showEmployee" v-else>

+ 31 - 15
src/main/vue/src/views/UserSetFlowEdit.vue

@@ -4,27 +4,41 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="65px"
+            label-width="80px"
             label-position="right"
             size="small"
             style="max-width: 500px;"
         >
-            <el-form-item prop="userId" label="userId">
-                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            <el-form-item prop="userId" label="被核销人">
+                <el-input v-model="formData.nickname"></el-input>
             </el-form-item>
-            <el-form-item prop="type" label="类型">
-                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
-                    <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
-                    </el-option>
-                </el-select>
+            <el-form-item prop="writeOffUserId" label="核销人">
+                <el-input v-model="formData.writeOffNickname"></el-input>
             </el-form-item>
-            <el-form-item prop="content" label="内容">
-                <el-input v-model="formData.content"></el-input>
+            <el-form-item prop="content" label="核销内容">
+                <!--<el-input v-model="formData.content"></el-input>-->
+                <div v-for="item in formData.goods" :key="item.name">
+                    <el-col :span="16">
+                        <el-input v-model="item.name"></el-input>
+                    </el-col>
+                    <el-col :span="8">
+                        <el-input v-model="item.num"></el-input>
+                    </el-col>
+                </div>
+            </el-form-item>
+            <el-form-item prop="createdAt" label="核销时间">
+                <el-date-picker
+                    v-model="formData.createdAt"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择日期时间"
+                >
+                </el-date-picker>
             </el-form-item>
             <el-form-item>
-                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
-                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
-                <el-button @click="$router.go(-1)">取消</el-button>
+                <!--<el-button @click="onSave" :loading="saving" type="primary">保存</el-button>-->
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除</el-button>
+                <el-button @click="$router.go(-1)">返回</el-button>
             </el-form-item>
         </el-form>
     </div>
@@ -35,7 +49,7 @@ export default {
     created() {
         if (this.$route.query.id) {
             this.$http
-                .get('userSetFlow/get/' + this.$route.query.id)
+                .get('userSetFlow/getDTO/' + this.$route.query.id)
                 .then(res => {
                     this.formData = res;
                 })
@@ -48,7 +62,9 @@ export default {
     data() {
         return {
             saving: false,
-            formData: {},
+            formData: {
+                goods: []
+            },
             rules: {},
             typeOptions: [
                 { label: '购买', value: 'BUY' },

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

@@ -25,12 +25,12 @@
         >
             <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="userId" label="userId"> </el-table-column>
-            <el-table-column prop="type" label="类型" :formatter="typeFormatter"> </el-table-column>
-            <el-table-column prop="content" 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="createdAt" label="核销时间"> </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="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>
@@ -69,7 +69,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/userSetFlow/all',
+            url: '/userSetFlow/writeOffAll',
             downloading: false,
             typeOptions: [
                 { label: '购买', value: 'BUY' },

+ 4 - 2
src/main/vue/src/views/WithdrawEdit.vue

@@ -10,7 +10,7 @@
             style="max-width: 500px;"
         >
             <el-form-item prop="userId" label="用户ID">
-                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+                <el-input v-model="formData.user.nickname"></el-input>
             </el-form-item>
             <el-form-item prop="amount" label="提现金额">
                 <el-input-number type="number" v-model="formData.amount"></el-input-number>
@@ -74,7 +74,9 @@ export default {
     data() {
         return {
             saving: false,
-            formData: {},
+            formData: {
+                user: {}
+            },
             rules: {},
             payMethodOptions: [
                 { label: '微信', value: 'WEIXIN' },

+ 15 - 5
src/main/vue/src/views/WithdrawList.vue

@@ -12,6 +12,10 @@
                 class="filter-item"
                 >导出EXCEL
             </el-button>
+            <el-select v-model="status" multiple clearable @change="getData">
+                <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+            </el-select>
         </div>
         <el-table
             :data="tableData"
@@ -24,8 +28,8 @@
             :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="100"> </el-table-column>
-            <el-table-column prop="userId" label="用户ID"> </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="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>
@@ -93,7 +97,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/withdraw/all',
+            url: '/withdraw/backAll',
             downloading: false,
             payMethodOptions: [
                 { label: '微信', value: 'WEIXIN' },
@@ -104,7 +108,8 @@ export default {
                 { label: '提现成功', value: 'SUCCESS' },
                 { label: '提现失败', value: 'FAIL' },
                 { label: '待处理', value: 'PENDING' }
-            ]
+            ],
+            status: []
         };
     },
     computed: {
@@ -128,7 +133,12 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    status: this.status
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;

+ 0 - 128
src/main/vue/src/views/WriteOffRecordEdit.vue

@@ -1,128 +0,0 @@
-<template>
-    <div class="edit-view">
-        <el-form
-            :model="formData"
-            :rules="rules"
-            ref="form"
-            label-width="80px"
-            label-position="right"
-            size="small"
-            style="max-width: 500px;"
-        >
-            <el-form-item prop="userId" label="被核销人">
-                <el-input v-model="formData.nickname"></el-input>
-            </el-form-item>
-            <el-form-item prop="writeOffUserId" label="核销人">
-                <el-input v-model="formData.writeOffNickname"></el-input>
-            </el-form-item>
-            <el-form-item prop="content" label="核销内容">
-                <!--<el-input v-model="formData.content"></el-input>-->
-                <div v-for="item in formData.goods" :key="item.name">
-                    <el-col :span="16">
-                        <el-input v-model="item.name"></el-input>
-                    </el-col>
-                    <el-col :span="8">
-                        <el-input v-model="item.num"></el-input>
-                    </el-col>
-                </div>
-            </el-form-item>
-            <el-form-item prop="createdAt" label="核销时间">
-                <el-date-picker
-                    v-model="formData.createdAt"
-                    type="datetime"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    placeholder="选择日期时间"
-                >
-                </el-date-picker>
-            </el-form-item>
-            <!--<el-form-item prop="type" label="类别">
-                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
-                    <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
-                    </el-option>
-                </el-select>
-            </el-form-item>-->
-            <el-form-item>
-                <!--<el-button @click="onSave" :loading="saving" type="primary">保存</el-button>-->
-                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除</el-button>
-                <el-button @click="$router.go(-1)">返回</el-button>
-            </el-form-item>
-        </el-form>
-    </div>
-</template>
-<script>
-export default {
-    name: 'WriteOffRecordEdit',
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get('writeOffRecord/getDTO/' + this.$route.query.id)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-    },
-    data() {
-        return {
-            saving: false,
-            formData: {
-                goods: {}
-            },
-            rules: {},
-            typeOptions: [
-                { label: 'TEAM', value: 'TEAM' },
-                { label: 'PERSONAL', value: 'PERSONAL' }
-            ],
-            goods: []
-        };
-    },
-    methods: {
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            let data = { ...this.formData };
-
-            this.saving = true;
-            this.$http
-                .post('/writeOffRecord/save', data, { body: 'json' })
-                .then(res => {
-                    this.saving = false;
-                    this.$message.success('成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.saving = false;
-                    this.$message.error(e.error);
-                });
-        },
-        onDelete() {
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
-                .then(() => {
-                    return this.$http.post(`/writeOffRecord/del/${this.formData.id}`);
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error(e.error);
-                    }
-                });
-        }
-    }
-};
-</script>
-<style lang="less" scoped></style>

+ 0 - 170
src/main/vue/src/views/WriteOffRecordList.vue

@@ -1,170 +0,0 @@
-<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>
-        </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="100"> </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="createdAt" label="核销时间"> </el-table-column>
-            <!--<el-table-column prop="type" label="类别" :formatter="typeFormatter"> </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: 'WriteOffRecordList',
-    mixins: [pageableTable],
-    data() {
-        return {
-            multipleMode: false,
-            search: '',
-            url: '/writeOffRecord/all',
-            downloading: false,
-            typeOptions: [
-                { label: 'TEAM', value: 'TEAM' },
-                { label: 'PERSONAL', value: 'PERSONAL' }
-            ]
-        };
-    },
-    computed: {
-        selection() {
-            return this.$refs.table.selection.map(i => i.id);
-        }
-    },
-    methods: {
-        typeFormatter(row, column, cellValue, index) {
-            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
-            if (selectedOption) {
-                return selectedOption.label;
-            }
-            return '';
-        },
-        beforeGetData() {
-            return { search: this.search };
-        },
-        toggleMultipleMode(multipleMode) {
-            this.multipleMode = multipleMode;
-            if (!multipleMode) {
-                this.$refs.table.clearSelection();
-            }
-        },
-        addRow() {
-            this.$router.push({
-                path: '/writeOffRecordEdit',
-                query: {
-                    ...this.$route.query
-                }
-            });
-        },
-        editRow(row) {
-            this.$router.push({
-                path: '/writeOffRecordEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
-        download() {
-            this.downloading = true;
-            this.$axios
-                .get('/writeOffRecord/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(`/writeOffRecord/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>

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

@@ -1,5 +1,6 @@
 package com.izouma.jiashanxia.service;
 
+import com.izouma.jiashanxia.enums.PayMethod;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,6 +18,6 @@ public class WithdrawServiceTest {
 
     @Test
     public void apply() {
-        System.out.println(withdrawService.apply(40L, new BigDecimal("100"), "xxx", "xxx"));
+        System.out.println(withdrawService.apply(40L, new BigDecimal("100"), PayMethod.WEIXIN, "xxx", "xxx"));
     }
 }

+ 0 - 43
src/test/java/com/izouma/jiashanxia/service/WriteOffRecordServiceTest.java

@@ -1,43 +0,0 @@
-package com.izouma.jiashanxia.service;
-
-import com.alibaba.fastjson.JSONObject;
-import com.izouma.jiashanxia.domain.WriteOffRecord;
-import com.izouma.jiashanxia.dto.GoodsDTO;
-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.test.context.junit4.SpringRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class WriteOffRecordServiceTest {
-
-    @Autowired
-    private WriteOffRecordService writeOffRecordService;
-
-    @Test
-    public void writeOff() {
-        List<GoodsDTO> dtos = new ArrayList<>();
-        GoodsDTO dto1 = GoodsDTO.builder()
-                .goodsInfoId(11L)
-                .num(1L)
-                .build();
-        GoodsDTO dto2 = GoodsDTO.builder()
-                .goodsInfoId(12L)
-                .num(1L)
-                .build();
-        dtos.add(dto1);
-        dtos.add(dto2);
-
-        WriteOffRecord build = WriteOffRecord.builder()
-                .userId(46L)
-                .writeOffUserId(1L)
-                .content(JSONObject.toJSONString(dtos))
-                .build();
-        writeOffRecordService.save(build);
-    }
-}