Răsfoiți Sursa

Merge branch 'dev' of licailing/jiashanxia into master

panhui 4 ani în urmă
părinte
comite
7ad66fdc83
100 a modificat fișierele cu 3553 adăugiri și 12 ștergeri
  1. 19 0
      pom.xml
  2. 3 1
      src/main/java/com/izouma/jiashanxia/config/Constants.java
  3. 24 0
      src/main/java/com/izouma/jiashanxia/converter/EventConverter.java
  4. 25 0
      src/main/java/com/izouma/jiashanxia/converter/GoodsDTOListConverter.java
  5. 25 0
      src/main/java/com/izouma/jiashanxia/converter/SpecificationListConverter.java
  6. 36 0
      src/main/java/com/izouma/jiashanxia/domain/Address.java
  7. 21 0
      src/main/java/com/izouma/jiashanxia/domain/Article.java
  8. 43 0
      src/main/java/com/izouma/jiashanxia/domain/Attractions.java
  9. 20 0
      src/main/java/com/izouma/jiashanxia/domain/Banner.java
  10. 32 0
      src/main/java/com/izouma/jiashanxia/domain/Category.java
  11. 59 0
      src/main/java/com/izouma/jiashanxia/domain/CommissionRecord.java
  12. 38 0
      src/main/java/com/izouma/jiashanxia/domain/Company.java
  13. 45 0
      src/main/java/com/izouma/jiashanxia/domain/Coupon.java
  14. 30 0
      src/main/java/com/izouma/jiashanxia/domain/Feedback.java
  15. 54 0
      src/main/java/com/izouma/jiashanxia/domain/GoodsInfo.java
  16. 29 0
      src/main/java/com/izouma/jiashanxia/domain/GroupBuy.java
  17. 109 0
      src/main/java/com/izouma/jiashanxia/domain/OrderInfo.java
  18. 44 0
      src/main/java/com/izouma/jiashanxia/domain/OrderRefund.java
  19. 33 0
      src/main/java/com/izouma/jiashanxia/domain/OrderSnack.java
  20. 141 0
      src/main/java/com/izouma/jiashanxia/domain/Package.java
  21. 40 0
      src/main/java/com/izouma/jiashanxia/domain/PackageGoods.java
  22. 50 0
      src/main/java/com/izouma/jiashanxia/domain/ShoppingCart.java
  23. 54 0
      src/main/java/com/izouma/jiashanxia/domain/Snack.java
  24. 12 0
      src/main/java/com/izouma/jiashanxia/domain/Specification.java
  25. 37 0
      src/main/java/com/izouma/jiashanxia/domain/Stock.java
  26. 30 0
      src/main/java/com/izouma/jiashanxia/domain/Travel.java
  27. 47 0
      src/main/java/com/izouma/jiashanxia/domain/User.java
  28. 38 0
      src/main/java/com/izouma/jiashanxia/domain/UserCoupon.java
  29. 40 0
      src/main/java/com/izouma/jiashanxia/domain/UserPackage.java
  30. 62 0
      src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java
  31. 65 0
      src/main/java/com/izouma/jiashanxia/domain/Withdraw.java
  32. 31 0
      src/main/java/com/izouma/jiashanxia/domain/WxFee.java
  33. 39 0
      src/main/java/com/izouma/jiashanxia/dto/CommissionRecordDTO.java
  34. 34 0
      src/main/java/com/izouma/jiashanxia/dto/CompanyDTO.java
  35. 34 0
      src/main/java/com/izouma/jiashanxia/dto/CreateCart.java
  36. 45 0
      src/main/java/com/izouma/jiashanxia/dto/CreateOrder.java
  37. 45 0
      src/main/java/com/izouma/jiashanxia/dto/DelayOrder.java
  38. 18 0
      src/main/java/com/izouma/jiashanxia/dto/EmployeeDTO.java
  39. 21 0
      src/main/java/com/izouma/jiashanxia/dto/Event.java
  40. 16 0
      src/main/java/com/izouma/jiashanxia/dto/GoodsDTO.java
  41. 15 0
      src/main/java/com/izouma/jiashanxia/dto/GoodsVO.java
  42. 82 0
      src/main/java/com/izouma/jiashanxia/dto/OrderInfoDTO.java
  43. 69 0
      src/main/java/com/izouma/jiashanxia/dto/OrderInfoVO.java
  44. 26 0
      src/main/java/com/izouma/jiashanxia/dto/PackageDTO.java
  45. 21 0
      src/main/java/com/izouma/jiashanxia/dto/PackageGoodsDTO.java
  46. 47 0
      src/main/java/com/izouma/jiashanxia/dto/PackageGoodsVO.java
  47. 76 0
      src/main/java/com/izouma/jiashanxia/dto/PackageVO.java
  48. 22 0
      src/main/java/com/izouma/jiashanxia/dto/PromotionDTO.java
  49. 21 0
      src/main/java/com/izouma/jiashanxia/dto/StatisticDTO.java
  50. 50 0
      src/main/java/com/izouma/jiashanxia/dto/UserCouponDTO.java
  51. 50 0
      src/main/java/com/izouma/jiashanxia/dto/UserDTO.java
  52. 15 0
      src/main/java/com/izouma/jiashanxia/dto/UserPackageDTO.java
  53. 30 0
      src/main/java/com/izouma/jiashanxia/dto/UserPackageFlowVO.java
  54. 38 0
      src/main/java/com/izouma/jiashanxia/dto/WriteOffRecordDTO.java
  55. 40 0
      src/main/java/com/izouma/jiashanxia/dto/WriteOffSaveVO.java
  56. 5 0
      src/main/java/com/izouma/jiashanxia/enums/AuthorityName.java
  57. 16 0
      src/main/java/com/izouma/jiashanxia/enums/FlowType.java
  58. 12 0
      src/main/java/com/izouma/jiashanxia/enums/GoodType.java
  59. 17 0
      src/main/java/com/izouma/jiashanxia/enums/ItemType.java
  60. 33 0
      src/main/java/com/izouma/jiashanxia/enums/Member.java
  61. 24 0
      src/main/java/com/izouma/jiashanxia/enums/OrderInfoStatus.java
  62. 6 0
      src/main/java/com/izouma/jiashanxia/enums/PackageType.java
  63. 17 0
      src/main/java/com/izouma/jiashanxia/enums/PayMethod.java
  64. 18 0
      src/main/java/com/izouma/jiashanxia/enums/RefundStatus.java
  65. 23 0
      src/main/java/com/izouma/jiashanxia/enums/TransactionType.java
  66. 16 0
      src/main/java/com/izouma/jiashanxia/enums/WithdrawStatus.java
  67. 21 0
      src/main/java/com/izouma/jiashanxia/repo/AddressRepo.java
  68. 19 0
      src/main/java/com/izouma/jiashanxia/repo/ArticleRepo.java
  69. 19 0
      src/main/java/com/izouma/jiashanxia/repo/AttractionsRepo.java
  70. 19 0
      src/main/java/com/izouma/jiashanxia/repo/BannerRepo.java
  71. 21 0
      src/main/java/com/izouma/jiashanxia/repo/CategoryRepo.java
  72. 29 0
      src/main/java/com/izouma/jiashanxia/repo/CommissionRecordRepo.java
  73. 18 0
      src/main/java/com/izouma/jiashanxia/repo/CompanyRepo.java
  74. 22 0
      src/main/java/com/izouma/jiashanxia/repo/CouponRepo.java
  75. 16 0
      src/main/java/com/izouma/jiashanxia/repo/FeedbackRepo.java
  76. 19 0
      src/main/java/com/izouma/jiashanxia/repo/GoodsInfoRepo.java
  77. 39 0
      src/main/java/com/izouma/jiashanxia/repo/OrderInfoRepo.java
  78. 22 0
      src/main/java/com/izouma/jiashanxia/repo/OrderRefundRepo.java
  79. 32 0
      src/main/java/com/izouma/jiashanxia/repo/PackageGoodsRepo.java
  80. 38 0
      src/main/java/com/izouma/jiashanxia/repo/PackageRepo.java
  81. 16 0
      src/main/java/com/izouma/jiashanxia/repo/ShoppingCartRepo.java
  82. 19 0
      src/main/java/com/izouma/jiashanxia/repo/StockRepo.java
  83. 16 0
      src/main/java/com/izouma/jiashanxia/repo/UserCouponRepo.java
  84. 22 0
      src/main/java/com/izouma/jiashanxia/repo/UserPackageFlowRepo.java
  85. 42 0
      src/main/java/com/izouma/jiashanxia/repo/UserPackageRepo.java
  86. 36 4
      src/main/java/com/izouma/jiashanxia/repo/UserRepo.java
  87. 25 0
      src/main/java/com/izouma/jiashanxia/repo/WithdrawRepo.java
  88. 23 0
      src/main/java/com/izouma/jiashanxia/repo/WxFeeRepo.java
  89. 9 5
      src/main/java/com/izouma/jiashanxia/security/JwtTokenUtil.java
  90. 1 1
      src/main/java/com/izouma/jiashanxia/security/JwtUser.java
  91. 1 1
      src/main/java/com/izouma/jiashanxia/security/JwtUserDetailsService.java
  92. 20 0
      src/main/java/com/izouma/jiashanxia/service/AddressService.java
  93. 20 0
      src/main/java/com/izouma/jiashanxia/service/ArticleService.java
  94. 20 0
      src/main/java/com/izouma/jiashanxia/service/AttractionsService.java
  95. 20 0
      src/main/java/com/izouma/jiashanxia/service/BannerService.java
  96. 20 0
      src/main/java/com/izouma/jiashanxia/service/CategoryService.java
  97. 200 0
      src/main/java/com/izouma/jiashanxia/service/CommissionRecordService.java
  98. 182 0
      src/main/java/com/izouma/jiashanxia/service/CompanyService.java
  99. 110 0
      src/main/java/com/izouma/jiashanxia/service/ConsumptionService.java
  100. 40 0
      src/main/java/com/izouma/jiashanxia/service/CouponService.java

+ 19 - 0
pom.xml

@@ -266,6 +266,25 @@
             <version>1.6.2</version>
         </dependency>
 
+        <!-- hutool -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv-platform</artifactId>
+            <version>1.5.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.coobird</groupId>
+            <artifactId>thumbnailator</artifactId>
+            <version>0.4.13</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 3 - 1
src/main/java/com/izouma/jiashanxia/config/Constants.java

@@ -11,7 +11,9 @@ public interface Constants {
 
     String DEFAULT_AVATAR = "https://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg";
 
-    String SMS_SIGN_NAME = "走马信息";
+    String SMS_SIGN_NAME = "天游佳处";
 
     String SMS_TEMPLATE_CODE_GENERIC = "SMS_175485688";
+
+    String SMS_TEMPLATE_CODE_NOTIFICATION = "SMS_211489622";
 }

+ 24 - 0
src/main/java/com/izouma/jiashanxia/converter/EventConverter.java

