licailing 5 ani în urmă
părinte
comite
7ee4d21acf
70 a modificat fișierele cu 3305 adăugiri și 354 ștergeri
  1. 10 4
      src/main/java/com/izouma/dingdong/domain/OrderGoodsSpec.java
  2. 2 2
      src/main/java/com/izouma/dingdong/domain/OrderInfo.java
  3. 40 15
      src/main/java/com/izouma/dingdong/domain/ShoppingCart.java
  4. 4 0
      src/main/java/com/izouma/dingdong/domain/User.java
  5. 12 2
      src/main/java/com/izouma/dingdong/domain/backstage/BlackList.java
  6. 5 1
      src/main/java/com/izouma/dingdong/domain/backstage/Email.java
  7. 24 0
      src/main/java/com/izouma/dingdong/domain/backstage/TimeTag.java
  8. 4 4
      src/main/java/com/izouma/dingdong/domain/merchant/FullReduction.java
  9. 8 1
      src/main/java/com/izouma/dingdong/domain/merchant/Goods.java
  10. 1 0
      src/main/java/com/izouma/dingdong/domain/merchant/GoodsSpecification.java
  11. 3 2
      src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java
  12. 6 2
      src/main/java/com/izouma/dingdong/domain/merchant/MerchantSettings.java
  13. 3 2
      src/main/java/com/izouma/dingdong/domain/rider/Rider.java
  14. 6 3
      src/main/java/com/izouma/dingdong/domain/user/Address.java
  15. 7 7
      src/main/java/com/izouma/dingdong/domain/user/Coupon.java
  16. 3 0
      src/main/java/com/izouma/dingdong/dto/MerchantDTO.java
  17. 43 29
      src/main/java/com/izouma/dingdong/dto/UserOrderDTO.java
  18. 4 4
      src/main/java/com/izouma/dingdong/enums/RiderStatus.java
  19. 10 0
      src/main/java/com/izouma/dingdong/repo/OrderInfoRepo.java
  20. 14 0
      src/main/java/com/izouma/dingdong/repo/ShoppingCartRepo.java
  21. 17 0
      src/main/java/com/izouma/dingdong/repo/backstage/EmailRepo.java
  22. 8 0
      src/main/java/com/izouma/dingdong/repo/backstage/TimeTagRepo.java
  23. 2 2
      src/main/java/com/izouma/dingdong/repo/merchant/FullReductionRepo.java
  24. 2 0
      src/main/java/com/izouma/dingdong/repo/merchant/GoodsRepo.java
  25. 14 0
      src/main/java/com/izouma/dingdong/repo/rider/RiderRepo.java
  26. 4 2
      src/main/java/com/izouma/dingdong/repo/user/AddressRepo.java
  27. 64 0
      src/main/java/com/izouma/dingdong/service/OrderGoodsSpecService.java
  28. 116 50
      src/main/java/com/izouma/dingdong/service/OrderInfoService.java
  29. 3 1
      src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java
  30. 153 0
      src/main/java/com/izouma/dingdong/service/ShoppingCartService.java
  31. 1 0
      src/main/java/com/izouma/dingdong/service/UserService.java
  32. 92 1
      src/main/java/com/izouma/dingdong/service/backstage/BlackListService.java
  33. 14 0
      src/main/java/com/izouma/dingdong/service/backstage/EmailService.java
  34. 14 0
      src/main/java/com/izouma/dingdong/service/backstage/TimeTagService.java
  35. 5 4
      src/main/java/com/izouma/dingdong/service/merchant/FullReductionService.java
  36. 57 5
      src/main/java/com/izouma/dingdong/service/merchant/GoodsService.java
  37. 2 2
      src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java
  38. 14 0
      src/main/java/com/izouma/dingdong/service/rider/RiderService.java
  39. 7 0
      src/main/java/com/izouma/dingdong/web/AppraisalController.java
  40. 34 0
      src/main/java/com/izouma/dingdong/web/BaseController.java
  41. 28 0
      src/main/java/com/izouma/dingdong/web/OrderInfoController.java
  42. 77 0
      src/main/java/com/izouma/dingdong/web/ShoppingCartController.java
  43. 14 1
      src/main/java/com/izouma/dingdong/web/backstage/BlackListController.java
  44. 63 0
      src/main/java/com/izouma/dingdong/web/backstage/EmailController.java
  45. 63 0
      src/main/java/com/izouma/dingdong/web/backstage/TimeTagController.java
  46. 2 1
      src/main/java/com/izouma/dingdong/web/merchant/FullReductionController.java
  47. 14 5
      src/main/java/com/izouma/dingdong/web/merchant/GoodsController.java
  48. 63 0
      src/main/java/com/izouma/dingdong/web/rider/RiderController.java
  49. 1 0
      src/main/resources/genjson/Email.json
  50. 0 0
      src/main/resources/genjson/Rider.json
  51. 0 0
      src/main/resources/genjson/ShoppingCart.json
  52. 1 0
      src/main/resources/genjson/TimeTag.json
  53. 81 1
      src/main/vue/src/router.js
  54. 87 5
      src/main/vue/src/views/GoodsList.vue
  55. 8 16
      src/main/vue/src/views/OrderInfoList.vue
  56. 124 0
      src/main/vue/src/views/ShoppingCartEdit.vue
  57. 200 0
      src/main/vue/src/views/ShoppingCartList.vue
  58. 213 145
      src/main/vue/src/views/UserEdit.vue
  59. 9 5
      src/main/vue/src/views/UserList.vue
  60. 91 28
      src/main/vue/src/views/backstage/BlackListList.vue
  61. 97 0
      src/main/vue/src/views/backstage/EmailEdit.vue
  62. 173 0
      src/main/vue/src/views/backstage/EmailList.vue
  63. 148 0
      src/main/vue/src/views/backstage/OrderRefundApplyEdit.vue
  64. 297 0
      src/main/vue/src/views/backstage/OrderRefundApplyList.vue
  65. 114 0
      src/main/vue/src/views/backstage/TimeTagEdit.vue
  66. 171 0
      src/main/vue/src/views/backstage/TimeTagList.vue
  67. 2 0
      src/main/vue/src/views/merchant/MerchantList.vue
  68. 124 0
      src/main/vue/src/views/rider/RiderEdit.vue
  69. 206 0
      src/main/vue/src/views/rider/RiderList.vue
  70. 2 2
      src/test/java/com/izouma/dingdong/repo/UserRepoTest.java

+ 10 - 4
src/main/java/com/izouma/dingdong/domain/OrderGoodsSpec.java

@@ -3,15 +3,13 @@ package com.izouma.dingdong.domain;
 
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.AllArgsConstructor;
-import lombok.Builder;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import lombok.*;
 
 
 import javax.persistence.Entity;
 import javax.persistence.Entity;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 
 
+@EqualsAndHashCode(callSuper = true)
 @Entity
 @Entity
 @Data
 @Data
 @AllArgsConstructor
 @AllArgsConstructor
@@ -22,11 +20,16 @@ public class OrderGoodsSpec extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "订单ID", name = "orderId")
     @ApiModelProperty(value = "订单ID", name = "orderId")
     private Long orderId;
     private Long orderId;
 
 
+    @ApiModelProperty(value = "购物车ID", name = "cartId")
+    private Long shoppingCartId;
+
     @ApiModelProperty(value = "商品ID", name = "goodsId")
     @ApiModelProperty(value = "商品ID", name = "goodsId")
     private Long goodsId;
     private Long goodsId;
 
 
 //    private String goodsName;
 //    private String goodsName;
 
 
+    private String specificationId;
+
     @ApiModelProperty(value = "规格", name = "specification")
     @ApiModelProperty(value = "规格", name = "specification")
     private String specification;
     private String specification;
 
 
@@ -36,4 +39,7 @@ public class OrderGoodsSpec extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "商品价格", name = "goodsPrice")
     @ApiModelProperty(value = "商品价格", name = "goodsPrice")
     private BigDecimal goodsPrice;
     private BigDecimal goodsPrice;
 
 
+    @ApiModelProperty(value = "商品折扣价格", name = "goodsRealPrice")
+    private BigDecimal goodsRealPrice;
+
 }
 }

+ 2 - 2
src/main/java/com/izouma/dingdong/domain/OrderInfo.java

@@ -76,8 +76,8 @@ public class OrderInfo extends BaseEntity {
     private BigDecimal realAmount;
     private BigDecimal realAmount;
 
 
     //使用优惠券
     //使用优惠券
-    @ApiModelProperty(value = "是否使用优惠券", name = "isCoupon")
-    private Boolean isCoupon;
+//    @ApiModelProperty(value = "是否使用优惠券", name = "isCoupon")
+//    private Boolean isCoupon;
 
 
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     private Long couponId;
     private Long couponId;

+ 40 - 15
src/main/java/com/izouma/dingdong/domain/ShoppingCart.java

@@ -1,13 +1,21 @@
 package com.izouma.dingdong.domain;
 package com.izouma.dingdong.domain;
 
 
-import com.izouma.dingdong.domain.merchant.Goods;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
-import org.springframework.security.core.parameters.P;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
+import javax.persistence.*;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
 
 
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
 public class ShoppingCart extends BaseEntity implements Serializable {
 public class ShoppingCart extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "用户ID", name = "userId")
     @ApiModelProperty(value = "用户ID", name = "userId")
     private Long userId;
     private Long userId;
@@ -15,23 +23,40 @@ public class ShoppingCart extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
     private Long merchantId;
 
 
-/*    @ApiModelProperty(value = "商品ID", name = "goodsId")
-    private List<Long> goodsId;*/
-
-    @ApiModelProperty(value = "商品数量", name = "num")
-    private Integer num;
-
     @ApiModelProperty(value = "配送费", name = "deliveryAmount")
     @ApiModelProperty(value = "配送费", name = "deliveryAmount")
     private BigDecimal deliveryAmount;
     private BigDecimal deliveryAmount;
 
 
-    @ApiModelProperty(value = "总价", name = "totalAmount")
-    private BigDecimal totalAmount;
+//    @ApiModelProperty(value = "总价", name = "totalAmount")
+//    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "已减优惠")
+    private BigDecimal reducedAmount;
 
 
-    @ApiModelProperty(value = "商品总价", name = "goodsAmount")
-    private BigDecimal goodsAmount;
+    @ApiModelProperty(value = "包装价格",name = "packingPrice")
+    private BigDecimal packingPrice;
 
 
-    private List<Goods> goods;
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumn(name = "shoppingCartId")
+    List<OrderGoodsSpec> orderGoodsSpecs;
+
+    @ApiModelProperty(value = "优惠券ID", name = "couponId")
+    private Long couponId;
+
+    @ApiModelProperty(value = "满减", name = "fullReduction")
+    private BigDecimal fullReduction;
+
+    @ApiModelProperty(value = "首单", name = "firstBuy")
+    private BigDecimal firstBuy;
+
+    @ApiModelProperty(value = "红包", name = "redBag")
+    private BigDecimal redBag;
+
+    @ApiModelProperty(value = "新用户", name = "newUser")
+    private BigDecimal newUser;
+
+    private BigDecimal goodsTotal;
+
+    @ApiModelProperty(value = "实付金额", name = "realAmount")
+    private BigDecimal realAmount;
 
 
-    @ApiModelProperty(value = "已减优惠")
-    private BigDecimal amount;
 }
 }

+ 4 - 0
src/main/java/com/izouma/dingdong/domain/User.java

@@ -16,6 +16,7 @@ import javax.persistence.*;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.Set;
 
 
@@ -83,4 +84,7 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "黑名单", name = "blacklist")
     @ApiModelProperty(value = "黑名单", name = "blacklist")
     private Boolean blacklist = false;
     private Boolean blacklist = false;
 
 
+//    @ApiModelProperty(value = "消费金额",name = "consumption")
+//    private BigDecimal consumption;
+
 }
 }

+ 12 - 2
src/main/java/com/izouma/dingdong/domain/backstage/BlackList.java

@@ -1,6 +1,7 @@
 package com.izouma.dingdong.domain.backstage;
 package com.izouma.dingdong.domain.backstage;
 
 
 import com.izouma.dingdong.domain.BaseEntity;
 import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.enums.Identity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
@@ -10,13 +11,15 @@ import lombok.NoArgsConstructor;
 import org.hibernate.annotations.Where;
 import org.hibernate.annotations.Where;
 
 
 import javax.persistence.Entity;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.time.LocalDateTime;
 
 
 @Data
 @Data
 @Entity
 @Entity
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
-@Where(clause = "remove = 1")
 @ApiModel(value = "黑名单表", description = "黑名单")
 @ApiModel(value = "黑名单表", description = "黑名单")
 public class BlackList extends BaseEntity {
 public class BlackList extends BaseEntity {
     @ApiModelProperty(value = "用户ID", name = "userId")
     @ApiModelProperty(value = "用户ID", name = "userId")
@@ -26,12 +29,19 @@ public class BlackList extends BaseEntity {
     @ApiModelProperty(value = "其他ID", name = "otherId")
     @ApiModelProperty(value = "其他ID", name = "otherId")
     private Long otherId;
     private Long otherId;
 
 
+    @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "身份", name = "identity")
     @ApiModelProperty(value = "身份", name = "identity")
-    private String identity;
+    private Identity identity;
+
+    @ApiModelProperty(value = "移入时间", name = "moveTime")
+    private LocalDateTime moveTime;
 
 
     @ApiModelProperty(value = "缘由", name = "reason")
     @ApiModelProperty(value = "缘由", name = "reason")
     private String reason;
     private String reason;
 
 
     @ApiModelProperty(value = "移除", name = "remove")
     @ApiModelProperty(value = "移除", name = "remove")
     private Boolean remove;
     private Boolean remove;
+
+    @ApiModelProperty(value = "移出时间", name = "removeTime")
+    private LocalDateTime removeTime;
 }
 }

+ 5 - 1
src/main/java/com/izouma/dingdong/domain/backstage/Email.java

@@ -8,8 +8,10 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
+import javax.persistence.Entity;
+
 @Data
 @Data
-//@Entity
+@Entity
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
@@ -26,4 +28,6 @@ public class Email extends BaseEntity {
 
 
     @ApiModelProperty(value = "内容", name = "content")
     @ApiModelProperty(value = "内容", name = "content")
     private String content;
     private String content;
+
+    private Boolean enabled;
 }
 }

+ 24 - 0
src/main/java/com/izouma/dingdong/domain/backstage/TimeTag.java

@@ -0,0 +1,24 @@
+package com.izouma.dingdong.domain.backstage;
+
+import com.izouma.dingdong.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.io.Serializable;
+import java.time.LocalTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "时间类别")
+public class TimeTag extends BaseEntity implements Serializable {
+    private String name;
+    private LocalTime startTime;
+    private LocalTime endTime;
+}

+ 4 - 4
src/main/java/com/izouma/dingdong/domain/merchant/FullReduction.java

@@ -19,11 +19,11 @@ import java.math.BigDecimal;
 @Builder
 @Builder
 @ApiModel(value = "满减表", description = "满减表")
 @ApiModel(value = "满减表", description = "满减表")
 public class FullReduction extends BaseEntity implements Serializable {
 public class FullReduction extends BaseEntity implements Serializable {
-//    @ApiModelProperty(value = "商户ID",name = "merchantSettingsId")
-//    private Long merchantId;
+    @ApiModelProperty(value = "商户ID",name = "merchantSettingsId")
+    private Long merchantId;
 
 
-    @ApiModelProperty(value = "用户ID")
-    private Long userId;
+/*    @ApiModelProperty(value = "用户ID")
+    private Long userId;*/
 
 
     @ApiModelProperty(value = "满额", name = "fullAmount")
     @ApiModelProperty(value = "满额", name = "fullAmount")
     private BigDecimal fullAmount;
     private BigDecimal fullAmount;

+ 8 - 1
src/main/java/com/izouma/dingdong/domain/merchant/Goods.java

@@ -1,6 +1,7 @@
 package com.izouma.dingdong.domain.merchant;
 package com.izouma.dingdong.domain.merchant;
 
 
 import com.izouma.dingdong.domain.BaseEntity;
 import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.enums.ApplyStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.*;
@@ -65,7 +66,7 @@ public class Goods extends BaseEntity implements Serializable {
 //    private Integer sort;
 //    private Integer sort;
 
 
     @ApiModelProperty(value = "是否参与满减", name = "isFullReduction")
     @ApiModelProperty(value = "是否参与满减", name = "isFullReduction")
-    private Boolean isFullReduction = false;
+    private Boolean isFullReduction = true;
 
 
     @ApiModelProperty(value = "周几", name = "week")
     @ApiModelProperty(value = "周几", name = "week")
     private String week;
     private String week;
@@ -81,4 +82,10 @@ public class Goods extends BaseEntity implements Serializable {
 
 
     private Boolean enabled;
     private Boolean enabled;
 
 
+    @ApiModelProperty(value = "通过", name = "isPass")
+    private Boolean isPass;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态", name = "status")
+    private ApplyStatus status;
 }
 }

+ 1 - 0
src/main/java/com/izouma/dingdong/domain/merchant/GoodsSpecification.java

@@ -19,6 +19,7 @@ import java.math.BigDecimal;
 @ApiModel(value = "GoodsSpecification", description = "商品规格")
 @ApiModel(value = "GoodsSpecification", description = "商品规格")
 public class GoodsSpecification extends BaseEntity implements Serializable {
 public class GoodsSpecification extends BaseEntity implements Serializable {
 
 
+    @ApiModelProperty("商品id")
     private Long goodsId;
     private Long goodsId;
 
 
     private String name;
     private String name;

+ 3 - 2
src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java

@@ -10,6 +10,7 @@ import org.hibernate.annotations.Where;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import java.io.Serializable;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
 @Data
 @Data
@@ -81,6 +82,6 @@ public class Merchant extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "成立时间", name = "established")
     @ApiModelProperty(value = "成立时间", name = "established")
     private LocalDateTime establishTime;
     private LocalDateTime establishTime;
 
 
-    @ApiModelProperty(value = "自动接单", name = "automaticOrder")
-    private Boolean automaticOrder;
+    @ApiModelProperty(value = "商家余额",name = "money")
+    private BigDecimal money;
 }
 }

+ 6 - 2
src/main/java/com/izouma/dingdong/domain/merchant/MerchantSettings.java

@@ -14,6 +14,7 @@ import org.hibernate.annotations.Where;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.LocalTime;
 import java.util.Set;
 import java.util.Set;
 
 
@@ -25,8 +26,8 @@ import java.util.Set;
 @Where(clause = "enabled = true")
 @Where(clause = "enabled = true")
 @ApiModel(value = "商户设置", description = "商户设置")
 @ApiModel(value = "商户设置", description = "商户设置")
 public class MerchantSettings extends BaseEntity {
 public class MerchantSettings extends BaseEntity {
-    @ApiModelProperty(value = "用户ID")
-    private Long merUserId;
+/*    @ApiModelProperty(value = "用户ID")
+    private Long userId;*/
 
 
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
     private Long merchantId;
@@ -82,4 +83,7 @@ public class MerchantSettings extends BaseEntity {
     @Builder.Default
     @Builder.Default
     private Boolean enabled = true;
     private Boolean enabled = true;
 
 
+    @ApiModelProperty(value = "自动接单", name = "automaticOrder")
+    private Boolean automaticOrder;
+
 }
 }

+ 3 - 2
src/main/java/com/izouma/dingdong/domain/rider/Rider.java

@@ -9,10 +9,11 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
 import javax.persistence.Column;
 import javax.persistence.Column;
+import javax.persistence.Entity;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 
 
 @Data
 @Data
-//@Entity
+@Entity
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
@@ -22,7 +23,7 @@ public class Rider extends BaseEntity {
     private Long userId;
     private Long userId;
 
 
     @ApiModelProperty(value = "工号", name = "jobNumber")
     @ApiModelProperty(value = "工号", name = "jobNumber")
-    private String jobNumber;
+    private Long jobNumber;
 
 
     @ApiModelProperty(value = "区域",name = "area")
     @ApiModelProperty(value = "区域",name = "area")
     private String area;
     private String area;

+ 6 - 3
src/main/java/com/izouma/dingdong/domain/user/Address.java

@@ -5,7 +5,9 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.*;
 
 
+import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Entity;
+import java.io.Serializable;
 
 
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @Data
 @Data
@@ -15,7 +17,7 @@ import javax.persistence.Entity;
 @Builder
 @Builder
 //@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
 //@JsonIgnoreProperties(value = {"hibernateLazyInitializer"})
 @ApiModel(value = "Address", description = "收获地址记录")
 @ApiModel(value = "Address", description = "收获地址记录")
-public class Address extends BaseEntity {
+public class Address extends BaseEntity implements Serializable {
     @ApiModelProperty("用户Id")
     @ApiModelProperty("用户Id")
     private Long userId;
     private Long userId;
 
 
@@ -26,10 +28,11 @@ public class Address extends BaseEntity {
     private String phone;
     private String phone;
 
 
     @ApiModelProperty("详细地址")
     @ApiModelProperty("详细地址")
-    private String address;
+    private String addressName;
 
 
     @ApiModelProperty("是否选为默认地址")
     @ApiModelProperty("是否选为默认地址")
     private Boolean isDefault;
     private Boolean isDefault;
 
 
-    private Boolean enabled ;
+    @Column(nullable = false)
+    private Boolean enabled = true;
 }
 }

+ 7 - 7
src/main/java/com/izouma/dingdong/domain/user/Coupon.java

@@ -40,8 +40,8 @@ public class Coupon extends BaseEntity implements Serializable {
 
 
     private LocalDate endDate;
     private LocalDate endDate;
 
 
-    @ApiModelProperty(value = "是否过期", name = "isExpired")
-    private Boolean isExpired;
+//    @ApiModelProperty(value = "是否过期", name = "isExpired")
+//    private Boolean isExpired;
 
 
     @ApiModelProperty(value = "是否已使用", name = "isUsed")
     @ApiModelProperty(value = "是否已使用", name = "isUsed")
     private Boolean isUsed;
     private Boolean isUsed;
@@ -52,15 +52,15 @@ public class Coupon extends BaseEntity implements Serializable {
 /*    @ApiModelProperty(value = "使用规则", name = "rule")
 /*    @ApiModelProperty(value = "使用规则", name = "rule")
     private String rule;*/
     private String rule;*/
 
 
-    @Enumerated(EnumType.STRING)
-    @ApiModelProperty(value = "优惠券类型", name = "type")
-    private CouponType type;
+//    @Enumerated(EnumType.STRING)
+//    @ApiModelProperty(value = "优惠券类型", name = "type")
+//    private CouponType type;
 
 
     @ApiModelProperty(value = "满额", name = "fullAmount")
     @ApiModelProperty(value = "满额", name = "fullAmount")
     private BigDecimal fullAmount;
     private BigDecimal fullAmount;
 
 
-    @ApiModelProperty(value = "折扣", name = "discount")
-    private Integer discount;
+//    @ApiModelProperty(value = "折扣", name = "discount")
+//    private Integer discount;
 
 
     @ManyToOne(fetch = FetchType.LAZY)
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))

+ 3 - 0
src/main/java/com/izouma/dingdong/dto/MerchantDTO.java

@@ -50,6 +50,7 @@ public class MerchantDTO {
         week = merchantSettings.getWeek();
         week = merchantSettings.getWeek();
         banner = merchant.getBanner();
         banner = merchant.getBanner();
         logo = merchantSettings.getLogo();
         logo = merchantSettings.getLogo();
+        money = merchant.getMoney();
     }
     }
 
 
 
 
@@ -148,4 +149,6 @@ public class MerchantDTO {
 
 
     @ApiModelProperty(value = "成立时间", name = "established")
     @ApiModelProperty(value = "成立时间", name = "established")
     private LocalDateTime establishTime;
     private LocalDateTime establishTime;
+
+    private BigDecimal money;
 }
 }

+ 43 - 29
src/main/java/com/izouma/dingdong/dto/UserOrderDTO.java

@@ -19,46 +19,60 @@ import java.util.List;
 @ApiModel(value = "用户下单")
 @ApiModel(value = "用户下单")
 public class UserOrderDTO {
 public class UserOrderDTO {
 
 
-    private Long userId;
+    //private Long userId;
 
 
-    private Long addressId;
-
-    @ApiModelProperty(value = "商户ID", name = "merchantId")
-    private Long merchantId;
-
-    @ApiModelProperty(value = "商品规格",name = "goodsSpecs")
-    private List<GoodsSpecDTO> goodsSpecs;
-
-    @ApiModelProperty(value = "包装价格",name = "packingPrice")
-    private BigDecimal packingPrice;
+    @ApiModelProperty(value = "购物车ID", name = "shoppingCartId")
+    private Long shoppingCartId;
 
 
-    @ApiModelProperty(value = "配送费", name = "deliveryAmount")
-    private BigDecimal deliveryAmount;
-
-/*    @ApiModelProperty(value = "是否使用优惠券", name = "isCoupon")
-    private Boolean isCoupon;*/
+    @ApiModelProperty(value = "地址ID", name = "addressId")
+    private Long addressId;
 
 
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     private Long couponId;
     private Long couponId;
 
 
-    @ApiModelProperty(value = "满减", name = "fullReduction")
-    private BigDecimal fullReduction;
+    @ApiModelProperty(value = "支付方式", name = "payMethod")
+    private PayMethod payMethod;
 
 
-    @ApiModelProperty(value = "首单", name = "firstBuy")
-    private BigDecimal firstBuy;
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
 
 
-    @ApiModelProperty(value = "红包", name = "redBag")
-    private BigDecimal redBag;
 
 
-    @ApiModelProperty(value = "新用户", name = "newUser")
-    private BigDecimal newUser;
+//    @ApiModelProperty(value = "商户ID", name = "merchantId")
+//    private Long merchantId;
 
 
-    private BigDecimal total;
+//    @ApiModelProperty(value = "商品规格", name = "goodsSpecs")
+//    private List<GoodsSpecDTO> goodsSpecs;
+//
+//    @ApiModelProperty(value = "包装价格", name = "packingPrice")
+//    private BigDecimal packingPrice;
+//
+//    @ApiModelProperty(value = "配送费", name = "deliveryAmount")
+//    private BigDecimal deliveryAmount;
 
 
-    @ApiModelProperty(value = "实付金额", name = "realAmount")
-    private BigDecimal realAmount;
+/*    @ApiModelProperty(value = "是否使用优惠券", name = "isCoupon")
+    private Boolean isCoupon;*/
+
+//    @ApiModelProperty(value = "优惠券ID", name = "couponId")
+//    private Long couponId;
+//
+//    @ApiModelProperty(value = "满减", name = "fullReduction")
+//    private BigDecimal fullReduction;
+//
+//    @ApiModelProperty(value = "首单", name = "firstBuy")
+//    private BigDecimal firstBuy;
+//
+//    @ApiModelProperty(value = "红包", name = "redBag")
+//    private BigDecimal redBag;
+//
+//    @ApiModelProperty(value = "新用户", name = "newUser")
+//    private BigDecimal newUser;
+//
+//    @ApiModelProperty(value = "总价", name = "total")
+//    private BigDecimal total;
+//
+//    @ApiModelProperty(value = "实付金额", name = "realAmount")
+//    private BigDecimal realAmount;
+//
 
 
-    private String remark;
 
 
-    private PayMethod payMethod;
 }
 }

+ 4 - 4
src/main/java/com/izouma/dingdong/enums/RiderStatus.java

@@ -4,17 +4,17 @@ public enum RiderStatus {
     /*
     /*
     接单
     接单
      */
      */
-    JIEDAN,
+    RECEIVED,
     /*
     /*
     取餐
     取餐
      */
      */
-    QUCAN,
+    TAKE_MEAL,
     /*
     /*
     送餐
     送餐
      */
      */
-    SONGCAN,
+    MEAL_DELIVERY,
     /*
     /*
     完成
     完成
      */
      */
-    WANCHENG;
+    CARRY_OUT
 }
 }

+ 10 - 0
src/main/java/com/izouma/dingdong/repo/OrderInfoRepo.java

@@ -16,5 +16,15 @@ public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecif
     @Transactional
     @Transactional
     void deleteById(Long id);
     void deleteById(Long id);
 
 
+    //按商家查找
     List<OrderInfo> findAllByMerchantId(Long merchantId);
     List<OrderInfo> findAllByMerchantId(Long merchantId);
+
+    //按用户查找
+    List<OrderInfo> findAllByUserId(Long userId);
+
+    //按骑手查找
+    List<OrderInfo> findAllByRiderId(Long riderId);
+
+    //按商家和用户查找订单,判断是不是第一次购买
+    List<OrderInfo> findAllByUserIdAndMerchantId(Long userId,Long merchantId);
 }
 }

+ 14 - 0
src/main/java/com/izouma/dingdong/repo/ShoppingCartRepo.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.repo;
+
+import com.izouma.dingdong.domain.ShoppingCart;
+import com.sun.tools.javac.util.List;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface ShoppingCartRepo extends JpaRepository<ShoppingCart, Long>, JpaSpecificationExecutor<ShoppingCart> {
+
+    //按用户和商户查找
+    ShoppingCart findByUserIdAndMerchantId(Long userId, Long merchantId);
+
+    List<ShoppingCart> findAllByUserId(Long userId);
+}

+ 17 - 0
src/main/java/com/izouma/dingdong/repo/backstage/EmailRepo.java

@@ -0,0 +1,17 @@
+package com.izouma.dingdong.repo.backstage;
+
+import com.izouma.dingdong.domain.backstage.Email;
+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 EmailRepo extends JpaRepository<Email, Long>, JpaSpecificationExecutor<Email> {
+
+    @Query("update Email t set t.enabled = false where t.id = ?1")
+    @Modifying
+    @Transactional
+    void deleteById(Long id);
+}

+ 8 - 0
src/main/java/com/izouma/dingdong/repo/backstage/TimeTagRepo.java

@@ -0,0 +1,8 @@
+package com.izouma.dingdong.repo.backstage;
+
+import com.izouma.dingdong.domain.backstage.TimeTag;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+public interface TimeTagRepo extends JpaRepository<TimeTag, Long>, JpaSpecificationExecutor<TimeTag> {
+}

+ 2 - 2
src/main/java/com/izouma/dingdong/repo/merchant/FullReductionRepo.java

@@ -9,8 +9,8 @@ import java.util.List;
 public interface FullReductionRepo extends JpaRepository<FullReduction, Long>, JpaSpecificationExecutor<FullReduction> {
 public interface FullReductionRepo extends JpaRepository<FullReduction, Long>, JpaSpecificationExecutor<FullReduction> {
 
 
     //查找商户下的所有满减
     //查找商户下的所有满减
-    //List<FullReduction> findAllByMerchantId(Long merchantId);
+    List<FullReduction> findAllByMerchantId(Long merchantId);
 
 
     //查找商户下的所有满减
     //查找商户下的所有满减
-    List<FullReduction> findAllByUserId(Long userId);
+//    List<FullReduction> findAllByUserId(Long userId);
 }
 }

+ 2 - 0
src/main/java/com/izouma/dingdong/repo/merchant/GoodsRepo.java

@@ -18,6 +18,8 @@ public interface GoodsRepo extends JpaRepository<Goods, Long>, JpaSpecificationE
 
 
     List<Goods> findAllByMerchantId(Long merchantId);
     List<Goods> findAllByMerchantId(Long merchantId);
 
 
+    //按商户筛选,并用过审核
+    List<Goods> findAllByMerchantIdAndIsPassTrue(Long merchantId);
 
 
 //    List<Goods> findAllByMerchantIdAndTotalSalesIsLessThanEqual(Long merchant,Integer num);
 //    List<Goods> findAllByMerchantIdAndTotalSalesIsLessThanEqual(Long merchant,Integer num);
 
 

+ 14 - 0
src/main/java/com/izouma/dingdong/repo/rider/RiderRepo.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.repo.rider;
+
+import com.izouma.dingdong.domain.rider.Rider;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.Optional;
+
+public interface RiderRepo extends JpaRepository<Rider, Long>, JpaSpecificationExecutor<Rider> {
+
+    Optional<Rider> findByUserId(Long userId);
+
+    Optional<Rider> findByJobNumber(Long jobNumber);
+}

+ 4 - 2
src/main/java/com/izouma/dingdong/repo/user/AddressRepo.java

@@ -14,6 +14,8 @@ public interface AddressRepo extends JpaRepository<Address, Long>, JpaSpecificat
     @Transactional
     @Transactional
     void deleteById(Long id);
     void deleteById(Long id);
 
 
-    @Query("update Address t set t.isDefault = 0 where t.id<>?1 and t.userId=?2")
-    Address updateIsDefault(Long id, Long userId);
+    @Query("update Address t set t.isDefault = false where t.id <> ?1 and t.userId = ?2")
+    @Modifying
+    @Transactional
+    void updateIsDefault(Long id, Long userId);
 }
 }