@@ -0,0 +1,24 @@
+package com.izouma.jiashanxia.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.jiashanxia.dto.Event;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+
+public class EventConverter implements AttributeConverter<Event, String> {
+    @Override
+    public String convertToDatabaseColumn(Event event) {
+        if (event != null  )
+            return JSON.toJSONString(event);
+        return null;
+    }
+
+    @Override
+    public Event convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseObject(s, Event.class);
+        }
+        return null;
+    }
+}

+ 25 - 0
src/main/java/com/izouma/jiashanxia/converter/GoodsDTOListConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.jiashanxia.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.jiashanxia.dto.GoodsDTO;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class GoodsDTOListConverter implements AttributeConverter<List<GoodsDTO>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<GoodsDTO> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<GoodsDTO> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseArray(s, GoodsDTO.class);
+        }
+        return null;
+    }
+}

+ 25 - 0
src/main/java/com/izouma/jiashanxia/converter/SpecificationListConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.jiashanxia.converter;
+
+import com.alibaba.fastjson.JSON;
+import com.izouma.jiashanxia.domain.Specification;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+import java.util.List;
+
+public class SpecificationListConverter implements AttributeConverter<List<Specification>, String> {
+    @Override
+    public String convertToDatabaseColumn(List<Specification> list) {
+        if (list != null)
+            return JSON.toJSONString(list);
+        return null;
+    }
+
+    @Override
+    public List<Specification> convertToEntityAttribute(String s) {
+        if (StringUtils.isNotEmpty(s)) {
+            return JSON.parseArray(s, Specification.class);
+        }
+        return null;
+    }
+}

+ 36 - 0
src/main/java/com/izouma/jiashanxia/domain/Address.java

@@ -0,0 +1,36 @@
+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 javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("收件地址")
+public class Address extends BaseEntity {
+    private Long userId;
+
+    private String name;
+
+    private String phone;
+
+    private String city;
+
+    private String province;
+
+    @ApiModelProperty(value = "详细地址")
+    private String address;
+
+    @Column(nullable = false)
+    private Boolean isDefault = false;
+
+}

+ 21 - 0
src/main/java/com/izouma/jiashanxia/domain/Article.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Article extends BaseEntity {
+    private String name;
+
+    @Column(columnDefinition = "text")
+    private String content;
+}

+ 43 - 0
src/main/java/com/izouma/jiashanxia/domain/Attractions.java

@@ -0,0 +1,43 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.converter.StringArrayConverter;
+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.Where;
+
+import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("景区管理")
+@Where(clause = " del = 0 ")
+public class Attractions extends BaseEntity {
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "介绍")
+    private String introduction;
+
+    @ApiModelProperty(value = "地址")
+    private String address;
+
+    @ApiModelProperty(value = "电话")
+    private String phone;
+
+    @Convert(converter = StringArrayConverter.class)
+    @Column(columnDefinition = "TEXT")
+    private List<String> img;
+
+    @ApiModelProperty(value = "是否是品牌")
+    private boolean brand;
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/domain/Banner.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class Banner extends BaseEntity {
+    private String name;
+    private String img;
+    private String extra;
+    private int sort;
+}

+ 32 - 0
src/main/java/com/izouma/jiashanxia/domain/Category.java

@@ -0,0 +1,32 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel("分类设置")
+public class Category extends BaseEntity {
+
+    private String name;
+
+    private String img;
+
+    private Long parent;
+
+    private int flag;
+
+    @OneToMany
+    @JoinColumn(name = "parent", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    List<Category> children;
+
+}

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

@@ -0,0 +1,59 @@
+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.TransactionType;
+import com.izouma.jiashanxia.enums.WithdrawStatus;
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Builder
+@Data
+@Where(clause = "del = 0")
+@ApiModel(value = "佣金记录", description = "CommissionRecord")
+public class CommissionRecord extends BaseEntity implements Serializable {
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "交易类型", name = "transactionType")
+    private TransactionType transactionType;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "交易金额", name = "money")
+    private BigDecimal amount;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "支付方式", name = "payMethod")
+    private PayMethod payMethod;
+
+    @Searchable
+    @ApiModelProperty(value = "交易id", name = "transactionId")
+    private String transactionId;
+
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
+
+    @ExcelIgnore
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User user;
+
+    private Long fromUserId;
+}

+ 38 - 0
src/main/java/com/izouma/jiashanxia/domain/Company.java

@@ -0,0 +1,38 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.annotations.Searchable;
+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.Where;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ApiModel(value = "企业表")
+@Where(clause = "del = 0")
+public class Company extends BaseEntity implements Serializable {
+
+    private Long userId;
+
+    @Searchable
+    @ApiModelProperty(value = "企业名称")
+    private String name;
+
+    private BigDecimal amount;
+
+    @Transient
+    private List<Long> employee;
+}

+ 45 - 0
src/main/java/com/izouma/jiashanxia/domain/Coupon.java

@@ -0,0 +1,45 @@
+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.Where;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@ApiModel("优惠券")
+@Where(clause = "del = 0")
+public class Coupon extends BaseEntity {
+    @ApiModelProperty(value = "品牌")
+    private Long attractionsId;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "小标题")
+    private String title;
+
+    private BigDecimal price;
+
+    private String content;
+
+    @ApiModelProperty(value = "有效期")
+    private LocalDateTime period;
+
+    @ApiModelProperty(value = "适用门店")
+    private String store;
+
+    @Transient
+    private String attractionsName;
+}

+ 30 - 0
src/main/java/com/izouma/jiashanxia/domain/Feedback.java

@@ -0,0 +1,30 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.converter.StringArrayConverter;
+import io.swagger.annotations.ApiModel;
+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.*;
+import java.util.List;
+
+@Data
+@Entity
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "反馈")
+public class Feedback extends BaseEntity {
+    private Long         userId;
+    private String       content;
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> img;
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User         user;
+}

+ 54 - 0
src/main/java/com/izouma/jiashanxia/domain/GoodsInfo.java

@@ -0,0 +1,54 @@
+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.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@Where(clause = "del = 0")
+@ApiModel("景区内商品")
+public class GoodsInfo extends BaseEntity {
+//    @Id
+//    @GeneratedValue(strategy = GenerationType.AUTO)
+//    private Long id;
+
+    private String name;
+
+    @ApiModelProperty(value = "价格", name = "price")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "单位", name = "unit")
+    private String unit;
+
+    @ApiModelProperty(value = "景区id")
+    private Long attractionsId;
+
+//    @ApiModelProperty(value = "类型")
+//    @Enumerated(EnumType.STRING)
+//    private ItemType type;
+
+//    @Builder.Default
+//    @Column(nullable = false)
+//    private Boolean del = false;
+
+    private Long categoryId;
+
+    private String img;
+
+    @Transient
+    private String attractionsName;
+
+    @Transient
+    private String categoryName;
+}

+ 29 - 0
src/main/java/com/izouma/jiashanxia/domain/GroupBuy.java

@@ -0,0 +1,29 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "团购")
+public class GroupBuy extends BaseEntity {
+    /*
+    没达到成团
+    团购流程
+     */
+
+    @ApiModelProperty(value = "发起人")
+    private Long createUserId;
+
+    @ApiModelProperty(value = "成功时间")
+    private LocalDateTime successTime;
+
+    @ApiModelProperty(value = "成团人数")
+    private Integer numberOfPeople;
+}

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

@@ -0,0 +1,109 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.annotations.Searchable;
+import com.izouma.jiashanxia.enums.GoodType;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
+import com.izouma.jiashanxia.enums.PayMethod;
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Where(clause = "del = 0")
+@ApiModel(value = "订单")
+public class OrderInfo extends BaseEntity {
+
+    private Long userId;
+
+    @ApiModelProperty(value = "支付方式")
+    private PayMethod payMethod;
+
+    @ApiModelProperty(value = "支付时间")
+    private LocalDateTime paidAt;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "订单状态")
+    private OrderInfoStatus status;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @Searchable
+    @ApiModelProperty(value = "订单号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "交易单号")
+    private String transactionId;
+
+    @Searchable
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "充值套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "价钱")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "用户端是否显示")
+    private boolean userDel;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    private User user;
+
+//    private boolean isUse;
+
+    @ApiModelProperty(value = "分享此链接的用户")
+    private Long parentUserId;
+
+    @ApiModelProperty(value = "多次使用")
+    private boolean repeatedly;
+
+    @ApiModelProperty(value = "选择的规格Id")
+    private Long stockId;
+
+    @ApiModelProperty(value = "规格")
+    private String specification;
+
+    @ApiModelProperty(value = "日期")
+    private LocalDate day;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+//    @ApiModelProperty(value = "区分是哪种订单")
+//    @Enumerated(EnumType.STRING)
+//    private GoodType goodType;
+
+//    @ApiModelProperty(value = "物流")
+//    private String logistic;
+//
+//    @ApiModelProperty(value = "物流单号")
+//    private String trackingNumber;
+}

+ 44 - 0
src/main/java/com/izouma/jiashanxia/domain/OrderRefund.java

@@ -0,0 +1,44 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.enums.RefundStatus;
+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.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "订单退款")
+public class OrderRefund extends BaseEntity {
+    @ApiModelProperty(value = "订单id")
+    private Long orderInfoId;
+
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    private RefundStatus status;
+
+    @ApiModelProperty(value = "申请时间", name = "applyTime")
+    private LocalDateTime applyTime;
+
+    @ApiModelProperty(value = "审核时间", name = "auditTime")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty(value = "退款时间", name = "refundTime")
+    private LocalDateTime refundTime;
+
+    @ApiModelProperty(value = "退款单号", name = "refundId")
+    private String refundId;
+}

+ 33 - 0
src/main/java/com/izouma/jiashanxia/domain/OrderSnack.java

@@ -0,0 +1,33 @@
+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 java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单内商品")
+public class OrderSnack extends BaseEntity {
+    @ApiModelProperty(value = "购物车id")
+    private Long shoppingCardId;
+
+    private Long orderId;
+
+    private Long packageId;
+
+    private String specification;
+
+    private LocalDate day;
+
+    private BigDecimal price;
+
+
+}

+ 141 - 0
src/main/java/com/izouma/jiashanxia/domain/Package.java

@@ -0,0 +1,141 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.converter.EventConverter;
+import com.izouma.jiashanxia.converter.LongArrayConverter;
+import com.izouma.jiashanxia.converter.StringArrayConverter;
+import com.izouma.jiashanxia.dto.Event;
+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.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@Builder
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "套餐信息")
+@Where(clause = "del = 0")
+public class Package extends BaseEntity {
+    @ApiModelProperty(value = "景区id")
+    private Long attractionsId;
+
+    @ApiModelProperty(value = "套餐名称")
+    private String name;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "套餐标签")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> tag;
+
+    @ApiModelProperty(value = "金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "原价")
+    private BigDecimal originalPrice;
+
+    @ApiModelProperty(value = "结算价")
+    private BigDecimal settlementPrice;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty(value = "详情")
+    private String detail;
+
+//    @Enumerated(EnumType.STRING)
+//    @ApiModelProperty(value = "套餐类型")
+//    private PackageType type;
+
+//    @ApiModelProperty(value = "区分是哪种类型")
+//    @Enumerated(EnumType.STRING)
+//    private GoodType goodType;
+
+    @ApiModelProperty(value = "套餐分类")
+    private Long categoryId;
+
+    @ApiModelProperty(value = "图")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> img;
+
+    @ApiModelProperty(value = "多次使用")
+    private boolean repeatedly;
+
+    @ApiModelProperty(value = "是否单独分销")
+    private boolean separateDistribution;
+
+    @ApiModelProperty(value = "直推奖励比例")
+    private BigDecimal personalRatio0;
+
+    @ApiModelProperty(value = "间推奖励比例")
+    private BigDecimal personalRatio1;
+
+    @ApiModelProperty(value = "大团长推大团长比例")
+    private BigDecimal personalRatio2;
+
+    @ApiModelProperty(value = "可获得的优惠券id")
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> couponId;
+
+    @ApiModelProperty(value = "推广海报")
+    private String poster;
+
+    @Convert(converter = StringArrayConverter.class)
+    @ApiModelProperty(value = "多图海报")
+    private List<String> smallPoster;
+
+    @ApiModelProperty(value = "分享文案")
+    private String share;
+
+    @ApiModelProperty(value = "活动流程")
+    @Column(columnDefinition = "TEXT")
+    private String workflow;
+
+    @ApiModelProperty(value = "注意事项")
+    @Column(columnDefinition = "TEXT")
+    private String note;
+
+    private boolean IDNo;
+
+    private boolean realName;
+
+    private boolean buyPhone;
+
+    @ApiModelProperty(value = "销量")
+    private int sale;
+
+    @ApiModelProperty(value = "库存")
+    private int inventory;
+
+    @ApiModelProperty(value = "分享数")
+    private int shareNum;
+
+    @ApiModelProperty(value = "活动信息")
+    @Convert(converter = EventConverter.class)
+    private Event event;
+
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty(value = "费用说明")
+    private String expenseDescription;
+
+    @Transient
+    private String attractionsName;
+
+    @Transient
+    private String categoryName;
+
+    @Transient
+    @ApiModelProperty(value = "分享得")
+    private BigDecimal shareAmount;
+
+    private int sort;
+
+}

+ 40 - 0
src/main/java/com/izouma/jiashanxia/domain/PackageGoods.java

@@ -0,0 +1,40 @@
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "套餐商品")
+@Where(clause = "del = 0")
+public class PackageGoods extends BaseEntity {
+    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;
+
+}

+ 50 - 0
src/main/java/com/izouma/jiashanxia/domain/ShoppingCart.java

@@ -0,0 +1,50 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+public class ShoppingCart extends BaseEntity {
+
+    private Long userId;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "价钱")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "分享此链接的用户")
+    private Long parentUserId;
+
+    @ApiModelProperty(value = "选择的规格Id")
+    private Long stockId;
+
+//    @ApiModelProperty(value = "规格")
+//    private String specification;
+
+//    @ApiModelProperty(value = "日期")
+//    private LocalDate day;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+}

+ 54 - 0
src/main/java/com/izouma/jiashanxia/domain/Snack.java

@@ -0,0 +1,54 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.converter.StringArrayConverter;
+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.Column;
+import javax.persistence.Convert;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel("零食")
+public class Snack extends BaseEntity {
+    private String name;
+
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "库存")
+    private long inventory;
+
+    @ApiModelProperty(value = "套餐标签")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> tag;
+
+    @ApiModelProperty(value = "图")
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = StringArrayConverter.class)
+    private List<String> img;
+
+    private String content;
+
+    @ApiModelProperty(value = "是否单独分销")
+    private boolean separateDistribution;
+
+    @ApiModelProperty(value = "108将奖励比例")
+    private BigDecimal generalRatio;
+
+    @ApiModelProperty(value = "创客奖励比例")
+    private BigDecimal makerRatio;
+
+    @ApiModelProperty(value = "直推奖励比例")
+    private BigDecimal personalRatio0;
+
+    @ApiModelProperty(value = "间推奖励比例")
+    private BigDecimal personalRatio1;
+}

+ 12 - 0
src/main/java/com/izouma/jiashanxia/domain/Specification.java

@@ -0,0 +1,12 @@
+package com.izouma.jiashanxia.domain;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+@Data
+@NoArgsConstructor
+public class Specification {
+    private String name;
+    private BigDecimal price;
+}

+ 37 - 0
src/main/java/com/izouma/jiashanxia/domain/Stock.java

@@ -0,0 +1,37 @@
+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.Where;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@Where(clause = "del = 0")
+@ApiModel(value = "销量库存")
+public class Stock extends BaseEntity {
+    private Long       packageId;
+    @ApiModelProperty(value = "规格")
+    private String     specification;
+    @ApiModelProperty(value = "日期")
+    private LocalDate  day;
+    @ApiModelProperty(value = "库存")
+    private int        inventory;
+    @ApiModelProperty(value = "销售")
+    private int        sale;
+    private BigDecimal price;
+    @ApiModelProperty(value = "原价")
+    private BigDecimal originalPrice;
+    @ApiModelProperty(value = "结算价")
+    private BigDecimal settlementPrice;
+}

+ 30 - 0
src/main/java/com/izouma/jiashanxia/domain/Travel.java

@@ -0,0 +1,30 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "游记")
+public class Travel extends BaseEntity {
+    private Long userId;
+
+    private String title;
+
+    @Column(columnDefinition = "TEXT")
+    private String content;
+
+    private String address;
+
+    private List<String> tag;
+
+    private long like;
+}

+ 47 - 0
src/main/java/com/izouma/jiashanxia/domain/User.java

@@ -4,19 +4,25 @@ import com.alibaba.excel.annotation.ExcelIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.izouma.jiashanxia.annotations.Searchable;
 import com.izouma.jiashanxia.config.Constants;
+import com.izouma.jiashanxia.enums.Member;
 import com.izouma.jiashanxia.security.Authority;
 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.BatchSize;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
 
 import javax.persistence.*;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 @Data
@@ -69,5 +75,46 @@ public class User extends BaseEntity implements Serializable {
 
     private String email;
 
+    @ApiModelProperty(value = "可提现收益")
+    private BigDecimal amount;
 
+    @ApiModelProperty(value = "暂存")
+    private BigDecimal cacheAmount;
+
+    @ApiModelProperty(value = "已提现收益")
+    private BigDecimal withdraw;
+
+    private Long parent;
+
+    @ApiModelProperty(value = "企业id")
+    private Long companyId;
+
+    /*
+    绑定核销人员时需要
+     */
+    @ApiModelProperty(value = "品牌/企业id")
+    private Long attractionsId;
+
+    @ApiModelProperty(value = "是否团队创始人")
+    private Boolean teamFounder;
+
+    @ApiModelProperty("是否微信授权")
+    private boolean wxAuthorized;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "会员类型")
+    private Member member;
+
+    private boolean isVip;
+
+    @Transient
+    private String sessionKey;
+
+//    @ManyToOne(fetch = FetchType.LAZY)
+//    @JoinColumn(name = "companyId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+//    @NotFound(action = NotFoundAction.IGNORE)
+//    private Company company;
+
+    @ApiModelProperty("分享图片")
+    private String shareImg;
 }

+ 38 - 0
src/main/java/com/izouma/jiashanxia/domain/UserCoupon.java

@@ -0,0 +1,38 @@
+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.Where;
+
+import javax.persistence.Entity;
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@ApiModel("用户优惠券")
+@Where(clause = "del = 0")
+public class UserCoupon extends BaseEntity {
+    private Long userId;
+
+    private Long couponId;
+
+    @ApiModelProperty(value = "是否已使用")
+    private boolean isUse;
+
+    private LocalDateTime useTime;
+
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    @ApiModelProperty(value = "有效期")
+    private LocalDateTime period;
+
+
+}

+ 40 - 0
src/main/java/com/izouma/jiashanxia/domain/UserPackage.java

@@ -0,0 +1,40 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.enums.PackageType;
+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.Where;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "用户套餐内容")
+@Where(clause = "del = 0")
+public class UserPackage extends BaseEntity {
+
+    private Long userId;
+
+//    @ApiModelProperty(value = "用户套餐id")
+//    private Long userPackagePeriodId;
+
+    private Long goodsInfoId;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    private String remark;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "套餐类型")
+    private PackageType type;
+}

+ 62 - 0
src/main/java/com/izouma/jiashanxia/domain/UserPackageFlow.java

@@ -0,0 +1,62 @@
+package com.izouma.jiashanxia.domain;
+
+import com.izouma.jiashanxia.converter.GoodsDTOListConverter;
+import com.izouma.jiashanxia.dto.GoodsDTO;
+import com.izouma.jiashanxia.enums.FlowType;
+import com.izouma.jiashanxia.enums.PackageType;
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ApiModel(value = "套餐流水")
+@Where(clause = "del = 0")
+public class UserPackageFlow extends BaseEntity {
+    private Long userId;
+
+    @Enumerated(EnumType.STRING)
+    private FlowType type;
+
+//    @ApiModelProperty(value = "套餐分类")
+//    private Long categoryId;
+
+    @Enumerated(EnumType.STRING)
+    private PackageType packageType;
+
+    private Long orderInfoId;
+
+    /*
+    存储内容
+    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1},{"goodsInfoId":13,"num":4}]
+     */
+    @Column(columnDefinition = "TEXT")
+//    private String content;
+    @Convert(converter = GoodsDTOListConverter.class)
+    private List<GoodsDTO> 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;
+}

+ 65 - 0
src/main/java/com/izouma/jiashanxia/domain/Withdraw.java

@@ -0,0 +1,65 @@
+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;
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Entity
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(value = "提现申请表")
+@Where(clause = "del = 0")
+public class Withdraw extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "提现金额", name = "amount")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "剩余金额", name = "balance")
+    private BigDecimal balance;
+
+    @ApiModelProperty(value = "审核时间", name = "auditTime")
+    private LocalDateTime auditTime;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "提现方式", name = "payMethod")
+    private PayMethod payMethod;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "提现状态", name = "status")
+    private WithdrawStatus status;
+
+    @Searchable
+    @ApiModelProperty(value = "账号", name = "account")
+    private String account;
+
+    @Searchable
+    @ApiModelProperty(value = "真实姓名", name = "realName")
+    private String realName;
+
+    @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;
+
+}

+ 31 - 0
src/main/java/com/izouma/jiashanxia/domain/WxFee.java

@@ -0,0 +1,31 @@
+package com.izouma.jiashanxia.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Entity;
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+public class WxFee extends BaseEntity {
+    private Long       userId;
+    private Long       orderId;
+    private String     transactionId;
+//    private Boolean    isRefund;
+    @ApiModelProperty(value = "操作")
+    /*
+    0 收入 1 退款 2 提现
+     */
+    private int        action;
+    private BigDecimal amount;
+    private String     remark;
+    private String     type;
+}