+ 64 - 0
src/main/java/com/izouma/dingdong/service/OrderGoodsSpecService.java

@@ -1,14 +1,78 @@
 package com.izouma.dingdong.service;
 package com.izouma.dingdong.service;
 
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.izouma.dingdong.domain.OrderGoodsSpec;
 import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.domain.ShoppingCart;
+import com.izouma.dingdong.domain.merchant.Goods;
+import com.izouma.dingdong.domain.merchant.GoodsSpecification;
+import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
+import com.izouma.dingdong.repo.merchant.GoodsRepo;
+import com.izouma.dingdong.repo.merchant.GoodsSpecificationRepo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.math.BigDecimal;
+import java.util.List;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class OrderGoodsSpecService {
 public class OrderGoodsSpecService {
 
 
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
+    private GoodsSpecificationRepo goodsSpecificationRepo;
+    private GoodsRepo goodsRepo;
+    private ShoppingCartService shoppingCartService;
+
+    /*
+    添加规格
+     */
+    public OrderGoodsSpec add(Long goodsId, List<GoodsSpecification> goodsSpecifications) {
+        String name = null;
+        String ids = null;
+        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
+        BigDecimal total = goods.getAmount();
+        BigDecimal real = goods.getDiscountAmount();
+
+//        for (Long s : specIds) {
+//            GoodsSpecification specification = goodsSpecificationRepo.findById(s).orElseThrow(new BusinessException("规格不存在"));
+//            total = total.add(specification.getAmount());
+//            if (StrUtil.isNotBlank(name)) {
+//                name = name + "/" + specification.getName();
+//            } else {
+//                name = specification.getName();
+//            }
+//        }
+        /*specIds.stream().map(goodsSpecificationRepo.findById(s).orElseThrow(new BusinessException("规格不存在"))).map(GoodsSpecification::getAmount, GoodsSpecification::getName).forEach(total::add);*/
+
+        if (CollUtil.isNotEmpty(goodsSpecifications)) {
+            for (GoodsSpecification g : goodsSpecifications) {
+                total = total.add(g.getAmount());
+                real = real.add(g.getAmount());
+
+                if (StrUtil.isNotBlank(name)) {
+                    name = name + "/" + g.getName();
+                } else {
+                    name = g.getName();
+                }
+                if (StrUtil.isNotBlank(ids)) {
+                    ids = ids + "/" + g.getId();
+                } else {
+                    ids = g.getId().toString();
+                }
+            }
+        }
+        return orderGoodsSpecRepo.save(
+                OrderGoodsSpec.builder()
+                        .goodsId(goodsId)
+                        .specification(name)
+                        .specificationId(ids)
+                        .goodsPrice(total)
+                        .goodsRealPrice(real)
+                        .build());
+
+    }
+
 
 
 }
 }

+ 116 - 50
src/main/java/com/izouma/dingdong/service/OrderInfoService.java

@@ -1,36 +1,41 @@
 package com.izouma.dingdong.service;
 package com.izouma.dingdong.service;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.converter.StringArrayConverter;
 import com.izouma.dingdong.converter.StringArrayConverter;
-import com.izouma.dingdong.domain.OrderGoodsSpec;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.domain.ShoppingCart;
+import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.Goods;
-import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
+import com.izouma.dingdong.domain.user.Address;
 import com.izouma.dingdong.domain.user.Coupon;
 import com.izouma.dingdong.domain.user.Coupon;
-import com.izouma.dingdong.dto.GoodsSpecDTO;
 import com.izouma.dingdong.dto.UserOrderDTO;
 import com.izouma.dingdong.dto.UserOrderDTO;
-import com.izouma.dingdong.enums.CouponType;
 import com.izouma.dingdong.enums.MerchantStatus;
 import com.izouma.dingdong.enums.MerchantStatus;
+import com.izouma.dingdong.enums.RiderStatus;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
+import com.izouma.dingdong.repo.ShoppingCartRepo;
+import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.merchant.GoodsRepo;
 import com.izouma.dingdong.repo.merchant.GoodsRepo;
 import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
 import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
+import com.izouma.dingdong.repo.user.AddressRepo;
 import com.izouma.dingdong.repo.user.CouponRepo;
 import com.izouma.dingdong.repo.user.CouponRepo;
 import com.izouma.dingdong.service.merchant.GoodsService;
 import com.izouma.dingdong.service.merchant.GoodsService;
+import com.izouma.dingdong.service.merchant.MerchantService;
 import com.izouma.dingdong.service.merchant.MerchantSettingsService;
 import com.izouma.dingdong.service.merchant.MerchantSettingsService;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
+import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
-import java.math.BigDecimal;
 import java.time.DayOfWeek;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.LocalTime;
 import java.util.List;
 import java.util.List;
-import java.util.Objects;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
@@ -41,17 +46,24 @@ public class OrderInfoService {
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
     private GoodsRepo goodsRepo;
     private GoodsRepo goodsRepo;
     private GoodsService goodsService;
     private GoodsService goodsService;
-    private MerchantRepo merchantRepo;
     private MerchantSettingsRepo merchantSettingsRepo;
     private MerchantSettingsRepo merchantSettingsRepo;
-    private MerchantSettingsService merchantSettingsService;
+    private ShoppingCartRepo shoppingCartRepo;
+    private AddressRepo addressRepo;
+    private UserRepo userRepo;
+    private MerchantService merchantService;
 
 
     /*
     /*
     用户下单
     用户下单
      */
      */
-    public void userOrder(UserOrderDTO userOrderDTO) {
+    public OrderInfo userOrder(UserOrderDTO userOrderDTO) {
+
+        ShoppingCart cart = shoppingCartRepo.findById(userOrderDTO.getShoppingCartId()).orElseThrow(new BusinessException("不存在"));
+
+        //商家
+        MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(cart.getMerchantId()).orElseThrow(new BusinessException("无商家"));
         //商家
         //商家
-        Merchant merchant = merchantRepo.findById(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
-        MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
+//        Merchant merchant = merchantRepo.findById(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
+//        MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
 
 
         LocalTime startTime = merchantSettings.getStartTime();
         LocalTime startTime = merchantSettings.getStartTime();
         LocalTime endTime = merchantSettings.getEndTime();
         LocalTime endTime = merchantSettings.getEndTime();
@@ -67,76 +79,103 @@ public class OrderInfoService {
 
 
         OrderInfo orderInfo = new OrderInfo();
         OrderInfo orderInfo = new OrderInfo();
         BeanUtil.copyProperties(userOrderDTO, orderInfo);
         BeanUtil.copyProperties(userOrderDTO, orderInfo);
+        BeanUtil.copyProperties(cart, orderInfo);
         orderInfo.setMerchantStatus(MerchantStatus.NOT_RECEIVED);
         orderInfo.setMerchantStatus(MerchantStatus.NOT_RECEIVED);
         orderInfo.setCancel(false);
         orderInfo.setCancel(false);
         orderInfo.setOrderTime(now);
         orderInfo.setOrderTime(now);
-        orderInfoRepo.save(orderInfo);
+        orderInfo.setEnabled(true);
+
+        //使用优惠券(满减优惠券)
+        if (ObjectUtil.isNotNull(userOrderDTO.getCouponId())) {
+            Coupon coupon = couponRepo.findById(userOrderDTO.getCouponId()).orElseThrow(new BusinessException("优惠券不存在"));
+            //未过期,未使用
+            if (coupon.getEndDate().isAfter(now.toLocalDate()) && !coupon.getIsUsed()) {
+                if (coupon.getFullAmount().compareTo(cart.getGoodsTotal()) <= 0) {
+                    //订单金额,优惠券Id
+                    orderInfo.setPackingPrice(coupon.getAmount());
+                    orderInfo.setCouponId(coupon.getId());
+                    orderInfo.setRealAmount(orderInfo.getRealAmount().subtract(orderInfo.getPackingPrice()));
+
+                    coupon.setIsUsed(true);
+                    coupon.setUsedTime(now);
+                    couponRepo.save(coupon);
+                }
+            }
+        }
 
 
-        //详细商品信息
-        userOrderDTO.getGoodsSpecs().forEach(goodsSpecDTO -> {
-                    //查库存是否足够
-                    Goods goods = goodsService.buy(goodsSpecDTO.getGoodsId(), goodsSpecDTO.getNum());
+        //用户地址
+        Address address = addressRepo.findById(userOrderDTO.getAddressId()).orElseThrow(new BusinessException("地址不存在"));
+        orderInfo.setUserAddress(address.getAddressName());
+
+        OrderInfo save = orderInfoRepo.save(orderInfo);
 
 
+        cart.getOrderGoodsSpecs().forEach(s -> {
+                    //查库存是否足够
+                    Goods goods = goodsService.buy(s.getGoodsId(), s.getNum());
                     //商品销售时间内
                     //商品销售时间内
                     if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
                     if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
                         throw new BusinessException("非营业时间");
                         throw new BusinessException("非营业时间");
                     }
                     }
-
-                    //保存规格
-                    orderGoodsSpecRepo.save(OrderGoodsSpec.builder()
-                            .goodsId(goodsSpecDTO.getGoodsId())
-                            .goodsPrice(goodsSpecDTO.getGoodsPrice())
-                            .num(goodsSpecDTO.getNum())
-                            .specification(goodsSpecDTO.getSpecification().toString())
-                            .orderId(orderInfo.getId())
-                            .build());
-
                     //查商品数据,加商品销量,减商品库存
                     //查商品数据,加商品销量,减商品库存
-                    goods.setInventory(goods.getInventory() - goodsSpecDTO.getNum());
-                    goods.setTotalSales(goods.getTotalSales() + goodsSpecDTO.getNum());
+                    goods.setInventory(goods.getInventory() - s.getNum());
+                    goods.setTotalSales(goods.getTotalSales() + s.getNum());
                     goodsRepo.save(goods);
                     goodsRepo.save(goods);
+
+                    s.setOrderId(save.getId());
+                    orderGoodsSpecRepo.save(s);
                 }
                 }
         );
         );
 
 
+//        //详细商品信息
+//        userOrderDTO.getGoodsSpecs().forEach(goodsSpecDTO -> {
+//                    //查库存是否足够
+//                    Goods goods = goodsService.buy(goodsSpecDTO.getGoodsId(), goodsSpecDTO.getNum());
+//
+//                    //商品销售时间内
+//                    if (goods.getStartTime().compareTo(nowTime) >= 0 || goods.getEndTime().compareTo(nowTime) <= 0) {
+//                        throw new BusinessException("非营业时间");
+//                    }
+//
+//                    //保存规格
+//                    orderGoodsSpecRepo.save(OrderGoodsSpec.builder()
+//                            .goodsId(goodsSpecDTO.getGoodsId())
+//                            .goodsPrice(goodsSpecDTO.getGoodsPrice())
+//                            .num(goodsSpecDTO.getNum())
+//                            .specification(goodsSpecDTO.getSpecification().toString())
+//                            .orderId(orderInfo.getId())
+//                            .build());
+//
+//                    //查商品数据,加商品销量,减商品库存
+//                    goods.setInventory(goods.getInventory() - goodsSpecDTO.getNum());
+//                    goods.setTotalSales(goods.getTotalSales() + goodsSpecDTO.getNum());
+//                    goodsRepo.save(goods);
+//                }
+//        );
+
         //商家是否自动接单
         //商家是否自动接单
-        if (merchant.getAutomaticOrder()) {
-            receiveOrder(orderInfo.getId(), true);
+        if (merchantSettings.getAutomaticOrder()) {
+            merReceiveOrder(save.getId(), true);
         }
         }
 
 
-    }
-
-    /*
-    计算价钱
-     */
-    private void sumAmount(OrderInfo orderInfo) {
-
-        Coupon coupon = couponRepo.findById(orderInfo.getCouponId()).orElseThrow(new BusinessException("优惠卷不存在"));
-        CouponType type = coupon.getType();
-        BigDecimal goodsAmount = orderInfo.getTotalAmount();
-        if (type == CouponType.REDUCTION) {
-            if (goodsAmount.compareTo(coupon.getFullAmount()) >= 0) {
-                goodsAmount = goodsAmount.subtract(coupon.getAmount());
-            }
-
-        }
+        return orderInfo;
 
 
-        coupon.setUsedTime(LocalDateTime.now());
-        coupon.setIsUsed(true);
     }
     }
 
 
+
     /*
     /*
     商家接单
     商家接单
      */
      */
-    public OrderInfo receiveOrder(Long orderId, Boolean pass) {
+    public void merReceiveOrder(Long orderId, Boolean pass) {
         OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
         OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
         if (pass) {
         if (pass) {
             orderInfo.setMerchantStatus(MerchantStatus.RECEIVED);
             orderInfo.setMerchantStatus(MerchantStatus.RECEIVED);
+            //通知骑手
         } else {
         } else {
             orderInfo.setMerchantStatus(MerchantStatus.REJECTED);
             orderInfo.setMerchantStatus(MerchantStatus.REJECTED);
             orderInfo.setCancel(true);
             orderInfo.setCancel(true);
             //退款流程
             //退款流程
         }
         }
-        return orderInfoRepo.save(orderInfo);
+        orderInfoRepo.save(orderInfo);
     }
     }
 
 
     /*
     /*
@@ -153,5 +192,32 @@ public class OrderInfoService {
 
 
     }
     }
 
 
+    /*
+    骑手接单
+     */
+    public void ridReceiveOrder(Long riderId, Long orderId, Boolean pass) {
+        OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        if (pass) {
+            orderInfo.setRiderId(riderId);
+            orderInfo.setRiderStatus(RiderStatus.RECEIVED);
+            orderInfoRepo.save(orderInfo);
+        }
+    }
+
+    /*
+    我的订单
+     */
+    public List<OrderInfo> my(Long userId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        switch (user.getIdentity()) {
+            case USER:
+                return orderInfoRepo.findAllByUserId(userId);
+            case MERCHANT:
+                Long merchantId = merchantService.findMerchantId(userId);
+                return orderInfoRepo.findAllByMerchantId(merchantId);
+           // case RIDER:
+        }
+        return null;
+    }
 
 
 }
 }

+ 3 - 1
src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java

@@ -82,6 +82,7 @@ public class OrderRefundApplyService {
             return;
             return;
         }
         }
 
 
+
         userRepo.findById(apply.getOrderInfo().getUserId()).orElseThrow(new BusinessException("无用户"));
         userRepo.findById(apply.getOrderInfo().getUserId()).orElseThrow(new BusinessException("无用户"));
         if (consent) {
         if (consent) {
 
 
@@ -93,11 +94,12 @@ public class OrderRefundApplyService {
             }
             }
 
 
         } else {
         } else {
+
+
             apply.setStatus(RefundStatus.DENY);
             apply.setStatus(RefundStatus.DENY);
             apply.getOrderInfo().setStatus((status != null) ? status : OrderStatus.PAID);
             apply.getOrderInfo().setStatus((status != null) ? status : OrderStatus.PAID);
             //上报到后台
             //上报到后台
             apply.setReport(true);
             apply.setReport(true);
-
         }
         }
         apply.setAuditTime(LocalDateTime.now());
         apply.setAuditTime(LocalDateTime.now());
         orderInfoRepo.save(apply.getOrderInfo());
         orderInfoRepo.save(apply.getOrderInfo());

+ 153 - 0
src/main/java/com/izouma/dingdong/service/ShoppingCartService.java

@@ -0,0 +1,153 @@
+package com.izouma.dingdong.service;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.domain.ShoppingCart;
+import com.izouma.dingdong.domain.User;
+import com.izouma.dingdong.domain.merchant.FullReduction;
+import com.izouma.dingdong.domain.merchant.Goods;
+import com.izouma.dingdong.domain.merchant.MerchantSettings;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
+import com.izouma.dingdong.repo.OrderInfoRepo;
+import com.izouma.dingdong.repo.ShoppingCartRepo;
+import com.izouma.dingdong.repo.UserRepo;
+import com.izouma.dingdong.repo.merchant.FullReductionRepo;
+import com.izouma.dingdong.repo.merchant.GoodsRepo;
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
+import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
+import com.izouma.dingdong.service.merchant.GoodsService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class ShoppingCartService {
+
+    private ShoppingCartRepo shoppingCartRepo;
+    private GoodsRepo goodsRepo;
+    private UserRepo userRepo;
+    private OrderInfoRepo orderInfoRepo;
+    private MerchantSettingsRepo merchantSettingsRepo;
+    private FullReductionRepo fullReductionRepo;
+    private OrderGoodsSpecRepo orderGoodsSpecRepo;
+    private GoodsService goodsService;
+
+    /*
+    创建购物车
+     */
+    public ShoppingCart save(Long userId, OrderGoodsSpec orderGoodsSpec) {
+        Goods goods = goodsRepo.findById(orderGoodsSpec.getGoodsId()).orElseThrow(new BusinessException("无商品"));
+
+        //查看商品库存是否足够
+        //Goods goods = goodsService.buy(orderGoodsSpec.getGoodsId(), orderGoodsSpec.getNum());
+
+        //按商家创建购物车
+        Long merchantId = goods.getMerchantId();
+
+        //商家信息
+        MerchantSettings merchant = merchantSettingsRepo.findByMerchantId(merchantId).orElseThrow(new BusinessException("无商户"));
+
+        //查找是不是第一次购买
+        userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+
+        //购物车中是否已有
+        ShoppingCart shoppingCart = shoppingCartRepo.findByUserIdAndMerchantId(userId, merchantId);
+
+        //加规格
+        List<OrderGoodsSpec> specs = CollUtil.newArrayList();
+        specs.add(orderGoodsSpec);
+
+        BigDecimal sub = orderGoodsSpec.getGoodsPrice().subtract(orderGoodsSpec.getGoodsRealPrice()).multiply(BigDecimal.valueOf(orderGoodsSpec.getNum()));
+
+        if (ObjectUtil.isNull(shoppingCart)) {
+            shoppingCart = ShoppingCart.builder()
+                    .merchantId(goods.getMerchantId())
+                    .userId(userId)
+                    .goodsTotal(orderGoodsSpec.getGoodsPrice().multiply(BigDecimal.valueOf(orderGoodsSpec.getNum())))
+                    .reducedAmount(sub)
+                    .orderGoodsSpecs(specs)
+                    .packingPrice(goods.getPackingPrice())
+                    .fullReduction(BigDecimal.ZERO)
+                    .build();
+        } else {
+            //商品总价(原价)
+            shoppingCart.setGoodsTotal(shoppingCart.getGoodsTotal().add(orderGoodsSpec.getGoodsPrice().multiply(BigDecimal.valueOf(orderGoodsSpec.getNum()))));
+            //折扣的差价
+            shoppingCart.setReducedAmount(shoppingCart.getReducedAmount().add(sub));
+            specs.addAll(shoppingCart.getOrderGoodsSpecs());
+            shoppingCart.setOrderGoodsSpecs(specs);
+            //包装费
+            shoppingCart.setPackingPrice(shoppingCart.getPackingPrice().add(goods.getPackingPrice()));
+        }
+
+        //查找是不是第一次购买
+        List<OrderInfo> userOrders = orderInfoRepo.findAllByUserId(userId);
+        List<OrderInfo> userOrdersMerchant = orderInfoRepo.findAllByUserIdAndMerchantId(userId, merchantId);
+        //是新用户也是首单
+        if (CollUtil.isEmpty(userOrders)) {
+            shoppingCart.setNewUser(merchant.getNewUser());
+            shoppingCart.setFirstBuy(merchant.getFirstOrder());
+        } else {
+            //首单
+            if (CollUtil.isEmpty(userOrdersMerchant)) {
+                shoppingCart.setNewUser(BigDecimal.ZERO);
+                shoppingCart.setFirstBuy(merchant.getFirstOrder());
+            } else {
+                //非首单设置为0
+                shoppingCart.setNewUser(BigDecimal.ZERO);
+                shoppingCart.setFirstBuy(BigDecimal.ZERO);
+            }
+        }
+
+
+        //获取配送费
+        shoppingCart.setDeliveryAmount(BigDecimal.TEN);
+
+
+        boolean flag = true;
+        //满减
+        if (!goods.getIsFullReduction()) {
+            flag = false;
+        }
+        if (flag) {
+            //参与满减
+            List<FullReduction> fullReductions = fullReductionRepo.findAllByMerchantId(merchantId);
+            fullReductions.sort(Comparator.comparing(FullReduction::getFullAmount));
+            for (FullReduction f : fullReductions) {
+                if (f.getFullAmount().compareTo(shoppingCart.getGoodsTotal()) <= 0) {
+                    shoppingCart.setFullReduction(f.getMinusAmount());
+                    //不是折扣是满减,就置为减去的金额
+                    shoppingCart.setReducedAmount(f.getMinusAmount());
+                }
+            }
+        }
+
+
+        //商品总价+配送费+包装费
+        BigDecimal total = shoppingCart.getGoodsTotal().add(shoppingCart.getDeliveryAmount()).add(shoppingCart.getPackingPrice());
+
+        //需要减去的金额=首单+新用户+折扣/满减
+        BigDecimal sub2 = shoppingCart.getFirstBuy().add(shoppingCart.getNewUser()).add(shoppingCart.getFullReduction()).add(shoppingCart.getReducedAmount());
+        //总价-首单-新用户-满减
+        BigDecimal real = total.subtract(total.subtract(sub2));
+
+        shoppingCart.setRealAmount(real);
+        shoppingCart.setReducedAmount(sub2);
+
+        shoppingCart = shoppingCartRepo.save(shoppingCart);
+
+        orderGoodsSpec.setShoppingCartId(shoppingCart.getId());
+        orderGoodsSpecRepo.save(orderGoodsSpec);
+
+        return shoppingCart;
+    }
+
+}

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

@@ -54,6 +54,7 @@ public class UserService {
                     .build();
                     .build();
             userRepo.save(user);
             userRepo.save(user);
         }
         }
+
         return user;
         return user;
     }
     }
 
 

+ 92 - 1
src/main/java/com/izouma/dingdong/service/backstage/BlackListService.java

@@ -1,24 +1,115 @@
 package com.izouma.dingdong.service.backstage;
 package com.izouma.dingdong.service.backstage;
 
 
+import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.backstage.BlackList;
 import com.izouma.dingdong.domain.backstage.BlackList;
+import com.izouma.dingdong.domain.merchant.Merchant;
+import com.izouma.dingdong.domain.rider.Rider;
+import com.izouma.dingdong.enums.Identity;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.backstage.BlackListRepo;
 import com.izouma.dingdong.repo.backstage.BlackListRepo;
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
+import com.izouma.dingdong.repo.rider.RiderRepo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.time.LocalDateTime;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class BlackListService {
 public class BlackListService {
 
 
     private BlackListRepo blackListRepo;
     private BlackListRepo blackListRepo;
-
+    private UserRepo userRepo;
+    private MerchantRepo merchantRepo;
+    private RiderRepo riderRepo;
 
 
     /*
     /*
     加入黑名单
     加入黑名单
      */
      */
+    public BlackList move(Long userId, String reason) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("不存在"));
+
+        BlackList build = BlackList.builder()
+                .userId(userId)
+                .reason(reason)
+                .identity(user.getIdentity())
+                .remove(false)
+                .moveTime(LocalDateTime.now())
+                .build();
+
+        switch (user.getIdentity()) {
+            case RIDER:
+                Merchant merchant = merchantRepo.findByUserId(userId).orElseThrow(new BusinessException("商家不存在"));
+                merchant.setBlacklist(true);
+                merchantRepo.save(merchant);
+                build.setOtherId(merchant.getId());
+                break;
+            case MERCHANT:
+                Rider rider = riderRepo.findByUserId(userId).orElseThrow(new BusinessException("骑手不存在"));
+                rider.setBlacklist(true);
+                riderRepo.save(rider);
+                build.setOtherId(rider.getJobNumber());
+                break;
+            case USER:
+                user.setBlacklist(true);
+                userRepo.save(user);
+                build.setOtherId(userId);
+                break;
+        }
+
+/*        if (Identity.MERCHANT.equals(user.getIdentity())) {
+            Merchant merchant = merchantRepo.findByUserId(userId).orElseThrow(new BusinessException("商家不存在"));
+            merchant.setBlacklist(true);
+            merchantRepo.save(merchant);
+            build.setOtherId(merchant.getId());
+
+        } else if (Identity.RIDER.equals(user.getIdentity())) {
+            Rider rider = riderRepo.findByUserId(userId).orElseThrow(new BusinessException("骑手不存在"));
+            rider.setBlacklist(true);
+            riderRepo.save(rider);
+            build.setOtherId(rider.getJobNumber());
+
+        } else {
+            user.setBlacklist(true);
+            userRepo.save(user);
+            build.setOtherId(userId);
+        }*/
+
+        return blackListRepo.save(build);
+
+    }
 
 
 
 
     /*
     /*
     移出黑名单
     移出黑名单
      */
      */
+    public void remove(Long id) {
+        BlackList blackList = blackListRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        blackList.setRemove(true);
+        blackList.setRemoveTime(LocalDateTime.now());
+        blackListRepo.save(blackList);
+
+        switch (blackList.getIdentity()) {
+            case USER:
+                User user = userRepo.findById(blackList.getOtherId()).orElseThrow(new BusinessException("无用户"));
+                user.setBlacklist(false);
+                userRepo.save(user);
+                break;
+
+            case MERCHANT:
+                Merchant merchant = merchantRepo.findById(blackList.getOtherId()).orElseThrow(new BusinessException("无商户"));
+                merchant.setBlacklist(false);
+                merchantRepo.save(merchant);
+                break;
+
+            case RIDER:
+                Rider rider = riderRepo.findByJobNumber(blackList.getOtherId()).orElseThrow(new BusinessException("无骑手"));
+                rider.setBlacklist(false);
+                riderRepo.save(rider);
+                break;
+
+        }
+    }
 
 
 }
 }

+ 14 - 0
src/main/java/com/izouma/dingdong/service/backstage/EmailService.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.backstage;
+
+import com.izouma.dingdong.domain.backstage.Email;
+import com.izouma.dingdong.repo.backstage.EmailRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class EmailService {
+
+    private EmailRepo emailRepo;
+
+}

+ 14 - 0
src/main/java/com/izouma/dingdong/service/backstage/TimeTagService.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.backstage;
+
+import com.izouma.dingdong.domain.backstage.TimeTag;
+import com.izouma.dingdong.repo.backstage.TimeTagRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class TimeTagService {
+
+    private TimeTagRepo timeTagRepo;
+
+}

+ 5 - 4
src/main/java/com/izouma/dingdong/service/merchant/FullReductionService.java

@@ -27,24 +27,25 @@ public class FullReductionService {
     添加
     添加
      */
      */
     public void add(Long userId, List<FullReductionDTO> fullReductionDTOS) {
     public void add(Long userId, List<FullReductionDTO> fullReductionDTOS) {
-       // Long merchantId = merchantService.findMerchantId(userId);
+        Long merchantId = merchantService.findMerchantId(userId);
 
 
         for (FullReductionDTO dto : fullReductionDTOS) {
         for (FullReductionDTO dto : fullReductionDTOS) {
-            toDTO(userId, dto);
+            toDTO(merchantId, dto);
         }
         }
     }
     }
 
 
     /*
     /*
     DTO转实体
     DTO转实体
      */
      */
-    private void toDTO(Long userId, FullReductionDTO dto) {
+    private void toDTO(Long id, FullReductionDTO dto) {
         if (dto.getFullAmount().compareTo(dto.getMinusAmount()) <= 0) {
         if (dto.getFullAmount().compareTo(dto.getMinusAmount()) <= 0) {
             throw new BusinessException("减的金额不能大于等于满的金额");
             throw new BusinessException("减的金额不能大于等于满的金额");
         }
         }
         FullReduction fullReduction = new FullReduction();
         FullReduction fullReduction = new FullReduction();
         fullReduction.setFullAmount(dto.getFullAmount());
         fullReduction.setFullAmount(dto.getFullAmount());
         fullReduction.setMinusAmount(dto.getMinusAmount());
         fullReduction.setMinusAmount(dto.getMinusAmount());
-        fullReduction.setUserId(userId);
+        //fullReduction.setUserId(userId);
+        fullReduction.setMerchantId(id);
         fullReductionRepo.save(fullReduction);
         fullReductionRepo.save(fullReduction);
     }
     }
 }
 }

+ 57 - 5
src/main/java/com/izouma/dingdong/service/merchant/GoodsService.java

@@ -4,7 +4,9 @@ import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
+import com.izouma.dingdong.enums.ApplyStatus;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.merchant.GoodsRepo;
 import com.izouma.dingdong.repo.merchant.GoodsRepo;
 import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.repo.merchant.MerchantRepo;
@@ -32,8 +34,12 @@ public class GoodsService {
 
 
     private MerchantClassificationService merchantClassificationService;
     private MerchantClassificationService merchantClassificationService;
 
 
-    /*
-    添加修改商品
+
+    /**
+     * 添加修改商品
+     *
+     * @param goods 商品
+     * @return 商品
      */
      */
     public Goods save(Goods goods) {
     public Goods save(Goods goods) {
         if (ObjectUtil.isNull(goods.getMerchantId())) {
         if (ObjectUtil.isNull(goods.getMerchantId())) {
@@ -62,6 +68,16 @@ public class GoodsService {
             goods.setTakeOff(false);
             goods.setTakeOff(false);
             goods.setSignboard(false);
             goods.setSignboard(false);
             goods.setEnabled(true);
             goods.setEnabled(true);
+            //审核
+            goods.setIsPass(false);
+            goods.setStatus(ApplyStatus.PENDING);
+        }
+
+        //折扣价不参与满减
+        if (i == 0) {
+            goods.setIsFullReduction(true);
+        } else {
+            goods.setIsFullReduction(false);
         }
         }
 
 
         goods = goodsRepo.save(goods);
         goods = goodsRepo.save(goods);
@@ -80,8 +96,12 @@ public class GoodsService {
     }
     }
 
 
 
 
-    /*
-    购买商品/销量
+    /**
+     * 购买时销量是否充足
+     *
+     * @param goodsId 商品ID
+     * @param num     商品数量
+     * @return 商品
      */
      */
     public Goods buy(Long goodsId, Integer num) {
     public Goods buy(Long goodsId, Integer num) {
         Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
         Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
@@ -94,8 +114,40 @@ public class GoodsService {
         if (inventory - num < 0) {
         if (inventory - num < 0) {
             throw new BusinessException("库存不足");
             throw new BusinessException("库存不足");
         }
         }
-
         return goods;
         return goods;
     }
     }
 
 
+
+    /**
+     * 商品上下架
+     *
+     * @param goodsId 商品ID
+     */
+    public void take(Long goodsId) {
+        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
+        Boolean takeOff = goods.getTakeOff();
+        if (takeOff) {
+            goods.setTakeOff(false);
+        } else {
+            goods.setTakeOff(true);
+        }
+        goodsRepo.save(goods);
+    }
+
+    /**
+     * 审核
+     * @param goodsId
+     * @param pass
+     */
+    public void audit(Long goodsId, Boolean pass) {
+        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
+        if (pass) {
+            goods.setIsPass(true);
+            goods.setStatus(ApplyStatus.PASS);
+        } else {
+            goods.setIsPass(false);
+            goods.setStatus(ApplyStatus.DENY);
+        }
+        goodsRepo.save(goods);
+    }
 }
 }

+ 2 - 2
src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java

@@ -67,7 +67,7 @@ public class MerchantService {
             }
             }
         }
         }
 
 
-
+        user.setPassword(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()));
         user.setAvatar(merchantDTO.getLogo());
         user.setAvatar(merchantDTO.getLogo());
         user.setNickname(merchantDTO.getShowName());
         user.setNickname(merchantDTO.getShowName());
         user.setIdentity(Identity.MERCHANT);
         user.setIdentity(Identity.MERCHANT);
@@ -91,7 +91,6 @@ public class MerchantService {
 //        }
 //        }
 //        user = userRepo.save(user);
 //        user = userRepo.save(user);
 
 
-
 /*        if (ObjectUtil.isEmpty(merchantDTO.getBusinessNature())) {
 /*        if (ObjectUtil.isEmpty(merchantDTO.getBusinessNature())) {
             throw new BusinessException("商家性质未填");
             throw new BusinessException("商家性质未填");
         }*/
         }*/