+ 39 - 0
src/main/java/com/izouma/jiashanxia/dto/CommissionRecordDTO.java

@@ -0,0 +1,39 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.enums.TransactionType;
+import com.izouma.jiashanxia.enums.WithdrawStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ApiModel(value = "佣金记录", description = "CommissionRecord")
+public class CommissionRecordDTO implements Serializable {
+    private Long id;
+
+    @ApiModelProperty(value = "用户ID", name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "交易类型", name = "transactionType")
+    private TransactionType transactionType;
+
+    @ApiModelProperty(value = "交易金额", name = "money")
+    private BigDecimal amount;
+
+    private String remark;
+
+    private WithdrawStatus withdrawStatus;
+
+    private LocalDateTime createdAt;
+
+}

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

@@ -0,0 +1,34 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.Company;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ApiModel(value = "企业表")
+public class CompanyDTO {
+    private Long id;
+
+    private Long userId;
+
+    private String name;
+
+    private BigDecimal amount;
+
+    private String nickname;
+
+    public CompanyDTO(Company company) {
+        this.id = company.getId();
+        this.userId = company.getUserId();
+        this.name = company.getName();
+        this.amount = company.getAmount();
+    }
+}

+ 34 - 0
src/main/java/com/izouma/jiashanxia/dto/CreateCart.java

@@ -0,0 +1,34 @@
+package com.izouma.jiashanxia.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class CreateCart {
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "分享此链接的用户")
+    private Long parentUserId;
+
+    @ApiModelProperty(value = "选择的规格Id")
+    private Long stockId;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+}

+ 45 - 0
src/main/java/com/izouma/jiashanxia/dto/CreateOrder.java

@@ -0,0 +1,45 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.enums.PayMethod;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CreateOrder {
+
+    @ApiModelProperty(value = "支付方式")
+    private PayMethod payMethod;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "充值套餐")
+    private Long packageId;
+
+//    @ApiModelProperty(value = "价钱")
+//    private BigDecimal price;
+
+    private Long parentUserId;
+
+    @ApiModelProperty(value = "选择的规格Id")
+    private Long stockId;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 45 - 0
src/main/java/com/izouma/jiashanxia/dto/DelayOrder.java

@@ -0,0 +1,45 @@
+package com.izouma.jiashanxia.dto;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.TimeUnit;
+
+@Data
+public class DelayOrder implements Delayed {
+    /**
+     * 单号
+     */
+    private Long          orderInfoId;
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 过期时间(单位为毫秒,这里表示10秒)
+     */
+    private static final long expireTime = 3 * 60 * 1000;
+
+    @Override
+    public boolean equals(Object object) {
+        if (object instanceof DelayOrder) {
+            DelayOrder o = (DelayOrder) object;
+            return orderInfoId != null && o.orderInfoId != null && orderInfoId.equals(o.orderInfoId);
+        }
+        return false;
+    }
+
+    @Override
+    public long getDelay(TimeUnit unit) {
+        return unit.convert(this.createTime.toInstant(ZoneOffset.of("+8")).
+                toEpochMilli() + expireTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public int compareTo(Delayed o) {
+        return this.getCreateTime().compareTo(((DelayOrder) o).getCreateTime());
+    }
+}

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

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

+ 21 - 0
src/main/java/com/izouma/jiashanxia/dto/Event.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel("活动信息")
+public class Event {
+    private String date;
+    private String time;
+    private String address;
+    @ApiModelProperty(value = "活动对象")
+    private String crowd;
+}

+ 16 - 0
src/main/java/com/izouma/jiashanxia/dto/GoodsDTO.java

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoodsDTO {
+//    private Long    userPackageId;
+    private Long    goodsInfoId;
+    private Integer num;
+}

+ 15 - 0
src/main/java/com/izouma/jiashanxia/dto/GoodsVO.java

@@ -0,0 +1,15 @@
+package com.izouma.jiashanxia.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class GoodsVO {
+    private String  name;
+    private Integer num;
+}

+ 82 - 0
src/main/java/com/izouma/jiashanxia/dto/OrderInfoDTO.java

@@ -0,0 +1,82 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.annotations.Searchable;
+import com.izouma.jiashanxia.domain.BaseEntity;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
+import com.izouma.jiashanxia.enums.PayMethod;
+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 org.hibernate.annotations.Where;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "订单")
+public class OrderInfoDTO {
+    private Long          id;
+    private LocalDateTime createdAt;
+
+    private Long   userId;
+    private String nickname;
+
+    @ApiModelProperty(value = "支付方式")
+    private PayMethod payMethod;
+
+    @ApiModelProperty(value = "支付时间")
+    private LocalDateTime paidAt;
+
+    @ApiModelProperty(value = "订单状态")
+    private OrderInfoStatus status;
+
+    @ApiModelProperty(value = "数量")
+    private Integer num;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "交易单号")
+    private String transactionId;
+
+    @ApiModelProperty(value = "充值套餐")
+    private Long   packageId;
+    private String packName;
+    private String packImg;
+
+    @ApiModelProperty(value = "价钱")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "分享此链接的用户")
+    private Long   parentUserId;
+    private String parentNickname;
+
+    @ApiModelProperty(value = "规格")
+    private String specification;
+
+    @ApiModelProperty(value = "日期")
+    private LocalDate day;
+
+    @ApiModelProperty(value = "真实姓名")
+    private String realName;
+
+    @ApiModelProperty(value = "身份证")
+    private String IDNo;
+
+    @ApiModelProperty(value = "购买手机")
+    private String buyPhone;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}

+ 69 - 0
src/main/java/com/izouma/jiashanxia/dto/OrderInfoVO.java

@@ -0,0 +1,69 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
+import com.izouma.jiashanxia.enums.PayMethod;
+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;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "订单")
+public class OrderInfoVO {
+    private Long id;
+
+    private Long userId;
+
+    @ApiModelProperty(value = "支付方式")
+    private PayMethod payMethod;
+
+    @ApiModelProperty(value = "支付时间")
+    private LocalDateTime paidAt;
+
+    @ApiModelProperty(value = "订单状态")
+    private OrderInfoStatus status;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNumber;
+
+    @ApiModelProperty(value = "交易单号")
+    private String transactionId;
+
+    @ApiModelProperty(value = "名称")
+    private String name;
+
+    @ApiModelProperty(value = "充值套餐")
+    private Long packageId;
+
+    @ApiModelProperty(value = "价钱")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "规格")
+    private String specification;
+
+    @ApiModelProperty(value = "日期")
+    private LocalDate day;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    private User user;
+
+    private Package aPackage;
+
+    private LocalDateTime createdAt;
+
+//    private List<PackageGoodsDTO> goods;
+}

+ 26 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageDTO.java

@@ -0,0 +1,26 @@
+package com.izouma.jiashanxia.dto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public interface PackageDTO {
+    Long getId();
+
+    String getName();
+
+    String getTitle();
+
+    List<String> getTag();
+
+    BigDecimal getAmount();
+
+    String getDetail();
+
+    List<String> getImg();
+
+    boolean isRepeatedly();
+
+    String getAttractionsName();
+
+    String getCategoryName();
+}

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

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.dto;
+
+import java.math.BigDecimal;
+
+public interface PackageGoodsDTO {
+    Long getId();
+
+    Long getPackageId();
+
+    Long getGoodsInfoId();
+
+    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;
+    }
+
+}

+ 76 - 0
src/main/java/com/izouma/jiashanxia/dto/PackageVO.java

@@ -0,0 +1,76 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.Stock;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class PackageVO {
+    private Long id;
+
+    @ApiModelProperty(value = "套餐名称")
+    private String name;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "套餐标签")
+    private List<String> tag;
+
+    @ApiModelProperty(value = "金额")
+    private String amount;
+
+    @ApiModelProperty(value = "原价")
+    private String originalPrice;
+
+    @ApiModelProperty(value = "详情")
+    private String detail;
+
+    @ApiModelProperty(value = "图")
+    private List<String> img;
+
+    @ApiModelProperty(value = "活动流程")
+    private String workflow;
+
+    @ApiModelProperty(value = "注意事项")
+    private String note;
+
+    @ApiModelProperty(value = "销量")
+    private int sale;
+
+    @ApiModelProperty(value = "分享数")
+    private int shareNum;
+
+    @ApiModelProperty(value = "推广海报")
+    private String poster;
+
+    @ApiModelProperty(value = "多图海报")
+    private List<String> smallPoster;
+
+    @ApiModelProperty(value = "分享文案")
+    private String share;
+
+
+    @ApiModelProperty(value = "费用说明")
+    private String expenseDescription;
+
+    @ApiModelProperty(value = "活动日期")
+    private String eventDate;
+    @ApiModelProperty(value = "活动时间")
+    private String eventTime;
+    @ApiModelProperty(value = "活动地址")
+    private String eventAddress;
+    @ApiModelProperty(value = "活动对象")
+    private String eventCrowd;
+
+    @ApiModelProperty(value = "规格等")
+    private List<Stock> stocks;
+}

+ 22 - 0
src/main/java/com/izouma/jiashanxia/dto/PromotionDTO.java

@@ -0,0 +1,22 @@
+package com.izouma.jiashanxia.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "用户", description = "用户")
+public class PromotionDTO {
+    private Long   id;
+    private String username;
+    private String nickname;
+    private String avatar;
+    private String phone;
+    private Long   parent;
+    private String parentNickname;
+}

+ 21 - 0
src/main/java/com/izouma/jiashanxia/dto/StatisticDTO.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class StatisticDTO {
+    private Long       dayOrder;
+    private BigDecimal dayFee;
+    private BigDecimal dayWithdraw;
+    private BigDecimal dayRefund;
+    private LocalDate  date;
+}

+ 50 - 0
src/main/java/com/izouma/jiashanxia/dto/UserCouponDTO.java

@@ -0,0 +1,50 @@
+package com.izouma.jiashanxia.dto;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.izouma.jiashanxia.domain.BaseEntity;
+import com.izouma.jiashanxia.domain.UserCoupon;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@ApiModel("用户优惠券")
+public class UserCouponDTO {
+    private Long id;
+
+    private Long userId;
+
+    private String nickname;
+
+    private Long couponId;
+
+    private String couponName;
+
+    @ApiModelProperty(value = "是否已使用")
+    private boolean isUse;
+
+    private LocalDateTime useTime;
+
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    private String writeOffNickname;
+
+    @ApiModelProperty(value = "有效期")
+    private LocalDateTime period;
+
+    public UserCouponDTO(UserCoupon userCoupon, String nickname, String writeOffNickname, String couponName) {
+        BeanUtil.copyProperties(userCoupon, this);
+        this.nickname = nickname;
+        this.couponName = couponName;
+        this.writeOffNickname = writeOffNickname;
+    }
+}

+ 50 - 0
src/main/java/com/izouma/jiashanxia/dto/UserDTO.java