@@ -152,6 +151,7 @@ public class MerchantService {
      */
      */
     public void audit(Long merchantId, Boolean pass) {
     public void audit(Long merchantId, Boolean pass) {
         Merchant merchant = merchantRepo.findById(merchantId).orElseThrow(new BusinessException("商户不存在"));
         Merchant merchant = merchantRepo.findById(merchantId).orElseThrow(new BusinessException("商户不存在"));
+
         if (pass) {
         if (pass) {
             merchant.setStatus(ApplyStatus.PASS);
             merchant.setStatus(ApplyStatus.PASS);
             merchant.setIsPass(true);
             merchant.setIsPass(true);

+ 14 - 0
src/main/java/com/izouma/dingdong/service/rider/RiderService.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.rider;
+
+import com.izouma.dingdong.domain.rider.Rider;
+import com.izouma.dingdong.repo.rider.RiderRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class RiderService {
+
+    private RiderRepo riderRepo;
+
+}

+ 7 - 0
src/main/java/com/izouma/dingdong/web/AppraisalController.java

@@ -77,10 +77,17 @@ public class AppraisalController extends BaseController {
         return appraisalRepo.save(appraisal);
         return appraisalRepo.save(appraisal);
     }
     }
 
 
+    @GetMapping("/my")
     @ApiOperation("显示商家的所有评价")
     @ApiOperation("显示商家的所有评价")
     public List<Appraisal> merchant() {
     public List<Appraisal> merchant() {
         return appraisalRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
         return appraisalRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
     }
     }
 
 
+    @GetMapping("/order")
+    @ApiOperation("订单评价")
+    public Appraisal order(Long orderId){
+        return appraisalRepo.findByOrderId(orderId).orElseThrow(new BusinessException("无评价"));
+    }
+
 }
 }
 
 

+ 34 - 0
src/main/java/com/izouma/dingdong/web/BaseController.java

@@ -10,6 +10,7 @@ import org.springframework.data.jpa.domain.Specification;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Predicate;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
 public class BaseController {
 public class BaseController {
@@ -45,6 +46,39 @@ public class BaseController {
                         return;
                         return;
                     }
                     }
                 }
                 }
+
+
+                try {
+                    Field field = queryClass.getDeclaredField(property);
+                    Class fieldType = field.getType();
+                    if (Enum.class.isAssignableFrom(fieldType)) {
+                        if (value instanceof Collection) {
+                            if (!((Collection) value).isEmpty()) {
+                                List list = new ArrayList();
+                                for (Object o : ((Collection) value)) {
+                                    list.add(Enum.valueOf(fieldType, String.valueOf(o)));
+                                }
+                                and.add(root.get(property).in(list));
+                            }
+                        } else if (value instanceof String && StringUtils.isNotEmpty((String) value)) {
+                            if (((String) value).contains(",")) {
+                                String[] arr = ((String) value).split(",");
+                                List list = new ArrayList();
+                                for (String s : arr) {
+                                    list.add(Enum.valueOf(fieldType, s));
+                                }
+                                and.add(root.get(property).in(list));
+                            } else {
+                                and.add(criteriaBuilder.and(criteriaBuilder
+                                        .equal(root.get(property), Enum
+                                                .valueOf(fieldType, String.valueOf(value)))));
+                            }
+                        }
+                    }
+                } catch (NoSuchFieldException e) {
+                    e.printStackTrace();
+                }
+
                 and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
                 and.add(criteriaBuilder.and(criteriaBuilder.equal(root.get(property), value)));
             });
             });
             if (StringUtils.isNotEmpty(pageQuery.getSearch())) {
             if (StringUtils.isNotEmpty(pageQuery.getSearch())) {

+ 28 - 0
src/main/java/com/izouma/dingdong/web/OrderInfoController.java

@@ -1,13 +1,18 @@
 package com.izouma.dingdong.web;
 package com.izouma.dingdong.web;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.dto.UserOrderDTO;
+import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.service.OrderInfoService;
 import com.izouma.dingdong.service.OrderInfoService;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -22,6 +27,7 @@ public class OrderInfoController extends BaseController {
     private OrderInfoService orderInfoService;
     private OrderInfoService orderInfoService;
     private OrderInfoRepo orderInfoRepo;
     private OrderInfoRepo orderInfoRepo;
 
 
+
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
     public OrderInfo save(@RequestBody OrderInfo record) {
     public OrderInfo save(@RequestBody OrderInfo record) {
@@ -56,5 +62,27 @@ public class OrderInfoController extends BaseController {
         List<OrderInfo> data = all(pageQuery).getContent();
         List<OrderInfo> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
         ExcelUtils.export(response, data);
     }
     }
+
+
+    @PostMapping("/order")
+    @ApiOperation("从购物车生成订单")
+    public OrderInfo order(UserOrderDTO userOrderDTO){
+        return orderInfoService.userOrder(userOrderDTO);
+    }
+
+    @GetMapping("/my")
+    @ApiOperation("个人订单")
+    public List<OrderInfo> my(){
+        return orderInfoService.my(SecurityUtils.getAuthenticatedUser().getId());
+    }
+
+
+    @GetMapping("/list")
+    @ApiOperation("/按userId查订单")
+    public Page<OrderInfo> list(Long id){
+        List<OrderInfo> list = orderInfoService.my(id);
+        return new PageImpl<>(list);
+    }
+
 }
 }
 
 

+ 77 - 0
src/main/java/com/izouma/dingdong/web/ShoppingCartController.java

@@ -0,0 +1,77 @@
+package com.izouma.dingdong.web;
+
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.domain.ShoppingCart;
+
+import com.izouma.dingdong.domain.merchant.GoodsSpecification;
+import com.izouma.dingdong.service.OrderGoodsSpecService;
+import com.izouma.dingdong.service.ShoppingCartService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.ShoppingCartRepo;
+import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.SecurityUtils;
+import com.izouma.dingdong.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/shoppingCart")
+@AllArgsConstructor
+public class ShoppingCartController extends BaseController {
+
+    private ShoppingCartService shoppingCartService;
+    private ShoppingCartRepo shoppingCartRepo;
+    private OrderGoodsSpecService orderGoodsSpecService;
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ShoppingCart save(@RequestBody ShoppingCart record) {
+        if (record.getId() != null) {
+            ShoppingCart orig = shoppingCartRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return shoppingCartRepo.save(orig);
+        }
+        return shoppingCartRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<ShoppingCart> all(PageQuery pageQuery) {
+        return shoppingCartRepo.findAll(toSpecification(pageQuery, ShoppingCart.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public ShoppingCart get(@PathVariable Long id) {
+        return shoppingCartRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        shoppingCartRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ShoppingCart> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/cart")
+    @ApiOperation("选择规格后就加入购物车")
+    public ShoppingCart cart(Long goodsId, List<GoodsSpecification> goodsSpecifications) {
+        //无规格时,goodsSpecifications可不填
+        OrderGoodsSpec orderGoodsSpec = orderGoodsSpecService.add(goodsId, goodsSpecifications);
+        return shoppingCartService.save(SecurityUtils.getAuthenticatedUser().getId(), orderGoodsSpec);
+    }
+}
+

+ 14 - 1
src/main/java/com/izouma/dingdong/web/backstage/BlackListController.java

@@ -9,6 +9,7 @@ import com.izouma.dingdong.repo.backstage.BlackListRepo;
 import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
 
 
+import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -40,7 +41,7 @@ public class BlackListController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
     @GetMapping("/all")
     public Page<BlackList> all(PageQuery pageQuery) {
     public Page<BlackList> all(PageQuery pageQuery) {
-        return blackListRepo.findAll(toSpecification(pageQuery,BlackList.class), toPageRequest(pageQuery));
+        return blackListRepo.findAll(toSpecification(pageQuery, BlackList.class), toPageRequest(pageQuery));
     }
     }
 
 
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
@@ -59,5 +60,17 @@ public class BlackListController extends BaseController {
         List<BlackList> data = all(pageQuery).getContent();
         List<BlackList> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
         ExcelUtils.export(response, data);
     }
     }
+
+    @GetMapping("/move")
+    @ApiOperation("移入黑名单")
+    public BlackList move(Long id, String reason) {
+        return blackListService.move(id, reason);
+    }
+
+    @GetMapping("/remove")
+    @ApiOperation("移出黑名单")
+    public void remove(Long id) {
+        blackListService.remove(id);
+    }
 }
 }
 
 

+ 63 - 0
src/main/java/com/izouma/dingdong/web/backstage/EmailController.java

@@ -0,0 +1,63 @@
+package com.izouma.dingdong.web.backstage;
+
+import com.izouma.dingdong.web.BaseController;
+import com.izouma.dingdong.domain.backstage.Email;
+import com.izouma.dingdong.service.backstage.EmailService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.backstage.EmailRepo;
+import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/email")
+@AllArgsConstructor
+public class EmailController extends BaseController {
+    private EmailService emailService;
+    private EmailRepo emailRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Email save(@RequestBody Email record) {
+        if (record.getId() != null) {
+            Email orig = emailRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return emailRepo.save(orig);
+        }
+        return emailRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<Email> all(PageQuery pageQuery) {
+        return emailRepo.findAll(toSpecification(pageQuery,Email.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public Email get(@PathVariable Long id) {
+        return emailRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        emailRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Email> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/dingdong/web/backstage/TimeTagController.java

@@ -0,0 +1,63 @@
+package com.izouma.dingdong.web.backstage;
+
+import com.izouma.dingdong.web.BaseController;
+import com.izouma.dingdong.domain.backstage.TimeTag;
+import com.izouma.dingdong.service.backstage.TimeTagService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.backstage.TimeTagRepo;
+import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/timeTag")
+@AllArgsConstructor
+public class TimeTagController extends BaseController {
+    private TimeTagService timeTagService;
+    private TimeTagRepo timeTagRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public TimeTag save(@RequestBody TimeTag record) {
+        if (record.getId() != null) {
+            TimeTag orig = timeTagRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return timeTagRepo.save(orig);
+        }
+        return timeTagRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<TimeTag> all(PageQuery pageQuery) {
+        return timeTagRepo.findAll(toSpecification(pageQuery,TimeTag.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public TimeTag get(@PathVariable Long id) {
+        return timeTagRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        timeTagRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<TimeTag> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 2 - 1
src/main/java/com/izouma/dingdong/web/merchant/FullReductionController.java

@@ -72,7 +72,8 @@ public class FullReductionController extends BaseController {
     @GetMapping("/my")
     @GetMapping("/my")
     @ApiOperation("商户下的满减")
     @ApiOperation("商户下的满减")
     public List<FullReduction> my(){
     public List<FullReduction> my(){
-        return fullReductionRepo.findAllByUserId(SecurityUtils.getAuthenticatedUser().getId());
+        return fullReductionRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
+        //return fullReductionRepo.findAllByUserId(SecurityUtils.getAuthenticatedUser().getId());
     }
     }
 }
 }
 
 

+ 14 - 5
src/main/java/com/izouma/dingdong/web/merchant/GoodsController.java

@@ -14,12 +14,10 @@ import com.izouma.dingdong.utils.excel.ExcelUtils;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
 
 
 @RestController
 @RestController
@@ -48,7 +46,7 @@ public class GoodsController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
     @GetMapping("/all")
     public Page<Goods> all(PageQuery pageQuery) {
     public Page<Goods> all(PageQuery pageQuery) {
-        return goodsRepo.findAll(toSpecification(pageQuery,Goods.class), toPageRequest(pageQuery));
+        return goodsRepo.findAll(toSpecification(pageQuery, Goods.class), toPageRequest(pageQuery));
     }
     }
 
 
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
@@ -70,9 +68,20 @@ public class GoodsController extends BaseController {
     }
     }
 
 
     @GetMapping("/my")
     @GetMapping("/my")
-    public List<Goods> my(){
+    public List<Goods> my() {
         Long merchantId = merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId());
         Long merchantId = merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId());
-        return goodsRepo.findAllByMerchantId(merchantId);
+        return goodsRepo.findAllByMerchantIdAndIsPassTrue(merchantId);
+    }
+
+    @GetMapping("/take")
+    @ApiOperation("上下架商品")
+    public void take(Long id) {
+        goodsService.take(id);
+    }
+
+    @GetMapping("/audit")
+    public void audit(Long id, Boolean pass) {
+        goodsService.audit(id, pass);
     }
     }
 }
 }
 
 

+ 63 - 0
src/main/java/com/izouma/dingdong/web/rider/RiderController.java

@@ -0,0 +1,63 @@
+package com.izouma.dingdong.web.rider;
+
+import com.izouma.dingdong.web.BaseController;
+import com.izouma.dingdong.domain.rider.Rider;
+import com.izouma.dingdong.service.rider.RiderService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.rider.RiderRepo;
+import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/rider")
+@AllArgsConstructor
+public class RiderController extends BaseController {
+    private RiderService riderService;
+    private RiderRepo riderRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Rider save(@RequestBody Rider record) {
+        if (record.getId() != null) {
+            Rider orig = riderRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return riderRepo.save(orig);
+        }
+        return riderRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<Rider> all(PageQuery pageQuery) {
+        return riderRepo.findAll(toSpecification(pageQuery,Rider.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public Rider get(@PathVariable Long id) {
+        return riderRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        riderRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Rider> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

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

@@ -0,0 +1 @@
+{"tableName":"Email","className":"Email","remark":"邮箱","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/java/com/izouma/dingdong","viewPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"sendUserId","modelName":"sendUserId","remark":"发件人","showInList":true,"showInForm":true,"formType":"number"},{"name":"receiveUserId","modelName":"receiveUserId","remark":"收件人","showInList":true,"showInForm":true,"formType":"number"},{"name":"title","modelName":"title","remark":"标题","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"content","modelName":"content","remark":"内容","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.backstage.Email","genPackage":"backstage"}

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
src/main/resources/genjson/Rider.json


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
src/main/resources/genjson/ShoppingCart.json


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

@@ -0,0 +1 @@
+{"tableName":"TimeTag","className":"TimeTag","remark":"时间类别","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/java/com/izouma/dingdong","viewPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"名称","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"startTime","modelName":"startTime","remark":"开始时间","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"endTime","modelName":"endTime","remark":"结束时间","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.backstage.TimeTag","genPackage":"backstage"}

+ 81 - 1
src/main/vue/src/router.js

@@ -206,6 +206,70 @@ const router = new Router({
                     meta: {
                     meta: {
                        title: '黑名单表',
                        title: '黑名单表',
                     },
                     },
+               },
+                {
+                    path: '/emailEdit',
+                    name: 'EmailEdit',
+                    component: () => import(/* webpackChunkName: "emailEdit" */ '@/views/backstage/EmailEdit.vue'),
+                    meta: {
+                       title: '邮箱编辑',
+                    },
+                },
+                {
+                    path: '/emailList',
+                    name: 'EmailList',
+                    component: () => import(/* webpackChunkName: "emailList" */ '@/views/backstage/EmailList.vue'),
+                    meta: {
+                       title: '邮箱',
+                    },
+               },
+                {
+                    path: '/riderEdit',
+                    name: 'RiderEdit',
+                    component: () => import(/* webpackChunkName: "riderEdit" */ '@/views/rider/RiderEdit.vue'),
+                    meta: {
+                       title: '骑手编辑',
+                    },
+                },
+                {
+                    path: '/riderList',
+                    name: 'RiderList',
+                    component: () => import(/* webpackChunkName: "riderList" */ '@/views/rider/RiderList.vue'),
+                    meta: {
+                       title: '骑手',
+                    },
+               },
+                {
+                    path: '/timeTagEdit',
+                    name: 'TimeTagEdit',
+                    component: () => import(/* webpackChunkName: "timeTagEdit" */ '@/views/backstage/TimeTagEdit.vue'),
+                    meta: {
+                       title: '时间类别编辑',
+                    },
+                },
+                {
+                    path: '/timeTagList',
+                    name: 'TimeTagList',
+                    component: () => import(/* webpackChunkName: "timeTagList" */ '@/views/backstage/TimeTagList.vue'),
+                    meta: {
+                       title: '时间类别',
+                    },
+               },
+                {
+                    path: '/shoppingCartEdit',
+                    name: 'ShoppingCartEdit',
+                    component: () => import(/* webpackChunkName: "shoppingCartEdit" */ '@/views/ShoppingCartEdit.vue'),
+                    meta: {
+                       title: '购物车编辑',
+                    },
+                },
+                {
+                    path: '/shoppingCartList',
+                    name: 'ShoppingCartList',
+                    component: () => import(/* webpackChunkName: "shoppingCartList" */ '@/views/ShoppingCartList.vue'),
+                    meta: {
+                       title: '购物车',
+                    },
                }
                }
                 /**INSERT_LOCATION**/,
                 /**INSERT_LOCATION**/,
                 {
                 {
@@ -231,7 +295,23 @@ const router = new Router({
                     meta: {
                     meta: {
                         title: '管理员列表',
                         title: '管理员列表',
                     },
                     },
-                }
+                },
+                {
+                    path: '/orderRefundApplyEdit',
+                    name: 'OrderRefundApplyEdit',
+                    component: () => import(/* webpackChunkName: "withdrawalsRecordEdit" */ '@/views/backstage/OrderRefundApplyEdit.vue'),
+                    meta: {
+                        title: '退款申请编辑',
+                    },
+                },
+                {
+                    path: '/orderRefundApplyList',
+                    name: 'OrderRefundApplyList',
+                    component: () => import(/* webpackChunkName: "withdrawalsRecordList" */ '@/views/backstage/OrderRefundApplyList.vue'),
+                    meta: {
+                        title: '退款申请',
+                    },
+                },
             ],
             ],
         },
         },
         {
         {

+ 87 - 5
src/main/vue/src/views/GoodsList.vue

@@ -70,9 +70,9 @@
                     <el-tag :type="row.takeOff?'':'info'">{{row.takeOff}}</el-tag>
                     <el-tag :type="row.takeOff?'':'info'">{{row.takeOff}}</el-tag>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
-<!--            <el-table-column prop="sort" label="排布"
-            >
-            </el-table-column>-->
+            <!--            <el-table-column prop="sort" label="排布"
+                        >
+                        </el-table-column>-->
             <el-table-column prop="isFullReduction" label="满减"
             <el-table-column prop="isFullReduction" label="满减"
             >
             >
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
@@ -82,15 +82,39 @@
             <el-table-column prop="week" label="时间"
             <el-table-column prop="week" label="时间"
             >
             >
             </el-table-column>
             </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"
+            >
+            </el-table-column>
             <el-table-column
             <el-table-column
                     label="操作"
                     label="操作"
                     align="center"
                     align="center"
                     fixed="right"
                     fixed="right"
-                    min-width="230">
+                    min-width="350">
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="editRow(row)" type="warning" size="mini" plain>下架</el-button>
+                    <el-button @click="take(row)" type="warning" size="mini" plain>
+                        {{row.takeOff?'上架':'下架'}}
+                    </el-button>
                     <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
                     <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            :loading="row.loading"
+                            @click="audit(row, true)"
+                            type="primary"
+                            size="mini"
+                            plain
+                    >通过
+                    </el-button
+                    >
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            @click="audit(row, false)"
+                            type="danger"
+                            size="mini"
+                            plain
+                    >拒绝
+                    </el-button
+                    >
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>
@@ -129,6 +153,9 @@
                 search: "",
                 search: "",
                 url: "/goods/all",
                 url: "/goods/all",
                 downloading: false,
                 downloading: false,
+                statusOptions: [{"label": "待处理", "value": "PENDING"}, {
+                    "label": "成功", "value": "PASS"
+                }, {"label": "失败", "value": "FAIL"}],
             }
             }
         },
         },
         computed: {
         computed: {
@@ -137,6 +164,13 @@
             }
             }
         },
         },
         methods: {
         methods: {
+            statusFormatter(row, column, cellValue, index) {
+                let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+                if (selectedOption) {
+                    return selectedOption.label;
+                }
+                return '';
+            },
             beforeGetData() {
             beforeGetData() {
                 if (this.search) {
                 if (this.search) {
                     return {search: this.search};
                     return {search: this.search};
@@ -214,6 +248,54 @@
                     }
                     }
                 })
                 })
             },
             },
+            take(row) {
+                /*  this.$confirm('确认要下架么?', '提示', {type: 'primary'}).then(() => {
+                      return this.$http.post({
+                          url: '/goods/take',
+                          data: {
+                              id: row.id,
+                          }
+                      })
+                  }).then(() => {
+                      this.$message.success('下架成功');
+                      this.getData();
+                  }).catch(action => {
+
+                  })*/
+                this.$set(row, 'loading', true);
+                this.$http
+                    .get('/goods/take', {
+                        id: row.id,
+                    })
+                    .then(res => {
+                        this.$set(row, 'loading', false);
+                        this.$message.success('OK');
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$set(row, 'loading', false);
+                        this.$message.error(e.error);
+                    });
+            },
+            audit(row, pass) {
+                this.$set(row, 'loading', true);
+                this.$http
+                    .get('/goods/audit', {
+                        id: row.id,
+                        pass: pass
+                    })
+                    .then(res => {
+                        this.$set(row, 'loading', false);
+                        this.$message.success('OK');
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$set(row, 'loading', false);
+                        this.$message.error(e.error);
+                    });
+            }
         }
         }
     }
     }
 </script>
 </script>

+ 8 - 16
src/main/vue/src/views/OrderInfoList.vue

@@ -30,15 +30,9 @@
 >
 >
                     </el-table-column>
                     </el-table-column>
                     <el-table-column prop="merchantId" label="商户ID"
                     <el-table-column prop="merchantId" label="商户ID"
->
-                    </el-table-column>
-                    <el-table-column prop="goodsId" label="商品ID"
 >
 >
                     </el-table-column>
                     </el-table-column>
                     <el-table-column prop="merchantStatus" label="商家状态"
                     <el-table-column prop="merchantStatus" label="商家状态"
->
-                    </el-table-column>
-                    <el-table-column prop="merchantAddress" label="商家地址"
 >
 >
                     </el-table-column>
                     </el-table-column>
                     <el-table-column prop="jobNumber" label="骑手工号"
                     <el-table-column prop="jobNumber" label="骑手工号"
@@ -48,9 +42,6 @@
                             :formatter="riderStatusFormatter"
                             :formatter="riderStatusFormatter"
                         >
                         >
                     </el-table-column>
                     </el-table-column>
-                    <el-table-column prop="totalAmount" label="总价"
->
-                    </el-table-column>
                     <el-table-column prop="goodsAmount" label="商品总价"
                     <el-table-column prop="goodsAmount" label="商品总价"
 >
 >
                     </el-table-column>
                     </el-table-column>
@@ -80,32 +71,33 @@
                             :formatter="datetimeFormatter"
                             :formatter="datetimeFormatter"
 >
 >
                     </el-table-column>
                     </el-table-column>
-                    <el-table-column prop="merchantOrderTime" label="商家接单时间"
+<!--                    <el-table-column prop="merchantOrderTime" label="商家接单时间"
                             :formatter="datetimeFormatter"
                             :formatter="datetimeFormatter"
 >
 >
                     </el-table-column>
                     </el-table-column>
                     <el-table-column prop="riderOrderTime" label="骑手接单时间"
                     <el-table-column prop="riderOrderTime" label="骑手接单时间"
                             :formatter="datetimeFormatter"
                             :formatter="datetimeFormatter"
 >
 >
-                    </el-table-column>
+                    </el-table-column> -->
                     <el-table-column prop="userReceivedTime" label="用户收到时间"
                     <el-table-column prop="userReceivedTime" label="用户收到时间"
                             :formatter="datetimeFormatter"
                             :formatter="datetimeFormatter"
 >
 >
                     </el-table-column>
                     </el-table-column>
-                    <el-table-column prop="isCoupon" label="使用优惠券"
+<!--                    <el-table-column prop="isCoupon" label="使用优惠券"
 >
 >
                             <template slot-scope="{row}">
                             <template slot-scope="{row}">
-                                <el-tag :type="row.isCoupon?'':'info'">{{row.isCoupon}}</el-tag>
+                                <el-tag :type="row.isCoupon?'false':'info'">{{row.isCoupon}}</el-tag>
                             </template>
                             </template>
-                    </el-table-column>
+                    </el-table-column>-->
             <el-table-column
             <el-table-column
                     label="操作"
                     label="操作"
                     align="center"
                     align="center"
                     fixed="right"
                     fixed="right"
                     min-width="150">
                     min-width="150">
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <!--<el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>

+ 124 - 0
src/main/vue/src/views/ShoppingCartEdit.vue

@@ -0,0 +1,124 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="userId" label="用户ID">
+                            <el-input-number type="number" v-model="formData.userId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="merchantId" label="商户ID">
+                            <el-input-number type="number" v-model="formData.merchantId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="deliveryAmount" label="配送费">
+                            <el-input-number type="number" v-model="formData.deliveryAmount"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="totalAmount" label="总价">
+                            <el-input-number type="number" v-model="formData.totalAmount"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="amount" label="已减优惠">
+                            <el-input-number type="number" v-model="formData.amount"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="packingPrice" label="包装价格">
+                            <el-input-number type="number" v-model="formData.packingPrice"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="couponId" label="优惠券ID">
+                            <el-input-number type="number" v-model="formData.couponId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="fullReduction" label="满减">
+                            <el-input-number type="number" v-model="formData.fullReduction"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="firstBuy" label="首单">
+                            <el-input-number type="number" v-model="formData.firstBuy"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="redBag" label="红包">
+                            <el-input-number type="number" v-model="formData.redBag"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="newUser" label="新用户">
+                            <el-input-number type="number" v-model="formData.newUser"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="total" label="总价">
+                            <el-input-number type="number" v-model="formData.total"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="realAmount" label="实付金额">
+                            <el-input-number type="number" v-model="formData.realAmount"></el-input-number>
+                </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'ShoppingCartEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('shoppingCart/get/'+this.$route.query.id)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        data() {
+            return {
+                saving: false,
+                formData: {
+                },
+                rules: {
+                },
+            }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+
+                this.saving = true;
+                this.$http
+                    .post('/shoppingCart/save', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/shoppingCart/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 200 - 0
src/main/vue/src/views/ShoppingCartList.vue

@@ -0,0 +1,200 @@
+<template>
+    <div  class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+            <el-button @click="download" type="primary" icon="el-icon-download"
+                       :loading="downloading" class="filter-item">导出EXCEL
+            </el-button>
+        </div>
+        <el-table :data="tableData" row-key="id" ref="table"
+                  header-row-class-name="table-header-row"
+                  header-cell-class-name="table-header-cell"
+                  row-class-name="table-row" cell-class-name="table-cell"
+                  :height="tableHeight">
+            <el-table-column v-if="multipleMode" align="center" type="selection"
+                             width="50">
+            </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+                                <el-table-column prop="userId" label="用户ID"
+>
+                    </el-table-column>
+                    <el-table-column prop="merchantId" label="商户ID"
+>
+                    </el-table-column>
+                    <el-table-column prop="deliveryAmount" label="配送费"
+>
+                    </el-table-column>
+                    <el-table-column prop="totalAmount" label="总价"
+>
+                    </el-table-column>
+                    <el-table-column prop="amount" label="已减优惠"
+>
+                    </el-table-column>
+                    <el-table-column prop="packingPrice" label="包装价格"
+>
+                    </el-table-column>
+                    <el-table-column prop="couponId" label="优惠券ID"
+>
+                    </el-table-column>
+                    <el-table-column prop="fullReduction" label="满减"
+>
+                    </el-table-column>
+                    <el-table-column prop="firstBuy" label="首单"
+>
+                    </el-table-column>
+                    <el-table-column prop="redBag" label="红包"
+>
+                    </el-table-column>
+                    <el-table-column prop="newUser" label="新用户"
+>
+                    </el-table-column>
+                    <el-table-column prop="total" label="总价"
+>
+                    </el-table-column>
+                    <el-table-column prop="realAmount" label="实付金额"
+>
+                    </el-table-column>
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import { mapState } from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'ShoppingCartList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/shoppingCart/all",
+                downloading: false,
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            beforeGetData() {
+                if (this.search) {
+                    return { search: this.search };
+                }
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/shoppingCartEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/shoppingCartEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/shoppingCart/excel", { 
+                        responseType: "blob",
+                        params: { size: 10000 }
+                    })
+                    .then(res => {
+                        console.log(res);
+                        this.downloading = false;
+                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                        const link = document.createElement("a");
+                        link.href = downloadUrl;
+                        link.setAttribute(
+                            "download",
+                            res.headers["content-disposition"].split("filename=")[1]
+                        );
+                        document.body.appendChild(link);
+                        link.click();
+                        link.remove();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.downloading = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/shoppingCart/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 213 - 145
src/main/vue/src/views/UserEdit.vue

@@ -21,167 +21,235 @@
             <el-form-item prop="phone" label="手机">
             <el-form-item prop="phone" label="手机">
                 <el-input v-model="formData.phone"></el-input>
                 <el-input v-model="formData.phone"></el-input>
             </el-form-item>
             </el-form-item>
-<!--            <el-form-item prop="authorities" label="角色">
-                <el-select v-model="formData.authorities" multiple
-                           placeholder="请选择" value-key="name">
-                    <el-option v-for="item in authorities" :key="item.name"
-                               :label="item.name" :value="item">
-                    </el-option>
-                </el-select>
-            </el-form-item>-->
+            <!--            <el-form-item prop="authorities" label="角色">
+                            <el-select v-model="formData.authorities" multiple
+                                       placeholder="请选择" value-key="name">
+                                <el-option v-for="item in authorities" :key="item.name"
+                                           :label="item.name" :value="item">
+                                </el-option>
+                            </el-select>
+                        </el-form-item>-->
             <el-form-item>
             <el-form-item>
-                <el-button @click="onSave" :loading="$store.state.fetchingData"
-                           type="primary">保存</el-button>
-                <el-button @click="del" :loading="$store.state.fetchingData"
-                           type="danger" v-if="formData.id">删除
+                <!--                <el-button @click="onSave" :loading="$store.state.fetchingData"
+                                           type="primary">保存</el-button>
+                                <el-button @click="del" :loading="$store.state.fetchingData"
+                                           type="danger" v-if="formData.id">删除
+                                </el-button>-->
+                <el-button @click="showSetLogistics=true" :loading="$store.state.fetchingData"
+                           type="danger" v-if="formData.id">移入黑名单
                 </el-button>
                 </el-button>
-                <el-button @click="$router.go(-1)">取消</el-button>
+                <el-button @click="" :loading="$store.state.fetchingData"
+                           type="primary" v-if="formData.id">发送优惠券
+                </el-button>
+                <el-button @click="$router.go(-1)">返回</el-button>
             </el-form-item>
             </el-form-item>
         </el-form>
         </el-form>
+
+        <el-dialog
+                title="填写理由"
+                center
+                width="400px"
+                :visible.sync="showSetLogistics"
+        >
+            <el-form>
+                <el-form-item>
+                    <el-input type="textarea"
+                              placeholder="请输入拉入黑名单理由"
+                              v-model="reason"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="move">确认</el-button>
+                </el-form-item>
+            </el-form>
+        </el-dialog>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
-export default {
-    created() {
-        if (this.$route.query.id) {
-            this.$http
-                .get(`/user/get/${this.$route.query.id}`)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-/*        this.$http
-            .get('/authority/all')
-            .then(res => {
-                this.authorities = res;
-            })
-            .catch(e => {
-                console.log(e);
-            });*/
-    },
-    data() {
-        return {
-            saving: false,
-            formData: {
-                avatar:
-                    'https://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg',
-            },
-            rules: {
-                avatar: [
-                    {
-                        required: true,
-                        regexp: /^[_.@A-Za-z0-9-]*$/,
-                        message: '请上传头像',
-                        trigger: 'blur',
-                    },
-                ],
-                username: [
-                    { required: true, message: '请输入昵称', trigger: 'blur' },
-                ],
-                nickname: [
-                    { required: true, message: '请输入昵称', trigger: 'blur' },
-                ],
-                password: [
-                    { required: true, message: '请输入密码', trigger: 'blur' },
-                ],
-                phone: [
-                    {
-                        regexp: /^1[3-9]\d{9}$/,
-                        message: '请输入正确的手机号',
-                        trigger: 'blur',
-                    },
-                ],
-/*                authorities: [
-                    { required: true, message: '请选择角色', trigger: 'blur' },
-                ],*/
-            },
-            // authorities: [],
-        };
-    },
-    methods: {
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
+    export default {
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get(`/user/get/${this.$route.query.id}`)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+            /*        this.$http
+                        .get('/authority/all')
+                        .then(res => {
+                            this.authorities = res;
+                        })
+                        .catch(e => {
+                            console.log(e);
+                        });*/
         },
         },
-        submit() {
-            this.$http
-                .post({
-                    url: '/user/save',
-                    data: {
-                        identity: 'USER'
-                    }
-
-                }, this.formData, { body: 'json' })
-                .then(res => {
-                    this.$message.success('成功');
-                    this.formData = res;
-                    this.$router.replace({
-                        query: {
-                            id: res.id,
+        data() {
+            return {
+                saving: false,
+                formData: {
+                    avatar:
+                        'https://zhumj.oss-cn-hangzhou.aliyuncs.com/image/user.jpg',
+                },
+                rules: {
+                    avatar: [
+                        {
+                            required: true,
+                            regexp: /^[_.@A-Za-z0-9-]*$/,
+                            message: '请上传头像',
+                            trigger: 'blur',
                         },
                         },
-                    });
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
+                    ],
+                    username: [
+                        {required: true, message: '请输入昵称', trigger: 'blur'},
+                    ],
+                    nickname: [
+                        {required: true, message: '请输入昵称', trigger: 'blur'},
+                    ],
+                    password: [
+                        {required: true, message: '请输入密码', trigger: 'blur'},
+                    ],
+                    phone: [
+                        {
+                            regexp: /^1[3-9]\d{9}$/,
+                            message: '请输入正确的手机号',
+                            trigger: 'blur',
+                        },
+                    ],
+                    /*                authorities: [
+                                        { required: true, message: '请选择角色', trigger: 'blur' },
+                                    ],*/
+                },
+                showSetLogistics: false,
+                // authorities: [],
+                reason: "",
+            };
         },
         },
-        del() {
-            this.$confirm('确认删除吗?', '提示', { type: 'warning' })
-                .then(() => {
-                    this.$http
-                        .post({
-                            url: '/userInfo/del',
-                            data: {
-                                id: this.formData.id,
+        methods: {
+            onSave() {
+                this.$refs.form.validate(valid => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                this.$http
+                    .post({
+                        url: '/user/save',
+                        data: {
+                            identity: 'USER'
+                        }
+
+                    }, this.formData, {body: 'json'})
+                    .then(res => {
+                        this.$message.success('成功');
+                        this.formData = res;
+                        this.$router.replace({
+                            query: {
+                                id: res.id,
                             },
                             },
-                        })
-                        .then(res => {
-                            if (res.success) {
-                                this.$message.success('成功');
-                                this.$router.go(-1);
-                            } else {
-                                this.$message.warning('失败');
-                            }
                         });
                         });
-                })
-                .catch(() => {});
-        },
-        resetPassword() {
-            this.$prompt('请输入新密码', '重置密码', { inputType: 'password' })
-                .then(res => {
-                    console.log(res);
-                    if (res.value) {
-                        this.$alert('确定重置密码?', '提示', {
-                            showCancelButton: true
-                        })
-                            .then(() => {
-                                return this.$http.post('/user/setPasswordAdmin', {
-                                    userId: this.formData.id,
-                                    password: res.value
-                                });
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            },
+            del(){
+                this.$confirm('确认删除吗?', '提示', {type: 'warning'})
+                    .then(() => {
+                        this.$http
+                            .post({
+                                url: '/userInfo/del',
+                                data: {
+                                    id: this.formData.id,
+                                },
                             })
                             })
                             .then(res => {
                             .then(res => {
-                                this.$message.success('密码重置成功');
+                                if (res.success) {
+                                    this.$message.success('成功');
+                                    this.$router.go(-1);
+                                } else {
+                                    this.$message.warning('失败');
+                                }
+                            });
+                    })
+                    .catch(() => {
+                    });
+            },
+            move() {
+                /*this.$confirm('确认移入黑名单吗?', '提示', {type: 'warning'})
+                    .then(() => {
+                        this.$http
+                            .post({
+                                url: '/blacklist/move',
+                                data: {
+                                    id: this.formData.id,
+                                    reason: this.reason,
+                                },
                             })
                             })
-                            .catch(() => {
-                                this.$message.error(res.error || '重置密码失败');
+                            .then(res => {
+                                if (res.success) {
+                                    this.$message.success('成功');
+                                    this.$router.go(-1);
+                                } else {
+                                    this.$message.warning('失败');
+                                }
                             });
                             });
-                    }
-                })
-                .catch(() => {});
-        }
-    },
-};
+                    })
+                    .catch(() => {
+                    });*/
+                this.$http
+                    .post({
+                        url: "/blacklist/move", data: {
+                            id: this.formData.id,
+                            reason: this.reason,
+                        },
+                    })
+                    .then(res => {
+                        this.$message.success("成功");
+                        this.showSetLogistics = false;
+                        this.$router.go(0);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            },
+            resetPassword() {
+                this.$prompt('请输入新密码', '重置密码', {inputType: 'password'})
+                    .then(res => {
+                        console.log(res);
+                        if (res.value) {
+                            this.$alert('确定重置密码?', '提示', {
+                                showCancelButton: true
+                            })
+                                .then(() => {
+                                    return this.$http.post('/user/setPasswordAdmin', {
+                                        userId: this.formData.id,
+                                        password: res.value
+                                    });
+                                })
+                                .then(res => {
+                                    this.$message.success('密码重置成功');
+                                })
+                                .catch(() => {
+                                    this.$message.error(res.error || '重置密码失败');
+                                });
+                        }
+                    })
+                    .catch(() => {
+                    });
+            },
+        },
+    };
 </script>
 </script>
 <style lang="less" scoped>
 <style lang="less" scoped>
 </style>
 </style>

+ 9 - 5
src/main/vue/src/views/UserList.vue

@@ -27,26 +27,30 @@
                     </sortable-header>
                     </sortable-header>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
-            <el-table-column prop="username" label="用户名" min-width="300">
+            <el-table-column prop="username" label="用户名" min-width="100">
                 <template slot="header" slot-scope="{column}">
                 <template slot="header" slot-scope="{column}">
                     <sortable-header :column="column" :current-sort="sort"
                     <sortable-header :column="column" :current-sort="sort"
                         @changeSort="changeSort">
                         @changeSort="changeSort">
                     </sortable-header>
                     </sortable-header>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
-            <el-table-column prop="nickname" label="昵称" min-width="300">
+            <el-table-column prop="nickname" label="昵称" min-width="100">
             </el-table-column>
             </el-table-column>
-            <el-table-column label="头像" min-width="300">
+            <el-table-column label="头像" min-width="150">
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
                     <el-image style="width: 30px; height: 30px"
                     <el-image style="width: 30px; height: 30px"
                         :src="row.avatar" fit="cover"
                         :src="row.avatar" fit="cover"
                         :preview-src-list="[row.avatar]"></el-image>
                         :preview-src-list="[row.avatar]"></el-image>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right">
+<!--            <el-table-column prop="consumption" label="累计消费" min-width="100">
+            </el-table-column>-->
+            <el-table-column label="操作" align="center" fixed="right" min-width="200">
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini"
                     <el-button @click="editRow(row)" type="primary" size="mini"
-                        plain>编辑</el-button>
+                        plain>详情</el-button>
+                    <el-button @click="editRow(row)" type="primary" size="mini"
+                        plain>订单</el-button>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>

+ 91 - 28
src/main/vue/src/views/backstage/BlackListList.vue

@@ -1,5 +1,5 @@
 <template>
 <template>
-    <div  class="list-view">
+    <div class="list-view">
         <div class="filters-container">
         <div class="filters-container">
             <el-input placeholder="输入关键字" v-model="search" clearable
             <el-input placeholder="输入关键字" v-model="search" clearable
                       class="filter-item"></el-input>
                       class="filter-item"></el-input>
@@ -12,6 +12,21 @@
             <el-button @click="download" type="primary" icon="el-icon-download"
             <el-button @click="download" type="primary" icon="el-icon-download"
                        :loading="downloading" class="filter-item">导出EXCEL
                        :loading="downloading" class="filter-item">导出EXCEL
             </el-button>
             </el-button>
+            <el-select
+                    v-model="identity"
+                    class="filter-item"
+                    placeholder="筛选身份"
+                    clearable
+                    filterable
+                    @change="getData"
+            >
+                <el-option
+                        v-for="item in identityOptions"
+                        :label="item.label"
+                        :value="item.value"
+                        :key="item.value"
+                />
+            </el-select>
         </div>
         </div>
         <el-table :data="tableData" row-key="id" ref="table"
         <el-table :data="tableData" row-key="id" ref="table"
                   header-row-class-name="table-header-row"
                   header-row-class-name="table-header-row"
@@ -23,32 +38,35 @@
             </el-table-column>
             </el-table-column>
             <el-table-column prop="id" label="ID" width="100">
             <el-table-column prop="id" label="ID" width="100">
             </el-table-column>
             </el-table-column>
-                                <el-table-column prop="userId" label="用户ID"
->
-                    </el-table-column>
-                    <el-table-column prop="otherId" label="其他ID"
->
-                    </el-table-column>
-                    <el-table-column prop="identity" label="身份"
->
-                    </el-table-column>
-                    <el-table-column prop="reason" label="缘由"
->
-                    </el-table-column>
-                    <el-table-column prop="remove" label="移除"
->
-                            <template slot-scope="{row}">
-                                <el-tag :type="row.remove?'':'info'">{{row.remove}}</el-tag>
-                            </template>
-                    </el-table-column>
+            <el-table-column prop="userId" label="用户ID"
+            >
+            </el-table-column>
+            <el-table-column prop="otherId" label="其他ID"
+            >
+            </el-table-column>
+            <el-table-column prop="identity" label="身份"
+                             :formatter="identityFormatter">
+
+            </el-table-column>
+            <el-table-column prop="reason" label="缘由"
+            >
+            </el-table-column>
+            <el-table-column prop="remove" label="移除"
+            >
+                <template slot-scope="{row}">
+                    <el-tag :type="row.remove?'':'info'">{{row.remove}}</el-tag>
+                </template>
+            </el-table-column>
             <el-table-column
             <el-table-column
                     label="操作"
                     label="操作"
                     align="center"
                     align="center"
                     fixed="right"
                     fixed="right"
                     min-width="150">
                     min-width="150">
                 <template slot-scope="{row}">
                 <template slot-scope="{row}">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <!--<el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>-->
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>详情</el-button>
+                    <el-button @click="remove(row)" type="danger" size="mini" plain>移除</el-button>
                 </template>
                 </template>
             </el-table-column>
             </el-table-column>
         </el-table>
         </el-table>
@@ -72,7 +90,7 @@
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
-    import { mapState } from "vuex";
+    import {mapState} from "vuex";
     import pageableTable from "@/mixins/pageableTable";
     import pageableTable from "@/mixins/pageableTable";
 
 
     export default {
     export default {
@@ -87,6 +105,12 @@
                 search: "",
                 search: "",
                 url: "/blackList/all",
                 url: "/blackList/all",
                 downloading: false,
                 downloading: false,
+                identityOptions: [
+                    {label: "用户", value: "USER"},
+                    {label: "商家", value: "MERCHANT"},
+                    {label: "骑手", value: "RIDER"}],
+
+                identity:'',
             }
             }
         },
         },
         computed: {
         computed: {
@@ -95,9 +119,29 @@
             }
             }
         },
         },
         methods: {
         methods: {
+            identityFormatter(row, column, cellValue, index) {
+                let selectedOption = this.identityOptions.find(i => i.value === cellValue);
+                if (selectedOption) {
+                    return selectedOption.label;
+                }
+                return '';
+            },
             beforeGetData() {
             beforeGetData() {
-                if (this.search) {
-                    return { search: this.search };
+                /*if (this.search) {
+                    return {search: this.search};
+                }
+                if (this.identity) {
+                    return {
+                        query: {
+                            identity: this.identity
+                        }
+                    };
+                */
+                return {
+                    search: this.search,
+                    query: {
+                        identity: this.identity
+                    }
                 }
                 }
             },
             },
             toggleMultipleMode(multipleMode) {
             toggleMultipleMode(multipleMode) {
@@ -110,7 +154,7 @@
                 this.$router.push({
                 this.$router.push({
                     path: "/blackListEdit",
                     path: "/blackListEdit",
                     query: {
                     query: {
-                    ...this.$route.query
+                        ...this.$route.query
                     }
                     }
                 });
                 });
             },
             },
@@ -118,16 +162,16 @@
                 this.$router.push({
                 this.$router.push({
                     path: "/blackListEdit",
                     path: "/blackListEdit",
                     query: {
                     query: {
-                    id: row.id
+                        id: row.id
                     }
                     }
                 });
                 });
             },
             },
             download() {
             download() {
                 this.downloading = true;
                 this.downloading = true;
                 this.$axios
                 this.$axios
-                    .get("/blackList/excel", { 
+                    .get("/blackList/excel", {
                         responseType: "blob",
                         responseType: "blob",
-                        params: { size: 10000 }
+                        params: {size: 10000}
                     })
                     })
                     .then(res => {
                     .then(res => {
                         console.log(res);
                         console.log(res);
@@ -172,6 +216,25 @@
                     }
                     }
                 })
                 })
             },
             },
+            remove(row) {
+                this.$alert('移除将无法恢复,确认移除么?', '提示', {type: 'error'}).then(() => {
+                    return this.$http.post({
+                        url: `/blackList/remove`,
+                        date: {
+                            id: row.id,
+                        },
+                    })
+                }).then(() => {
+                    this.$message.success('移除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('移除取消');
+                    } else {
+                        this.$message.error('移除失败');
+                    }
+                })
+            },
         }
         }
     }
     }
 </script>
 </script>

+ 97 - 0
src/main/vue/src/views/backstage/EmailEdit.vue

@@ -0,0 +1,97 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="66px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="sendUserId" label="发件人">
+                            <el-input-number type="number" v-model="formData.sendUserId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="receiveUserId" label="收件人">
+                            <el-input-number type="number" v-model="formData.receiveUserId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="title" label="标题">
+                            <el-input v-model="formData.title"></el-input>
+                </el-form-item>
+                <el-form-item prop="content" label="内容">
+                            <el-input v-model="formData.content"></el-input>
+                </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'EmailEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('email/get/'+this.$route.query.id)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        data() {
+            return {
+                saving: false,
+                formData: {
+                },
+                rules: {
+                },
+            }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+
+                this.saving = true;
+                this.$http
+                    .post('/email/save', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/email/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 173 - 0
src/main/vue/src/views/backstage/EmailList.vue

@@ -0,0 +1,173 @@
+<template>
+    <div  class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+            <el-button @click="download" type="primary" icon="el-icon-download"
+                       :loading="downloading" class="filter-item">导出EXCEL
+            </el-button>
+        </div>
+        <el-table :data="tableData" row-key="id" ref="table"
+                  header-row-class-name="table-header-row"
+                  header-cell-class-name="table-header-cell"
+                  row-class-name="table-row" cell-class-name="table-cell"
+                  :height="tableHeight">
+            <el-table-column v-if="multipleMode" align="center" type="selection"
+                             width="50">
+            </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+                                <el-table-column prop="sendUserId" label="发件人"
+>
+                    </el-table-column>
+                    <el-table-column prop="receiveUserId" label="收件人"
+>
+                    </el-table-column>
+                    <el-table-column prop="title" label="标题"
+>
+                    </el-table-column>
+                    <el-table-column prop="content" label="内容"
+>
+                    </el-table-column>
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import { mapState } from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'EmailList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/email/all",
+                downloading: false,
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            beforeGetData() {
+                if (this.search) {
+                    return { search: this.search };
+                }
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/emailEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/emailEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/email/excel", { 
+                        responseType: "blob",
+                        params: { size: 10000 }
+                    })
+                    .then(res => {
+                        console.log(res);
+                        this.downloading = false;
+                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                        const link = document.createElement("a");
+                        link.href = downloadUrl;
+                        link.setAttribute(
+                            "download",
+                            res.headers["content-disposition"].split("filename=")[1]
+                        );
+                        document.body.appendChild(link);
+                        link.click();
+                        link.remove();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.downloading = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/email/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 148 - 0
src/main/vue/src/views/backstage/OrderRefundApplyEdit.vue

@@ -0,0 +1,148 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+            <el-form-item prop="orderId" label="订单ID">
+                <el-input  v-model="formData.orderId"></el-input>
+            </el-form-item>
+            <el-form-item prop="reason" label="理由">
+                <el-select v-model="formData.reason" clearable filterable placeholder="请选择">
+                    <el-option
+                            v-for="item in reasonOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="remark" label="备注">
+                <el-input v-model="formData.remark"></el-input>
+            </el-form-item>
+            <el-form-item prop="status" label="状态">
+                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                    <el-option
+                            v-for="item in statusOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="applyTime" label="申请时间">
+                <el-date-picker
+                        v-model="formData.applyTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        placeholder="选择日期时间">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="auditTime" label="审核时间">
+                <el-date-picker
+                        v-model="formData.auditTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        placeholder="选择日期时间">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="refundTime" label="退款时间">
+                <el-date-picker
+                        v-model="formData.refundTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        placeholder="选择日期时间">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="refundId" label="退款单号">
+                <el-input v-model="formData.refundId"></el-input>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存
+                </el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'OrderRefundApplyEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('orderRefundApply/get/' + this.$route.query.id)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        data() {
+            return {
+                saving: false,
+                formData: {},
+                rules: {},
+                statusOptions: [
+                    {"label": "待处理", "value": "PENDING"},
+                    /*{"label": "退款中","value": "REFUNDING"},*/
+                    {"label": "成功", "value": "SUCCESS"},
+                    {"label": "失败", "value": "DENY"}],
+                reasonOptions: [
+                    {"label": "未按约定时间发货", "value": "SHIP_ON_TIME"},
+                    {"label": "多拍/错拍商品", "value": "MISTAKE"},
+                    {"label": "暂时不想买了", "value": "WANT_TO_BUY"},
+                    {"label": "其他", "value": "OTHER"}
+                ],
+            }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+
+                this.saving = true;
+                this.$http
+                    .post('/orderRefundApply/add', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/orderRefundApply/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 297 - 0
src/main/vue/src/views/backstage/OrderRefundApplyList.vue

@@ -0,0 +1,297 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+            <!--            <el-button @click="download" type="primary" icon="el-icon-download"
+                                   :loading="downloading" class="filter-item">导出EXCEL
+                        </el-button>-->
+            <el-select v-model="status" class="filter-item" placeholder="筛选状态" clearable filterable
+                       @change="getData">
+                <el-option
+                        v-for="item in statusOptions"
+                        :label="item.label"
+                        :value="item.value"
+                        :key="item.value"
+                />
+            </el-select>
+        </div>
+        <el-table :data="tableData" row-key="id" ref="table"
+                  header-row-class-name="table-header-row"
+                  header-cell-class-name="table-header-cell"
+                  row-class-name="table-row" cell-class-name="table-cell"
+                  :height="tableHeight">
+            <el-table-column v-if="multipleMode" align="center" type="selection"
+                             width="50">
+            </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+                <template slot="header" slot-scope="{column}">
+                    <sortable-header :column="column" :current-sort="sort"
+                                     @changeSort="changeSort">
+                    </sortable-header>
+                </template>
+            </el-table-column>
+            <!--            <el-table-column prop="orderId" label="订单ID"
+                        >
+                        </el-table-column>-->
+            <el-table-column prop="orderForm.num" label="订单号"
+            >
+            </el-table-column>
+            <el-table-column prop="remark" label="备注"></el-table-column>
+            <el-table-column prop="reason" label="理由" :formatter="reasonFormatter"
+            >
+            </el-table-column>
+            <el-table-column prop="status" label="状态"
+                             :formatter="statusFormatter"
+            >
+                <template slot="header" slot-scope="{column}">
+                    <sortable-header :column="column" :current-sort="sort" @changeSort="changeSort">
+                    </sortable-header>
+                </template>
+            </el-table-column>
+            <el-table-column prop="applyTime" label="申请时间"
+                             :formatter="datetimeFormatter"
+            >
+                <template slot="header" slot-scope="{column}">
+                    <sortable-header :column="column" :current-sort="sort" @changeSort="changeSort">
+                    </sortable-header>
+                </template>
+            </el-table-column>
+            <el-table-column prop="auditTime" label="审核时间"
+                             :formatter="datetimeFormatter"
+            >
+                <template slot="header" slot-scope="{column}">
+                    <sortable-header :column="column" :current-sort="sort" @changeSort="changeSort">
+                    </sortable-header>
+                </template>
+            </el-table-column>
+            <el-table-column prop="refundTime" label="退款时间"
+                             :formatter="datetimeFormatter"
+            >
+                <template slot="header" slot-scope="{column}">
+                    <sortable-header :column="column" :current-sort="sort" @changeSort="changeSort">
+                    </sortable-header>
+                </template>
+            </el-table-column>
+            <el-table-column prop="refundId" label="退款单号"
+            >
+            </el-table-column>
+            <!--            <el-table-column
+                                label="操作"
+                                align="center"
+                                fixed="right"
+                                min-width="150">
+                            <template slot-scope="{row}">
+                                <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                                <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                            </template>
+                        </el-table-column>-->
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            :loading="row.loading"
+                            @click="audit(row, true)"
+                            type="primary"
+                            size="mini"
+                            plain
+                    >通过
+                    </el-button
+                    >
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            @click="audit(row, false)"
+                            type="danger"
+                            size="mini"
+                            plain
+                    >拒绝
+                    </el-button
+                    >
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode"
+                           @click="toggleMultipleMode(true)">批量编辑
+                </el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div>
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import {mapState} from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'OrderRefundApplyList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/orderRefundApply/all",
+                downloading: false,
+                statusOptions: [
+                    {"label": "待处理", "value": "PENDING"},
+                    {"label": "退款中", "value": "REFUNDING"},
+                    {"label": "成功", "value": "SUCCESS"},
+                    {"label": "失败", "value": "DENY"},
+                    {"label": "取消退款", "value": "CANCEL"}],
+                reasonOptions: [
+                    {"label": "未按约定时间发货", "value": "SHIP_ON_TIME"},
+                    {"label": "多拍/错拍商品", "value": "MISTAKE"},
+                    {"label": "暂时不想买了", "value": "WANT_TO_BUY"},
+                    {"label": "其他", "value": "OTHER"}
+                ],
+                status: ''
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            reasonFormatter(row, column, cellValue, index) {
+                let selectedOption = this.reasonOptions.find(i => i.value === cellValue);
+                if (selectedOption) {
+                    return selectedOption.label;
+                }
+                return '';
+            },
+            statusFormatter(row, column, cellValue, index) {
+                let selectedOption = this.statusOptions.find(i => i.value === cellValue);
+                if (selectedOption) {
+                    return selectedOption.label;
+                }
+                return '';
+            },
+            beforeGetData() {
+                /*if (this.search) {
+                    return {search: this.search};
+                }*/
+                return {
+                    search: this.search,
+                    query: {
+                        status: this.status
+                    },
+                    sort: "applyTime,desc"
+                };
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/orderRefundApplyEdit",
+                    query: {
+                        ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/orderRefundApplyEdit",
+                    query: {
+                        id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/orderRefundApply/excel", {
+                        responseType: "blob",
+                        params: {size: 10000}
+                    })
+                    .then(res => {
+                        console.log(res);
+                        this.downloading = false;
+                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                        const link = document.createElement("a");
+                        link.href = downloadUrl;
+                        link.setAttribute(
+                            "download",
+                            res.headers["content-disposition"].split("filename=")[1]
+                        );
+                        document.body.appendChild(link);
+                        link.click();
+                        link.remove();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.downloading = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/orderRefundApply/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+            audit(row, consent) {
+                this.$set(row, 'loading', true);
+                this.$http
+                    .get('/orderRefundApply/audit', {
+                        id: row.id,
+                        consent: consent
+                    })
+                    .then(res => {
+                        this.$set(row, 'loading', false);
+                        this.$message.success('OK');
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$set(row, 'loading', false);
+                        this.$message.error(e.error);
+                    });
+            }
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 114 - 0
src/main/vue/src/views/backstage/TimeTagEdit.vue

@@ -0,0 +1,114 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+            <el-form-item prop="name" label="名称" >
+                <el-input v-model="formData.name"></el-input>
+            </el-form-item>
+            <el-form-item prop="startTime" label="开始时间">
+                <!-- <el-input v-model="formData.startTime"></el-input>-->
+
+                <el-time-picker
+                        placeholder="起始时间"
+                        v-model="formData.startTime"
+                        value-format="HH:mm:ss"
+                >
+                </el-time-picker>
+
+            </el-form-item>
+            <el-form-item prop="endTime" label="结束时间">
+                <!--<el-input v-model="formData.endTime"></el-input>-->
+                <el-time-picker
+                        placeholder="结束时间"
+                        v-model="formData.endTime"
+                        value-format="HH:mm:ss"
+                >
+                </el-time-picker>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存
+                </el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'TimeTagEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('timeTag/get/' + this.$route.query.id)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        data() {
+            return {
+                saving: false,
+                formData: {},
+                rules: {},
+                startTime: '',
+                endTime: ''
+            }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+/*                let data = {
+                    startTime: this.startTime,
+                    endTime: this.endTime
+
+                }*/
+
+                this.saving = true;
+                this.$http
+                    .post('/timeTag/save', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/timeTag/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 171 - 0
src/main/vue/src/views/backstage/TimeTagList.vue

@@ -0,0 +1,171 @@
+<template>
+    <div  class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+            <el-button @click="download" type="primary" icon="el-icon-download"
+                       :loading="downloading" class="filter-item">导出EXCEL
+            </el-button>
+        </div>
+        <el-table :data="tableData" row-key="id" ref="table"
+                  header-row-class-name="table-header-row"
+                  header-cell-class-name="table-header-cell"
+                  row-class-name="table-row" cell-class-name="table-cell"
+                  :height="tableHeight">
+            <el-table-column v-if="multipleMode" align="center" type="selection"
+                             width="50">
+            </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+                                <el-table-column prop="name" label="名称"
+>
+                    </el-table-column>
+                    <el-table-column prop="startTime" label="开始时间"
+>
+
+                    </el-table-column>
+                    <el-table-column prop="endTime" label="结束时间"
+>
+                    </el-table-column>
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import { mapState } from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'TimeTagList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/timeTag/all",
+                downloading: false,
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            beforeGetData() {
+                if (this.search) {
+                    return { search: this.search };
+                }
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/timeTagEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/timeTagEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/timeTag/excel", { 
+                        responseType: "blob",
+                        params: { size: 10000 }
+                    })
+                    .then(res => {
+                        console.log(res);
+                        this.downloading = false;
+                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                        const link = document.createElement("a");
+                        link.href = downloadUrl;
+                        link.setAttribute(
+                            "download",
+                            res.headers["content-disposition"].split("filename=")[1]
+                        );
+                        document.body.appendChild(link);
+                        link.click();
+                        link.remove();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.downloading = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/timeTag/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 2 - 0
src/main/vue/src/views/merchant/MerchantList.vue

@@ -100,6 +100,8 @@
             <el-table-column label="操作" align="center" fixed="right" min-width="250">
             <el-table-column label="操作" align="center" fixed="right" min-width="250">
                 <template slot-scope="{ row }">
                 <template slot-scope="{ row }">
                     <el-button @click="showDrawer(row)" type="primary" size="mini" plain>详情</el-button>
                     <el-button @click="showDrawer(row)" type="primary" size="mini" plain>详情</el-button>
+                    <el-button @click="" type="primary" size="mini" plain>报表</el-button>
+                    <el-button @click="" type="primary" size="mini" plain>评价</el-button>
                     <el-button
                     <el-button
                             v-if="row.status === 'PENDING'"
                             v-if="row.status === 'PENDING'"
                             :loading="row.loading"
                             :loading="row.loading"

+ 124 - 0
src/main/vue/src/views/rider/RiderEdit.vue

@@ -0,0 +1,124 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="66px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="userId" label="用户ID">
+                            <el-input-number type="number" v-model="formData.userId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="jobNumber" label="工号">
+                            <el-input-number type="number" v-model="formData.jobNumber"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="area" label="区域">
+                            <el-input v-model="formData.area"></el-input>
+                </el-form-item>
+                <el-form-item prop="signIn" label="签到">
+                            <el-switch v-model="formData.signIn"></el-switch>
+                </el-form-item>
+                <el-form-item prop="experience" label="经验值">
+                            <el-input v-model="formData.experience"></el-input>
+                </el-form-item>
+                <el-form-item prop="level" label="等级">
+                            <el-input v-model="formData.level"></el-input>
+                </el-form-item>
+                <el-form-item prop="monetary" label="货币">
+                            <el-input-number type="number" v-model="formData.monetary"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="singular" label="成单数">
+                            <el-input v-model="formData.singular"></el-input>
+                </el-form-item>
+                <el-form-item prop="distance" label="距离">
+                            <el-input v-model="formData.distance"></el-input>
+                </el-form-item>
+                <el-form-item prop="goodReview" label="好评数">
+                            <el-input v-model="formData.goodReview"></el-input>
+                </el-form-item>
+                <el-form-item prop="badReview" label="差评数">
+                            <el-input v-model="formData.badReview"></el-input>
+                </el-form-item>
+                <el-form-item prop="operate" label="操作">
+                            <el-input v-model="formData.operate"></el-input>
+                </el-form-item>
+                <el-form-item prop="blacklist" label="黑名单">
+                            <el-switch v-model="formData.blacklist"></el-switch>
+                </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'RiderEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('rider/get/'+this.$route.query.id)
+                    .then(res => {
+                        this.formData = res;
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        data() {
+            return {
+                saving: false,
+                formData: {
+                },
+                rules: {
+                },
+            }
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+
+                this.saving = true;
+                this.$http
+                    .post('/rider/save', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            onDelete() {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/rider/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 206 - 0
src/main/vue/src/views/rider/RiderList.vue

@@ -0,0 +1,206 @@
+<template>
+    <div  class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+            <el-button @click="download" type="primary" icon="el-icon-download"
+                       :loading="downloading" class="filter-item">导出EXCEL
+            </el-button>
+        </div>
+        <el-table :data="tableData" row-key="id" ref="table"
+                  header-row-class-name="table-header-row"
+                  header-cell-class-name="table-header-cell"
+                  row-class-name="table-row" cell-class-name="table-cell"
+                  :height="tableHeight">
+            <el-table-column v-if="multipleMode" align="center" type="selection"
+                             width="50">
+            </el-table-column>
+            <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>
+                                <el-table-column prop="userId" label="用户ID"
+>
+                    </el-table-column>
+                    <el-table-column prop="jobNumber" label="工号"
+>
+                    </el-table-column>
+                    <el-table-column prop="area" label="区域"
+>
+                    </el-table-column>
+                    <el-table-column prop="signIn" label="签到"
+>
+                            <template slot-scope="{row}">
+                                <el-tag :type="row.signIn?'':'info'">{{row.signIn}}</el-tag>
+                            </template>
+                    </el-table-column>
+                    <el-table-column prop="experience" label="经验值"
+>
+                    </el-table-column>
+                    <el-table-column prop="level" label="等级"
+>
+                    </el-table-column>
+                    <el-table-column prop="monetary" label="货币"
+>
+                    </el-table-column>
+                    <el-table-column prop="singular" label="成单数"
+>
+                    </el-table-column>
+                    <el-table-column prop="distance" label="距离"
+>
+                    </el-table-column>
+                    <el-table-column prop="goodReview" label="好评数"
+>
+                    </el-table-column>
+                    <el-table-column prop="badReview" label="差评数"
+>
+                    </el-table-column>
+                    <el-table-column prop="operate" label="操作"
+>
+                    </el-table-column>
+<!--                    <el-table-column prop="blacklist" label="黑名单"
+>
+                            <template slot-scope="{row}">
+                                <el-tag :type="row.blacklist?'':'info'">{{row.blacklist}}</el-tag>
+                            </template>
+                    </el-table-column>-->
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import { mapState } from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'RiderList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/rider/all",
+                downloading: false,
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            beforeGetData() {
+                if (this.search) {
+                    return { search: this.search };
+                }
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/riderEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/riderEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/rider/excel", { 
+                        responseType: "blob",
+                        params: { size: 10000 }
+                    })
+                    .then(res => {
+                        console.log(res);
+                        this.downloading = false;
+                        const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                        const link = document.createElement("a");
+                        link.href = downloadUrl;
+                        link.setAttribute(
+                            "download",
+                            res.headers["content-disposition"].split("filename=")[1]
+                        );
+                        document.body.appendChild(link);
+                        link.click();
+                        link.remove();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.downloading = false;
+                        this.$message.error(e.error);
+                    });
+            },
+            operation1() {
+                this.$notify({
+                    title: '提示',
+                    message: this.selection
+                });
+            },
+            operation2() {
+                this.$message('操作2');
+            },
+            deleteRow(row) {
+                this.$alert('删除将无法恢复,确认要删除么?', '警告', {type: 'error'}).then(() => {
+                    return this.$http.post(`/rider/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 2 - 2
src/test/java/com/izouma/dingdong/repo/UserRepoTest.java

@@ -35,8 +35,8 @@ public class UserRepoTest {
     @Test
     @Test
     public void createUser() {
     public void createUser() {
 
 
-        User user = userRepo.findByUsername("root");
-        user.setPassword(new BCryptPasswordEncoder().encode("123456"));
+        User user = userRepo.findByUsername("123");
+        user.setPassword(new BCryptPasswordEncoder().encode("123"));
         userRepo.save(user);
         userRepo.save(user);
     }
     }
 
 

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