@@ -0,0 +1,50 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.enums.Member;
+import com.izouma.jiashanxia.security.Authority;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Set;
+
+@Data
+@NoArgsConstructor
+public class UserDTO {
+    private Long id;
+
+    private String nickname;
+
+    private String username;
+
+    private String parentName;
+
+    private String avatar;
+
+    private LocalDateTime createdAt;
+
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "会员类型")
+    private Member member;
+
+    private String attractionsName;
+
+    private Set<Authority> authorities;
+
+    public UserDTO(User user, String parentName, String attractionsName) {
+        this.id = user.getId();
+        this.nickname = user.getNickname();
+        this.username = user.getUsername();
+        this.parentName = parentName;
+        this.avatar = user.getAvatar();
+        this.createdAt = user.getCreatedAt();
+        this.amount = user.getAmount();
+        this.member = user.getMember();
+        this.attractionsName = attractionsName;
+        this.authorities = user.getAuthorities();
+    }
+}

+ 15 - 0
src/main/java/com/izouma/jiashanxia/dto/UserPackageDTO.java

@@ -0,0 +1,15 @@
+package com.izouma.jiashanxia.dto;
+
+public interface UserPackageDTO {
+    Long getId();
+
+//    Long getUserPackageId();
+
+    String getName();
+
+    String getUnit();
+
+    String getImg();
+
+    long getNum();
+}

+ 30 - 0
src/main/java/com/izouma/jiashanxia/dto/UserPackageFlowVO.java

@@ -0,0 +1,30 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.enums.FlowType;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+public class UserPackageFlowVO {
+    private Long id;
+
+    private Long userId;
+
+    private String nickname;
+
+    private String avatar;
+
+    private FlowType type;
+
+    private List<GoodsVO> content;
+
+    private LocalDateTime createdAt;
+}

+ 38 - 0
src/main/java/com/izouma/jiashanxia/dto/WriteOffRecordDTO.java

@@ -0,0 +1,38 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.enums.FlowType;
+import com.izouma.jiashanxia.enums.PackageType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "核销记录")
+public class WriteOffRecordDTO {
+
+    private Long id;
+
+    private FlowType type;
+
+    private PackageType packageType;
+
+    @ApiModelProperty(value = "被核销人")
+    private String nickname;
+
+    @ApiModelProperty(value = "核销人")
+    private String writeOffNickname;
+
+    private LocalDateTime createdAt;
+
+    private List<GoodsVO> goods;
+
+}

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

@@ -0,0 +1,40 @@
+package com.izouma.jiashanxia.dto;
+
+import com.izouma.jiashanxia.enums.PackageType;
+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 {
+
+    @ApiModelProperty(value = "被核销人")
+    private Long userId;
+
+    @ApiModelProperty(value = "核销人")
+    private Long writeOffUserId;
+
+    /*
+    单次使用传订单号
+     */
+    @ApiModelProperty(value = "订单号")
+    private Long orderInfoId;
+
+    /*
+    多次使用传内容
+    存储内容
+    [{"goodsInfoId":11,"num":1},{"goodsInfoId":12,"num":1}]
+     */
+    @Column(columnDefinition = "TEXT")
+    @ApiModelProperty(value = "核销内容")
+    private String content;
+
+}

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

@@ -3,6 +3,11 @@ package com.izouma.jiashanxia.enums;
 public enum AuthorityName {
     ROLE_USER("普通用户"),
     ROLE_DEV("开发者"),
+    ROLE_WRITER("核销者"),
+    ROLE_CREATOR("创建者"),
+    ROLE_ATTRACTIONS("景区管理员"),
+    ROLE_BRAND("优惠券品牌管理员"),
+    ROLE_EXPERT("团长"),
     ROLE_ADMIN("管理员");
     private final String description;
 

+ 16 - 0
src/main/java/com/izouma/jiashanxia/enums/FlowType.java

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.enums;
+
+public enum FlowType {
+    /*
+    购买
+     */
+    BUY,
+    /*
+    核销
+     */
+    WRITE_OFF,
+    /*
+    退款
+     */
+    REFUND
+}

+ 12 - 0
src/main/java/com/izouma/jiashanxia/enums/GoodType.java

@@ -0,0 +1,12 @@
+package com.izouma.jiashanxia.enums;
+
+public enum GoodType {
+    /*
+    旅游类型
+     */
+    TRAVEL,
+    /*
+    购物类型
+     */
+    SHOP
+}

+ 17 - 0
src/main/java/com/izouma/jiashanxia/enums/ItemType.java

@@ -0,0 +1,17 @@
+package com.izouma.jiashanxia.enums;
+
+public enum ItemType {
+    PLAY("游玩"),
+    FOOD("餐饮"),
+    LODGING("住宿");
+
+    private final String description;
+
+    ItemType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 33 - 0
src/main/java/com/izouma/jiashanxia/enums/Member.java

@@ -0,0 +1,33 @@
+package com.izouma.jiashanxia.enums;
+
+public enum Member {
+    /*
+    普通用户
+     */
+    NORMAL,
+    /*
+    团长
+     */
+    EXPERT,
+    /*
+    大团长,后台生成
+     */
+    BIG_EXPERT,
+    /*
+    108将
+     */
+    GENERAL,
+    /*
+    创客
+     */
+    MAKER,
+    /*
+    员工
+     */
+    EMPLOYEE,
+    /*
+    108将+创客
+     */
+    GENERAL_MAKER
+
+}

+ 24 - 0
src/main/java/com/izouma/jiashanxia/enums/OrderInfoStatus.java

@@ -0,0 +1,24 @@
+package com.izouma.jiashanxia.enums;
+
+public enum OrderInfoStatus {
+    UNPAID("未支付"),
+    PAID("已支付"),
+    CANCELLED("已取消"),
+    OFFLINE_PAID("线下已付"),
+    REFUNDED("已退款"),
+    REQUEST_REFUND("申请退款中"),
+    USED("已使用"),
+    SHIPPED("已发货"),
+    RECEIVED("已收货")
+    ;
+
+    private final String description;
+
+    OrderInfoStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 6 - 0
src/main/java/com/izouma/jiashanxia/enums/PackageType.java

@@ -0,0 +1,6 @@
+package com.izouma.jiashanxia.enums;
+
+public enum PackageType {
+    TEAM,
+    PERSONAL
+}

+ 17 - 0
src/main/java/com/izouma/jiashanxia/enums/PayMethod.java

@@ -0,0 +1,17 @@
+package com.izouma.jiashanxia.enums;
+
+public enum PayMethod {
+    WEIXIN("微信"),
+    ALI("支付宝"),
+    YUE("余额"),
+    OFFLINE("线下");
+    private final String description;
+
+    PayMethod(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 18 - 0
src/main/java/com/izouma/jiashanxia/enums/RefundStatus.java

@@ -0,0 +1,18 @@
+package com.izouma.jiashanxia.enums;
+
+public enum RefundStatus {
+    PENDING("待处理"),
+    REFUNDING("退款中"),
+    SUCCESS("成功"),
+    DENY("失败"),
+    CANCEL("取消退款");
+    private final String description;
+
+    RefundStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 23 - 0
src/main/java/com/izouma/jiashanxia/enums/TransactionType.java

@@ -0,0 +1,23 @@
+package com.izouma.jiashanxia.enums;
+
+public enum TransactionType {
+    WITHDRAW("提现"),
+    PROMOTE("推广新会员"),
+    CHILD_PROMOTE("下级推广新会员"),
+//    EXPERT("团长奖励"),
+    MAKER("创客奖励"),
+    GENERAL("108将奖励"),
+    EMPLOYEES_PROMOTE("员工推广新会员"),
+    REFUND("退款"),
+    ;
+
+    private final String description;
+
+    TransactionType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 16 - 0
src/main/java/com/izouma/jiashanxia/enums/WithdrawStatus.java

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.enums;
+
+public enum WithdrawStatus {
+    SUCCESS("提现成功"),
+    FAIL("提现失败"),
+    PENDING("待处理");
+    private final String description;
+
+    WithdrawStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 21 - 0
src/main/java/com/izouma/jiashanxia/repo/AddressRepo.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Address;
+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 AddressRepo extends JpaRepository<Address, Long>, JpaSpecificationExecutor<Address> {
+    @Query("update Address t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query("update Address a set a.isDefault = false where a.userId = ?1 and a.id <> ?2")
+    @Modifying
+    @Transactional
+    void updateDefault(Long userId, Long id);
+}

+ 19 - 0
src/main/java/com/izouma/jiashanxia/repo/ArticleRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Article;
+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;
+import java.util.Optional;
+
+public interface ArticleRepo extends JpaRepository<Article, Long>, JpaSpecificationExecutor<Article> {
+    @Query("update Article t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    Optional<Article> findFirstByName(String name);
+}

+ 19 - 0
src/main/java/com/izouma/jiashanxia/repo/AttractionsRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Attractions;
+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;
+import java.util.List;
+
+public interface AttractionsRepo extends JpaRepository<Attractions, Long>, JpaSpecificationExecutor<Attractions> {
+    @Query("update Attractions t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<Attractions> findAllByBrand(boolean brand);
+}

+ 19 - 0
src/main/java/com/izouma/jiashanxia/repo/BannerRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Banner;
+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 BannerRepo extends JpaRepository<Banner, Long>, JpaSpecificationExecutor<Banner> {
+    @Query("update Banner t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query(nativeQuery = true, value = "SELECT ifnull(max(sort + 1),1) FROM banner")
+    int nextSort();
+}

+ 21 - 0
src/main/java/com/izouma/jiashanxia/repo/CategoryRepo.java

@@ -0,0 +1,21 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Category;
+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;
+import java.util.List;
+
+public interface CategoryRepo extends JpaRepository<Category, Long>, JpaSpecificationExecutor<Category> {
+    @Query("update Category t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<Category> findAllByParentIsNull();
+
+    List<Category> findAllByParent(Long parent);
+}

+ 29 - 0
src/main/java/com/izouma/jiashanxia/repo/CommissionRecordRepo.java

@@ -0,0 +1,29 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.CommissionRecord;
+import com.izouma.jiashanxia.enums.TransactionType;
+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;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface CommissionRecordRepo extends JpaRepository<CommissionRecord, Long>, JpaSpecificationExecutor<CommissionRecord> {
+    @Query("update CommissionRecord t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<CommissionRecord> findAllByUserIdAndCreatedAtBetween(Long userId, LocalDateTime createdAt, LocalDateTime createdAt2);
+
+    List<CommissionRecord> findAllByTransactionId(String transactionId);
+
+    List<CommissionRecord> findAllByUserIdAndTransactionTypeNot(Long userId, TransactionType type);
+
+    @Query("select sum(c.amount) from CommissionRecord c where c.userId = ?1 and c.transactionType = ?2")
+    BigDecimal sumByUserId(Long userId, TransactionType type);
+}

+ 18 - 0
src/main/java/com/izouma/jiashanxia/repo/CompanyRepo.java

@@ -0,0 +1,18 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Company;
+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 CompanyRepo extends JpaRepository<Company, Long>, JpaSpecificationExecutor<Company> {
+    @Query("update Company t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    Company findByUserId(Long userId);
+}

+ 22 - 0
src/main/java/com/izouma/jiashanxia/repo/CouponRepo.java

@@ -0,0 +1,22 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Coupon;
+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;
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface CouponRepo extends JpaRepository<Coupon, Long>, JpaSpecificationExecutor<Coupon> {
+    @Query("update Coupon t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<Coupon> findAllByIdInAndPeriodAfter(Iterable<Long> id, LocalDateTime period);
+
+    List<Coupon> findAllByAttractionsId(Long attractionsId);
+}

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

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Feedback;
+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 FeedbackRepo extends JpaRepository<Feedback, Long>, JpaSpecificationExecutor<Feedback> {
+    @Query("update Feedback t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 19 - 0
src/main/java/com/izouma/jiashanxia/repo/GoodsInfoRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.GoodsInfo;
+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;
+import java.util.List;
+
+public interface GoodsInfoRepo extends JpaRepository<GoodsInfo, Long>, JpaSpecificationExecutor<GoodsInfo> {
+    @Query("update GoodsInfo t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<GoodsInfo> findAllByAttractionsId(Long attractionsId);
+}

+ 39 - 0
src/main/java/com/izouma/jiashanxia/repo/OrderInfoRepo.java

@@ -0,0 +1,39 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.OrderInfo;
+import com.izouma.jiashanxia.enums.OrderInfoStatus;
+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;
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecificationExecutor<OrderInfo> {
+    @Query("update OrderInfo t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query("update OrderInfo t set t.userDel = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void userDelete(Long id);
+
+    @Query(nativeQuery = true, value = "SELECT count(1) FROM order_info")
+    int orderNum();
+
+    long countByStatus(OrderInfoStatus status);
+
+    List<OrderInfo> findAllByPaidAtBetweenAndStatus(LocalDateTime paidAt, LocalDateTime paidAt2, OrderInfoStatus status);
+
+    long countByUserId(Long userId);
+
+    OrderInfo findByTransactionId(String transactionId);
+
+    List<OrderInfo> findAllByUserId(Long userId);
+
+    List<OrderInfo> findAllByStatus(OrderInfoStatus status);
+}

+ 22 - 0
src/main/java/com/izouma/jiashanxia/repo/OrderRefundRepo.java

@@ -0,0 +1,22 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.OrderRefund;
+import com.izouma.jiashanxia.enums.RefundStatus;
+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;
+import java.util.Optional;
+
+public interface OrderRefundRepo extends JpaRepository<OrderRefund, Long>, JpaSpecificationExecutor<OrderRefund> {
+    @Query("update OrderRefund t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    Optional<OrderRefund> findByOrderInfoIdAndStatus(Long orderInfoId, RefundStatus status);
+
+    OrderRefund findByRefundId(String refundId);
+}

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

@@ -0,0 +1,32 @@
+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;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface PackageGoodsRepo extends JpaRepository<PackageGoods, Long>, JpaSpecificationExecutor<PackageGoods> {
+    @Query("update PackageGoods t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<PackageGoods> findAllByPackageId(Long packageId);
+
+    @Query(value = "select gi.name,gi.unit," +
+            "gi.id AS goodsInfoId," +
+            "pg.id AS id,"+
+            "pg.package_id AS packageId,"+
+            "pg.remark AS remark,"+
+            "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);
+}

+ 38 - 0
src/main/java/com/izouma/jiashanxia/repo/PackageRepo.java

@@ -0,0 +1,38 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.dto.PackageDTO;
+import com.izouma.jiashanxia.enums.PackageType;
+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;
+import java.util.List;
+
+public interface PackageRepo extends JpaRepository<Package, Long>, JpaSpecificationExecutor<Package> {
+    @Query("update Package t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+//    List<Package> findAllByTypeAndDelFalse(PackageType type);
+
+    List<Package> findAllByAttractionsId(Long attractionsId);
+
+    @Query("select t.id from Package t where t.attractionsId = ?1")
+    List<Long> findAllIdByAttractionsId(Long attractionsId);
+
+    @Query(nativeQuery = true, value = "select p.*,a.name attractionsName,c.name categoryName " +
+            "from package p " +
+            "left join attractions a on p.attractions_id = a.id " +
+            "left join category c on c.id = p.category_id where p.id = ?1")
+    PackageDTO findInformationById(Long id);
+
+    @Query("update Package t set t.shareNum = t.shareNum + 1 where t.id = ?1")
+    Package addShareNum(Long id);
+
+    @Query(nativeQuery = true, value = "SELECT ifnull(max(sort + 1),1) FROM package")
+    int nextSort();
+}

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

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.ShoppingCart;
+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 ShoppingCartRepo extends JpaRepository<ShoppingCart, Long>, JpaSpecificationExecutor<ShoppingCart> {
+    @Query("update ShoppingCart t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 19 - 0
src/main/java/com/izouma/jiashanxia/repo/StockRepo.java

@@ -0,0 +1,19 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Stock;
+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;
+import java.util.List;
+
+public interface StockRepo extends JpaRepository<Stock, Long>, JpaSpecificationExecutor<Stock> {
+    @Query("update Stock t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<Stock> findAllByPackageId(Long packageId);
+}

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

@@ -0,0 +1,16 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.UserCoupon;
+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 UserCouponRepo extends JpaRepository<UserCoupon, Long>, JpaSpecificationExecutor<UserCoupon> {
+    @Query("update UserCoupon t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 22 - 0
src/main/java/com/izouma/jiashanxia/repo/UserPackageFlowRepo.java

@@ -0,0 +1,22 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.UserPackageFlow;
+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;
+import java.util.List;
+
+
+public interface UserPackageFlowRepo extends JpaRepository<UserPackageFlow, Long>, JpaSpecificationExecutor<UserPackageFlow> {
+    @Query("update UserPackageFlow t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<UserPackageFlow> findAllByUserIdOrderByCreatedAtDesc(Long userId);
+
+    UserPackageFlow findByOrderInfoId(Long orderInfoId);
+}

+ 42 - 0
src/main/java/com/izouma/jiashanxia/repo/UserPackageRepo.java

@@ -0,0 +1,42 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.UserPackage;
+import com.izouma.jiashanxia.dto.UserPackageDTO;
+import com.izouma.jiashanxia.enums.PackageType;
+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;
+import java.util.List;
+
+public interface UserPackageRepo extends JpaRepository<UserPackage, Long>, JpaSpecificationExecutor<UserPackage> {
+    @Query("update UserPackage t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<UserPackage> findAllByUserIdAndType(Long userId, PackageType type);
+
+    List<UserPackage> findAllByUserId(Long userId);
+
+//    List<UserPackage> findAllByUserPackagePeriodId(Long userPackagePeriodId);
+
+    @Query("update UserPackage t set t.userId = ?2 where t.userId = ?1 and t.type = 'TEAM'")
+    @Modifying
+    @Transactional
+    void updateUserId(Long oldUserId, Long newUserId);
+
+    @Query(value = "select goods_info.*, ifnull(user_package.num, 0) as num " +
+            "from goods_info " +
+            "left join user_package on goods_info.id = user_package.goods_info_id and user_package.user_id = ?1 " +
+            "where goods_info.del = 0", nativeQuery = true)
+    List<UserPackageDTO> userPackage(Long userId);
+
+    @Query(value = "select goods_info.*, ifnull(user_package.num, 0) as num " +
+            "from goods_info " +
+            "inner join user_package on goods_info.id = user_package.goods_info_id and user_package.user_id = ?1 " +
+            "where goods_info.del = 0 and user_package.type = ?2", nativeQuery = true)
+    List<UserPackageDTO> userPackageByType(Long userId, String type);
+}

+ 36 - 4
src/main/java/com/izouma/jiashanxia/repo/UserRepo.java

@@ -16,11 +16,43 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     @Query("update User u set u.del = true where u.id = ?1")
     void softDelete(Long id);
 
-    User findByUsername(String username);
+    User findByUsernameAndDelFalse(String username);
 
-    List<User> findAllByAuthoritiesContains(Authority authority);
+    List<User> findAllByAuthoritiesContainsAndDelFalse(Authority authority);
 
-    User findByOpenId(String openId);
+    User findByOpenIdAndDelFalse(String openId);
+
+    User findByPhoneAndDelFalse(String phone);
+
+    List<User> findAllByParentAndDelFalse(Long parent);
+
+    List<User> findAllByParentInAndDelFalse(Iterable<Long> parent);
+
+    List<User> findAllByCompanyIdAndDelFalse(Long companyId);
+
+    @Query("select u.id from User u  where u.parent = ?1")
+    List<Long> findIdByParentAndDelFalse(Long parent);
+
+    @Query("select u.id from User u  where u.parent in ?1")
+    List<Long> findIdByParentInAndDelFalse(Iterable<Long> parent);
+
+    long countByParentAndDelFalse(Long parentId);
+
+    List<User> findAllByCompanyIdIsNullAndDelFalse();
+
+    // 按企业id删用户
+    @Transactional
+    @Modifying
+    @Query("update User u set u.companyId = null where u.companyId = ?1")
+    void deleteCompanyId(Long companyId);
+
+    // 按用户id加企业
+    @Transactional
+    @Modifying
+    @Query("update User u set u.companyId = ?1 where u.id in ?2")
+    void updateCompanyId(Long companyId, Iterable<Long> ids);
+
+    // 按管理员搜索
+    List<User> findAllByTeamFounderTrueAndDelFalse();
 
-    User findByPhone(String phone);
 }

+ 25 - 0
src/main/java/com/izouma/jiashanxia/repo/WithdrawRepo.java

@@ -0,0 +1,25 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.Withdraw;
+import com.izouma.jiashanxia.enums.WithdrawStatus;
+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;
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface WithdrawRepo extends JpaRepository<Withdraw, Long>, JpaSpecificationExecutor<Withdraw> {
+    @Query("update Withdraw t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<Withdraw> findAllByUserId(Long userId);
+
+    List<Withdraw> findAllByStatus(WithdrawStatus status);
+
+    List<Withdraw> findAllByStatusAndUserIdAndAuditTimeBetween(WithdrawStatus status, Long userId, LocalDateTime auditTime, LocalDateTime auditTime2);
+}

+ 23 - 0
src/main/java/com/izouma/jiashanxia/repo/WxFeeRepo.java

@@ -0,0 +1,23 @@
+package com.izouma.jiashanxia.repo;
+
+import com.izouma.jiashanxia.domain.WxFee;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
+
+public interface WxFeeRepo extends JpaRepository<WxFee, String>, JpaSpecificationExecutor<WxFee> {
+
+    @Query(nativeQuery = true, value = "SELECT SUM(amount) FROM wx_fee WHERE action=0 and del = 0")
+    BigDecimal sumByAmount();
+
+    List<WxFee> findAllByCreatedAtBetween(LocalDateTime createdAt, LocalDateTime createdAt2);
+
+    List<WxFee> findAllByCreatedAtBetweenAndUserId(LocalDateTime createdAt, LocalDateTime createdAt2, Long userId);
+
+    Optional<WxFee> findByTransactionId(String transactionId);
+}

+ 9 - 5
src/main/java/com/izouma/jiashanxia/security/JwtTokenUtil.java

@@ -6,16 +6,20 @@ import io.jsonwebtoken.Clock;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.impl.DefaultClock;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Function;
 
 @Component
+@Slf4j
 public class JwtTokenUtil implements Serializable {
 
     private static final long serialVersionUID = -3301605591108950415L;
@@ -23,8 +27,6 @@ public class JwtTokenUtil implements Serializable {
     static final String CLAIM_KEY_USERNAME = "sub";
     static final String CLAIM_KEY_CREATED  = "iat";
 
-    @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "It's okay here")
-    private Clock     clock = DefaultClock.INSTANCE;
     private JwtConfig jwtConfig;
 
     public JwtTokenUtil(JwtConfig jwtConfig) {
@@ -57,7 +59,7 @@ public class JwtTokenUtil implements Serializable {
 
     private Boolean isTokenExpired(String token) {
         final Date expiration = getExpirationDateFromToken(token);
-        return expiration.before(clock.now());
+        return expiration.before(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()));
     }
 
     private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
@@ -75,9 +77,10 @@ public class JwtTokenUtil implements Serializable {
     }
 
     private String doGenerateToken(Map<String, Object> claims, String subject) {
-        final Date createdDate = clock.now();
+        final Date createdDate = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
         final Date expirationDate = calculateExpirationDate(createdDate);
 
+        log.info("doGenerateToken {}", createdDate);
         return Jwts.builder()
                 .setClaims(claims)
                 .setSubject(subject)
@@ -94,7 +97,7 @@ public class JwtTokenUtil implements Serializable {
     }
 
     public String refreshToken(String token) {
-        final Date createdDate = clock.now();
+        final Date createdDate = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
         final Date expirationDate = calculateExpirationDate(createdDate);
 
         final Claims claims = getAllClaimsFromToken(token);
@@ -122,4 +125,5 @@ public class JwtTokenUtil implements Serializable {
     private Date calculateExpirationDate(Date createdDate) {
         return new Date(createdDate.getTime() + jwtConfig.getExpiration() * 1000);
     }
+
 }

+ 1 - 1
src/main/java/com/izouma/jiashanxia/security/JwtUser.java

@@ -22,7 +22,7 @@ public class JwtUser implements UserDetails {
 
     public JwtUser(User user, Collection<? extends GrantedAuthority> authorities) {
         this.authorities = authorities;
-        this.lastPasswordResetDate = Date.from(user.getCreatedAt().atZone(ZoneId.systemDefault()).toInstant());
+        this.lastPasswordResetDate = Date.from(user.getCreatedAt().minusSeconds(10).atZone(ZoneId.systemDefault()).toInstant());
         this.user = user;
     }
 

+ 1 - 1
src/main/java/com/izouma/jiashanxia/security/JwtUserDetailsService.java

@@ -15,7 +15,7 @@ public class JwtUserDetailsService implements UserDetailsService {
 
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-        User user = userRepo.findByUsername(username);
+        User user = userRepo.findByUsernameAndDelFalse(username);
 
         if (user == null) {
             throw new UsernameNotFoundException(String.format("No user found with username '%s'.", username));

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/AddressService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Address;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.AddressRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AddressService {
+
+    private final AddressRepo addressRepo;
+
+    public Page<Address> all(PageQuery pageQuery) {
+        return addressRepo.findAll(JpaUtils.toSpecification(pageQuery, Address.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/ArticleService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Article;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.ArticleRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ArticleService {
+
+    private ArticleRepo articleRepo;
+
+    public Page<Article> all(PageQuery pageQuery) {
+        return articleRepo.findAll(JpaUtils.toSpecification(pageQuery, Article.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/AttractionsService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Attractions;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.AttractionsRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AttractionsService {
+
+    private AttractionsRepo attractionsRepo;
+
+    public Page<Attractions> all(PageQuery pageQuery) {
+        return attractionsRepo.findAll(JpaUtils.toSpecification(pageQuery, Attractions.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/BannerService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Banner;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.BannerRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class BannerService {
+
+    private BannerRepo bannerRepo;
+
+    public Page<Banner> all(PageQuery pageQuery) {
+        return bannerRepo.findAll(JpaUtils.toSpecification(pageQuery, Banner.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/CategoryService.java

@@ -0,0 +1,20 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Category;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.repo.CategoryRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class CategoryService {
+
+    private CategoryRepo categoryRepo;
+
+    public Page<Category> all(PageQuery pageQuery) {
+        return categoryRepo.findAll(JpaUtils.toSpecification(pageQuery, Category.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

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

@@ -0,0 +1,200 @@
+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.izouma.jiashanxia.domain.CommissionRecord;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.domain.Withdraw;
+import com.izouma.jiashanxia.dto.CommissionRecordDTO;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.enums.AuthorityName;
+import com.izouma.jiashanxia.enums.PayMethod;
+import com.izouma.jiashanxia.enums.TransactionType;
+import com.izouma.jiashanxia.repo.CommissionRecordRepo;
+import com.izouma.jiashanxia.repo.UserRepo;
+import com.izouma.jiashanxia.repo.WithdrawRepo;
+import com.izouma.jiashanxia.security.Authority;
+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.math.BigDecimal;
+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 CommissionRecordService {
+
+    private final CommissionRecordRepo commissionRecordRepo;
+    private final WithdrawService      withdrawService;
+    private final UserRepo             userRepo;
+    private final WithdrawRepo         withdrawRepo;
+
+    public Page<CommissionRecord> all(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
+        return commissionRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, CommissionRecord.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    后台列表
+     */
+    public Page<CommissionRecord> backAll(PageQuery pageQuery, User user) {
+        pageQuery.setSort("createdAt,desc");
+        Set<Authority> authorities = user.getAuthorities();
+        Map<String, Object> query = pageQuery.getQuery();
+        Object company = query.get("companyId");
+        query.remove("companyId");
+
+//        if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN)) && authorities.contains(Authority.get(AuthorityName.ROLE_CREATOR))) {
+//            Map<String, Object> query = pageQuery.getQuery();
+//            query.put("userId", user.getId());
+//        }
+        //return commissionRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, CommissionRecord.class), JpaUtils.toPageRequest(pageQuery));
+
+        return commissionRecordRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, CommissionRecord.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
+            }
+            if (!authorities.contains(Authority.get(AuthorityName.ROLE_ADMIN))) {
+                List<Long> userIds = userRepo.findAllByCompanyIdAndDelFalse(user.getCompanyId())
+                        .stream()
+                        .map(User::getId)
+                        .collect(Collectors.toList());
+                and.add(root.get("userId").in(userIds));
+            } else {
+                if (ObjectUtil.isNotEmpty(company)) {
+                    List<Long> userIds = userRepo.findAllByCompanyIdAndDelFalse(Long.parseLong(String.valueOf(company)))
+                            .stream()
+                            .map(User::getId)
+                            .collect(Collectors.toList());
+                    and.add(root.get("userId").in(userIds));
+                }
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+
+    }
+
+    public Page<CommissionRecord> backAll2(PageQuery pageQuery) {
+        pageQuery.setSort("createdAt,desc");
+        return commissionRecordRepo.findAll(((root, criteriaQuery, criteriaBuilder) -> {
+            List<Predicate> and = JpaUtils.toPredicates(pageQuery, CommissionRecord.class, root, criteriaQuery, criteriaBuilder);
+            if (StrUtil.isNotEmpty(pageQuery.getSearch())) {
+                withdrawService.getNickname(pageQuery.getSearch(), and, root, criteriaBuilder);
+            }
+            return criteriaBuilder.and(and.toArray(new Predicate[0]));
+        }), JpaUtils.toPageRequest(pageQuery));
+
+    }
+
+    /*
+    我的
+     */
+    public List<CommissionRecordDTO> my(Long userId) {
+        List<CommissionRecordDTO> my = new ArrayList<>();
+        List<CommissionRecord> recordList = commissionRecordRepo.findAllByUserIdAndTransactionTypeNot(userId, TransactionType.WITHDRAW);
+        Set<Long> fromUserId = recordList.stream().map(CommissionRecord::getFromUserId).collect(Collectors.toSet());
+        Map<Long, User> userMap = userRepo.findAllById(fromUserId)
+                .stream()
+                .collect(Collectors.toMap(User::getId, user -> user));
+        recordList.forEach(record -> {
+            CommissionRecordDTO dto = new CommissionRecordDTO();
+            BeanUtil.copyProperties(record, dto);
+            User fromUser = userMap.get(record.getFromUserId());
+            if (ObjectUtil.isNotEmpty(fromUser)) {
+                dto.setRemark(fromUser.getNickname());
+            }
+            my.add(dto);
+        });
+
+        List<Withdraw> withdraws = withdrawRepo.findAllByUserId(userId);
+        withdraws.forEach(withdraw ->
+                my.add(CommissionRecordDTO.builder()
+                        .id(withdraw.getId())
+                        .userId(userId)
+                        .amount(withdraw.getAmount().negate())
+                        .createdAt(withdraw.getCreatedAt())
+                        .remark("提现账号:" + withdraw.getAccount())
+                        .transactionType(TransactionType.WITHDRAW)
+                        .withdrawStatus(withdraw.getStatus())
+                        .build()
+                ));
+        my.sort((a, b) -> b.getCreatedAt().compareTo(a.getCreatedAt()));
+        return my;
+
+    }
+
+    // 退款佣金流水
+    public void refund(String orderId) {
+        List<CommissionRecord> records = commissionRecordRepo.findAllByTransactionId(orderId);
+        // 相关用户
+        Set<Long> ids = records.stream().map(CommissionRecord::getUserId).collect(Collectors.toSet());
+        Map<Long, User> userMap = userRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(User::getId, user -> user));
+
+        records.forEach(record -> {
+            User user = userMap.get(record.getUserId());
+            if (ObjectUtil.isNotEmpty(user)) {
+                user.setCacheAmount(user.getCacheAmount().subtract(record.getAmount()));
+                // 保存佣金流水
+                CommissionRecord build = CommissionRecord.builder()
+                        .amount(record.getAmount().negate())
+                        .payMethod(PayMethod.YUE)
+                        .fromUserId(record.getFromUserId())
+                        .transactionId("R" + orderId)
+                        .remark(record.getRemark())
+                        .transactionType(TransactionType.REFUND)
+                        .userId(record.getUserId())
+                        .fromUserId(record.getFromUserId())
+                        .build();
+                commissionRecordRepo.save(build);
+            }
+        });
+        userRepo.saveAll(userMap.values());
+    }
+
+    /*
+    变为可提现金额
+     */
+    public void canWithdraw(Long orderId) {
+        List<CommissionRecord> records = commissionRecordRepo.findAllByTransactionId(orderId.toString());
+        Set<Long> ids = records.stream().map(CommissionRecord::getUserId).collect(Collectors.toSet());
+        Map<Long, User> userMap = userRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(User::getId, user -> user));
+        records.forEach(record -> {
+            User user = userMap.get(record.getUserId());
+            BigDecimal amount = record.getAmount();
+            if (ObjectUtil.isNotEmpty(user)) {
+                user.setCacheAmount(user.getCacheAmount().subtract(amount));
+                user.setAmount(amount.add(user.getAmount()));
+                userRepo.save(user);
+//                switch (record.getTransactionType()) {
+//                    case PROMOTE:
+//                        user.setPromote(user.getPromote().add(amount));
+//                        userRepo.save(user);
+//                        break;
+//                    case GENERAL:
+//                        user.setGeneral(user.getGeneral().add(amount));
+//                        userRepo.save(user);
+//                        break;
+//                    case MAKER:
+//                        user.setMaker(user.getMaker().add(amount));
+//                        userRepo.save(user);
+//                        break;
+//                    default:
+//                        break;
+//                }
+            }
+        });
+    }
+}

+ 182 - 0
src/main/java/com/izouma/jiashanxia/service/CompanyService.java

@@ -0,0 +1,182 @@
+package com.izouma.jiashanxia.service;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.izouma.jiashanxia.domain.Company;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.dto.CompanyDTO;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.enums.AuthorityName;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.CompanyRepo;
+import com.izouma.jiashanxia.repo.UserPackageRepo;
+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.math.BigDecimal;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class CompanyService {
+
+    private CompanyRepo     companyRepo;
+    private UserRepo        userRepo;
+    private UserPackageRepo userPackageRepo;
+
+    public Page<CompanyDTO> 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();
+            query.put("userId", user.getId());
+            return companyRepo.findAll(JpaUtils.toSpecification(pageQuery, Company.class), JpaUtils.toPageRequest(pageQuery))
+                    .map(company -> {
+                        CompanyDTO dto = new CompanyDTO(company);
+                        dto.setNickname(user.getNickname());
+                        return dto;
+                    });
+        }
+        Map<Long, User> userMap = userRepo.findAllByTeamFounderTrueAndDelFalse()
+                .stream()
+                .collect(Collectors.toMap(User::getId, user1 -> user1));
+        return companyRepo.findAll(JpaUtils.toSpecification(pageQuery, Company.class), JpaUtils.toPageRequest(pageQuery))
+                .map(company -> {
+                    User user1 = userMap.get(company.getUserId());
+                    CompanyDTO dto = new CompanyDTO(company);
+                    if (ObjectUtil.isNotEmpty(user1)) {
+                        dto.setNickname(user1.getNickname());
+                    }
+                    return dto;
+                });
+    }
+
+    /*
+    添加员工
+    */
+    public void addUser(Long userId, Long companyId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        user.setCompanyId(companyId);
+        userRepo.save(user);
+    }
+
+    /*
+    删除员工
+     */
+    public void removeUser(Long userId, Long companyId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        if (companyId.equals(user.getCompanyId())) {
+            user.setCompanyId(null);
+            userRepo.save(user);
+        }
+    }
+
+    /*
+    员工列表
+     */
+    public List<User> employee(Long userId) {
+        Company company = companyRepo.findByUserId(userId);
+        if (ObjectUtil.isEmpty(company)) {
+            return null;
+        }
+        return userRepo.findAllByCompanyIdAndDelFalse(company.getId());
+    }
+
+    /*
+    新建企业
+     */
+    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("无记录"));
+            // 现在的员工列表
+            List<Long> employee = record.getEmployee();
+            // 原来的员工列表
+            List<User> users = userRepo.findAllByCompanyIdAndDelFalse(record.getId());
+            Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, user -> user));
+            Set<Long> oldEmployee = new HashSet<>(userMap.keySet());
+            // 如果旧员工被移除
+            oldEmployee.removeAll(employee);
+            if (ObjectUtil.isNotEmpty(oldEmployee)) {
+                oldEmployee.forEach(yee -> {
+                    User user = userMap.get(yee);
+                    user.setCompanyId(null);
+                    userRepo.save(user);
+                });
+            }
+            // 新员工加入团队
+            employee.removeAll(userMap.keySet());
+            if (ObjectUtil.isNotEmpty(employee)) {
+                userRepo.updateCompanyId(record.getId(), employee);
+            }
+            // 更换团队管理人
+            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());
+                // 套餐转到新管理员上
+                userPackageRepo.updateUserId(orig.getUserId(), record.getUserId());
+            }
+            ObjUtils.merge(orig, record);
+            return companyRepo.save(orig);
+        }
+
+        // 增加
+        record.setAmount(BigDecimal.ZERO);
+        Company save = companyRepo.save(record);
+        // 管理员加权限
+        this.teamFounder(save.getUserId(), creator, save.getId());
+        // 员工加入企业
+        userRepo.updateCompanyId(save.getId(), record.getEmployee());
+        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()) {
+//        if (!authorities.contains(creator)) {
+            authorities.add(creator);
+//            user.setTeamFounder(true);
+            user.setCompanyId(companyId);
+            userRepo.save(user);
+        }
+    }
+
+    /*
+    删除企业
+     */
+    public void del(Long id) {
+        companyRepo.findById(id).ifPresent(company -> {
+            userRepo.findById(company.getUserId()).ifPresent(user -> {
+                user.setCompanyId(null);
+                user.setTeamFounder(null);
+                Set<Authority> authorities = user.getAuthorities();
+                authorities.remove(Authority.get(AuthorityName.ROLE_CREATOR));
+                userRepo.save(user);
+            });
+            userRepo.deleteCompanyId(id);
+        });
+        companyRepo.softDelete(id);
+    }
+
+}

+ 110 - 0
src/main/java/com/izouma/jiashanxia/service/ConsumptionService.java

@@ -0,0 +1,110 @@
+package com.izouma.jiashanxia.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.izouma.jiashanxia.domain.OrderInfo;
+import com.izouma.jiashanxia.domain.User;
+import com.izouma.jiashanxia.domain.WxFee;
+import com.izouma.jiashanxia.enums.PayMethod;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.OrderInfoRepo;
+import com.izouma.jiashanxia.repo.UserRepo;
+import com.izouma.jiashanxia.repo.WxFeeRepo;
+import com.izouma.jiashanxia.utils.JsonUtils;
+import com.izouma.jiashanxia.utils.SnowflakeIdWorker;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+@Service
+@Slf4j
+@AllArgsConstructor
+public class ConsumptionService {
+    private final UserRepo         userRepo;
+    private final OrderInfoRepo    orderInfoRepo;
+    private final Environment      environment;
+    private final WxPayService     wxPayService;
+    private final WxFeeRepo        wxFeeRepo;
+    private final OrderInfoService orderInfoService;
+
+    /*
+    微信支付
+     */
+    public WxPayMpOrderResult payOrder(Long userId, Long orderId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
+        OrderInfo orders = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("订单错误"));
+
+        String body = orders.getName();
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setBody(body);
+        //订单号
+        request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
+        //分为单位
+        request.setTotalFee(orders.getPrice().multiply(BigDecimal.valueOf(100)).intValue());
+        if (Arrays.stream(environment.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+            request.setTotalFee(1);
+        }
+        if ("oTSu45NiG1dbKC2uYZxZtcd8rjAM".equals(user.getOpenId())
+                || "oTSu45GxPRhNkElSROy5W8-eNZgQ".equals(user.getOpenId())
+                || "oTSu45Gk2g6Er5YJGkpWOw9yBPWA".equals(user.getOpenId())
+                || "oTSu45AGWhJV2L60m0fdeiOXnFsU".equals(user.getOpenId())
+                || "oTSu45GvrgMmleC7r9Nh1tv7M-AE".equals(user.getOpenId())) {
+            request.setTotalFee(1);
+        }
+        request.setOpenid(user.getOpenId());
+        request.setNotifyUrl(environment.getProperty("wx.pay.notifyUrl"));
+        request.setSpbillCreateIp("180.102.110.170");
+        request.setTradeType(WxPayConstants.TradeType.JSAPI);
+        request.setSignType("MD5");
+        request.setAttach(new JsonUtils.Builder()
+                .add("type", "consumption")
+                .add("orderId", orderId)
+                .add("userId", userId)
+                .add("amount", orders.getPrice())
+                .build());
+        try {
+            return wxPayService.createOrder(request);
+        } catch (WxPayException e) {
+            log.info("微信支付异常", e);
+            throw new BusinessException(e.getMessage());
+        }
+    }
+
+    /*
+    回调
+     */
+    public void handleConsumptionNotify(WxPayOrderNotifyResult notifyResult) {
+        JSONObject attach = JSONObject.parseObject(notifyResult.getAttach());
+        Long orderId = attach.getLong("orderId");
+        Long userId = attach.getLong("userId");
+        String type = attach.getString("type");
+        BigDecimal amount = BigDecimal.valueOf(notifyResult.getTotalFee() * 0.01);
+        String transactionId = notifyResult.getTransactionId();
+
+        if (!wxFeeRepo.findByTransactionId(transactionId).isPresent()) {
+            wxFeeRepo.save(WxFee.builder()
+                    .amount(amount)
+//                    .isRefund(false)
+                    .action(0)
+                    .transactionId(transactionId)
+                    .type(type)
+                    .userId(userId)
+                    .orderId(orderId)
+                    .build());
+        }
+
+//        orderInfoService.completed(orderId, transactionId);
+        orderInfoService.completed1(orderId, transactionId, PayMethod.WEIXIN);
+    }
+
+
+}

+ 40 - 0
src/main/java/com/izouma/jiashanxia/service/CouponService.java

@@ -0,0 +1,40 @@
+package com.izouma.jiashanxia.service;
+
+import com.izouma.jiashanxia.domain.Coupon;
+import com.izouma.jiashanxia.domain.OrderInfo;
+import com.izouma.jiashanxia.domain.Package;
+import com.izouma.jiashanxia.dto.PageQuery;
+import com.izouma.jiashanxia.exception.BusinessException;
+import com.izouma.jiashanxia.repo.CouponRepo;
+import com.izouma.jiashanxia.repo.OrderInfoRepo;
+import com.izouma.jiashanxia.repo.PackageRepo;
+import com.izouma.jiashanxia.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class CouponService {
+
+    private final CouponRepo    couponRepo;
+    private final OrderInfoRepo orderInfoRepo;
+    private final PackageRepo   packageRepo;
+
+    public Page<Coupon> all(PageQuery pageQuery) {
+        return couponRepo.findAll(JpaUtils.toSpecification(pageQuery, Coupon.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    可选择的优惠券
+    核销套餐后,可选择的优惠券
+     */
+    public List<Coupon> chooseByOrder(Long orderInfoId) {
+        OrderInfo orderInfo = orderInfoRepo.findById(orderInfoId).orElseThrow(new BusinessException("无订单"));
+        Package aPackage = packageRepo.findById(orderInfo.getPackageId()).orElseThrow(new BusinessException("无套餐"));
+        return couponRepo.findAllByIdInAndPeriodAfter(aPackage.getCouponId(), LocalDateTime.now());
+    }
+}

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff