licailing vor 5 Jahren
Ursprung
Commit
3b14b381d0
62 geänderte Dateien mit 1764 neuen und 201 gelöschten Zeilen
  1. 1 1
      pom.xml
  2. 2 0
      src/main/java/com/izouma/dingdong/config/Constants.java
  3. 13 6
      src/main/java/com/izouma/dingdong/domain/Appraisal.java
  4. 39 0
      src/main/java/com/izouma/dingdong/domain/OrderGoodsSpec.java
  5. 43 19
      src/main/java/com/izouma/dingdong/domain/OrderInfo.java
  6. 72 0
      src/main/java/com/izouma/dingdong/domain/OrderRefundApply.java
  7. 1 0
      src/main/java/com/izouma/dingdong/domain/User.java
  8. 2 0
      src/main/java/com/izouma/dingdong/domain/backstage/BlackList.java
  9. 1 1
      src/main/java/com/izouma/dingdong/domain/backstage/Tag.java
  10. 8 3
      src/main/java/com/izouma/dingdong/domain/merchant/Goods.java
  11. 2 0
      src/main/java/com/izouma/dingdong/domain/merchant/GoodsSpecification.java
  12. 3 0
      src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java
  13. 8 2
      src/main/java/com/izouma/dingdong/domain/merchant/MerchantClassification.java
  14. 16 3
      src/main/java/com/izouma/dingdong/domain/merchant/Sales.java
  15. 4 2
      src/main/java/com/izouma/dingdong/dto/GoodsSpecDTO.java
  16. 10 0
      src/main/java/com/izouma/dingdong/dto/UserOrderDTO.java
  17. 28 0
      src/main/java/com/izouma/dingdong/enums/MerchantStatus.java
  18. 21 0
      src/main/java/com/izouma/dingdong/enums/OrderStatus.java
  19. 19 0
      src/main/java/com/izouma/dingdong/enums/RefundReason.java
  20. 18 0
      src/main/java/com/izouma/dingdong/enums/RefundStatus.java
  21. 0 12
      src/main/java/com/izouma/dingdong/enums/Week.java
  22. 17 0
      src/main/java/com/izouma/dingdong/repo/AppraisalRepo.java
  23. 13 0
      src/main/java/com/izouma/dingdong/repo/OrderGoodsSpecRepo.java
  24. 12 0
      src/main/java/com/izouma/dingdong/repo/OrderInfoRepo.java
  25. 23 0
      src/main/java/com/izouma/dingdong/repo/OrderRefundApplyRepo.java
  26. 1 0
      src/main/java/com/izouma/dingdong/repo/SysConfigRepo.java
  27. 8 0
      src/main/java/com/izouma/dingdong/repo/UserRepo.java
  28. 13 0
      src/main/java/com/izouma/dingdong/repo/merchant/AutomaticResponseRepo.java
  29. 1 0
      src/main/java/com/izouma/dingdong/repo/merchant/FullReductionRepo.java
  30. 23 1
      src/main/java/com/izouma/dingdong/repo/merchant/GoodsRepo.java
  31. 3 0
      src/main/java/com/izouma/dingdong/repo/merchant/MerchantClassificationRepo.java
  32. 17 2
      src/main/java/com/izouma/dingdong/repo/merchant/SalesRepo.java
  33. 38 0
      src/main/java/com/izouma/dingdong/service/AppraisalService.java
  34. 14 0
      src/main/java/com/izouma/dingdong/service/OrderGoodsSpecService.java
  35. 66 5
      src/main/java/com/izouma/dingdong/service/OrderInfoService.java
  36. 127 0
      src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java
  37. 14 0
      src/main/java/com/izouma/dingdong/service/merchant/AutomaticResponseService.java
  38. 14 14
      src/main/java/com/izouma/dingdong/service/merchant/GoodsService.java
  39. 54 0
      src/main/java/com/izouma/dingdong/service/merchant/MerchantClassificationService.java
  40. 12 6
      src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java
  41. 17 0
      src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java
  42. 142 0
      src/main/java/com/izouma/dingdong/service/merchant/SalesService.java
  43. 86 0
      src/main/java/com/izouma/dingdong/web/AppraisalController.java
  44. 60 0
      src/main/java/com/izouma/dingdong/web/OrderGoodsSpecController.java
  45. 98 0
      src/main/java/com/izouma/dingdong/web/OrderRefundApplyController.java
  46. 80 0
      src/main/java/com/izouma/dingdong/web/merchant/AutomaticResponseController.java
  47. 2 0
      src/main/java/com/izouma/dingdong/web/merchant/GoodsController.java
  48. 1 0
      src/main/java/com/izouma/dingdong/web/merchant/GoodsSpecificationController.java
  49. 15 4
      src/main/java/com/izouma/dingdong/web/merchant/MerchantClassificationController.java
  50. 3 3
      src/main/resources/application.yaml
  51. 1 0
      src/main/resources/genjson/AutomaticResponse.json
  52. 1 0
      src/main/resources/genjson/OrderGoodsSpec.json
  53. 77 77
      src/main/vue/package-lock.json
  54. 1 1
      src/main/vue/public/index.html
  55. 18 2
      src/main/vue/src/router.js
  56. 117 0
      src/main/vue/src/views/AppraisalEdit.vue
  57. 189 0
      src/main/vue/src/views/AppraisalList.vue
  58. 25 20
      src/main/vue/src/views/SalesEdit.vue
  59. 23 17
      src/main/vue/src/views/SalesList.vue
  60. 0 0
      src/main/vue/src/views/merchant/MerchantEdit.vue
  61. 0 0
      src/main/vue/src/views/merchant/MerchantList.vue
  62. 27 0
      src/test/java/com/izouma/dingdong/repo/SalesRepoTest.java

+ 1 - 1
pom.xml

@@ -60,7 +60,7 @@
         <dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
             <artifactId>hutool-all</artifactId>
-            <version>5.2.4</version>
+            <version>5.3.0</version>
         </dependency>
         </dependency>
 
 
         <dependency>
         <dependency>

+ 2 - 0
src/main/java/com/izouma/dingdong/config/Constants.java

@@ -14,4 +14,6 @@ public interface Constants {
     String SMS_SIGN_NAME = "走马信息";
     String SMS_SIGN_NAME = "走马信息";
 
 
     String SMS_TEMPLATE_CODE_GENERIC = "SMS_175485688";
     String SMS_TEMPLATE_CODE_GENERIC = "SMS_175485688";
+
+    String CLASSIFICATION_NAME = "好评热销";
 }
 }

+ 13 - 6
src/main/java/com/izouma/dingdong/domain/Appraisal.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.*;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
+import java.time.LocalDateTime;
 
 
 @EqualsAndHashCode(callSuper = true)
 @EqualsAndHashCode(callSuper = true)
 @Data
 @Data
@@ -17,17 +18,20 @@ public class Appraisal extends BaseEntity {
     @ApiModelProperty(value = "订单号", name = "orderId")
     @ApiModelProperty(value = "订单号", name = "orderId")
     private Long orderId;
     private Long orderId;
 
 
-//    @ApiModelProperty(value = "商户ID", name = "merchantId")
-//    private Long merchantId;
-//
-//    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
-//    private String jobNumber;
+    @ApiModelProperty(value = "商户ID", name = "merchantId")
+    private Long merchantId;
+
+    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
+    private Long riderId;
 
 
     @ApiModelProperty(value = "图片", name = "img")
     @ApiModelProperty(value = "图片", name = "img")
     private String img;
     private String img;
 
 
     @ApiModelProperty(value = "商品评分", name = "goodsScore")
     @ApiModelProperty(value = "商品评分", name = "goodsScore")
-    private Integer goodsScore;
+    private Boolean goodsLike;
+
+    @ApiModelProperty(value = "商品评分", name = "goodsScore")
+    private Boolean goodsBad;
 
 
     @ApiModelProperty(value = "商品评价", name = "goodsAppraise")
     @ApiModelProperty(value = "商品评价", name = "goodsAppraise")
     private String goodsAppraise;
     private String goodsAppraise;
@@ -44,4 +48,7 @@ public class Appraisal extends BaseEntity {
 
 
     @ApiModelProperty(value = "商家回复评价", name = "merchantReply")
     @ApiModelProperty(value = "商家回复评价", name = "merchantReply")
     private String merchantReply;
     private String merchantReply;
+
+    @ApiModelProperty(value = "评价日期", name = "appreiseTime")
+    private LocalDateTime appraiseTime;
 }
 }

+ 39 - 0
src/main/java/com/izouma/dingdong/domain/OrderGoodsSpec.java

@@ -0,0 +1,39 @@
+package com.izouma.dingdong.domain;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Entity
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单商品及规格", description = "订单商品及规格")
+public class OrderGoodsSpec extends BaseEntity implements Serializable {
+    @ApiModelProperty(value = "订单ID", name = "orderId")
+    private Long orderId;
+
+    @ApiModelProperty(value = "商品ID", name = "goodsId")
+    private Long goodsId;
+
+//    private String goodsName;
+
+    @ApiModelProperty(value = "规格", name = "specification")
+    private String specification;
+
+    @ApiModelProperty(value = "数量", name = "num")
+    private Integer num;
+
+    @ApiModelProperty(value = "商品价格", name = "goodsPrice")
+    private BigDecimal goodsPrice;
+
+}

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

@@ -1,6 +1,9 @@
 package com.izouma.dingdong.domain;
 package com.izouma.dingdong.domain;
 
 
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.Goods;
+import com.izouma.dingdong.dto.GoodsSpecDTO;
+import com.izouma.dingdong.enums.MerchantStatus;
+import com.izouma.dingdong.enums.OrderStatus;
 import com.izouma.dingdong.enums.PayMethod;
 import com.izouma.dingdong.enums.PayMethod;
 import com.izouma.dingdong.enums.RiderStatus;
 import com.izouma.dingdong.enums.RiderStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
@@ -23,32 +26,52 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "用户ID", name = "userId")
     @ApiModelProperty(value = "用户ID", name = "userId")
     private Long userId;
     private Long userId;
 
 
+    @ApiModelProperty(value = "订单状态", name = "orderStatus")
+    private OrderStatus status;
+
     //商家信息
     //商家信息
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
     private Long merchantId;
 
 
-    @ManyToMany(fetch = FetchType.EAGER)
-    @ApiModelProperty(value = "商品ID", name = "goodsId")
-    private List<Goods> goods;
+//    @ManyToMany(fetch = FetchType.EAGER)
+//    @ApiModelProperty(value = "商品ID", name = "goodsId")
+//    private List<Goods> goods;
 
 
+    @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "商家状态", name = "merchantStatus")
     @ApiModelProperty(value = "商家状态", name = "merchantStatus")
-    private String merchantStatus;
+    private MerchantStatus merchantStatus;
 
 
-    @ApiModelProperty(value = "商家地址", name = "merchantAddress")
-    private String merchantAddress;
+//    @ApiModelProperty(value = "商家地址", name = "merchantAddress")
+//    private String merchantAddress;
 
 
     @ApiModelProperty(value = "备注", name = "remark")
     @ApiModelProperty(value = "备注", name = "remark")
     private String remark;
     private String remark;
 
 
-    @ApiModelProperty(value = "总价", name = "totalAmount")
-    private BigDecimal totalAmount;
-
-    @ApiModelProperty(value = "商品总价", name = "goodsAmount")
-    private BigDecimal goodsAmount;
+    //价格
+    @ApiModelProperty(value = "包装价格", name = "packingPrice")
+    private BigDecimal packingPrice;
 
 
     @ApiModelProperty(value = "配送费", name = "deliveryAmount")
     @ApiModelProperty(value = "配送费", name = "deliveryAmount")
     private BigDecimal deliveryAmount;
     private BigDecimal deliveryAmount;
 
 
+    @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 = "totalAmount")
+    private BigDecimal totalAmount;
+
+//    @ApiModelProperty(value = "商品总价", name = "goodsAmount")
+//    private BigDecimal goodsAmount;
+
     @ApiModelProperty(value = "实付金额", name = "realAmount")
     @ApiModelProperty(value = "实付金额", name = "realAmount")
     private BigDecimal realAmount;
     private BigDecimal realAmount;
 
 
@@ -61,8 +84,10 @@ public class OrderInfo extends BaseEntity {
 
 
 
 
     //配送信息
     //配送信息
-    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
-    private String jobNumber;
+/*    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
+    private String jobNumber;*/
+
+    private Long riderId;
 
 
     @Enumerated(EnumType.STRING)
     @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "骑手状态", name = "riderStatus")
     @ApiModelProperty(value = "骑手状态", name = "riderStatus")
@@ -82,7 +107,6 @@ public class OrderInfo extends BaseEntity {
     private PayMethod payMethod;
     private PayMethod payMethod;
 
 
 
 
-
     @Column(nullable = false)
     @Column(nullable = false)
     @ApiModelProperty(value = "取消订单", name = "cancel")
     @ApiModelProperty(value = "取消订单", name = "cancel")
     private Boolean cancel = false;
     private Boolean cancel = false;
@@ -91,15 +115,15 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "已评价", name = "rated")
     @ApiModelProperty(value = "已评价", name = "rated")
     private Boolean rated = false;
     private Boolean rated = false;
 
 
-    @ApiModelProperty(value = "商家接单时间", name = "merchantOrderTime")
-    private LocalDateTime merchantOrderTime;
+//    @ApiModelProperty(value = "商家接单时间", name = "merchantOrderTime")
+//    private LocalDateTime merchantOrderTime;
 
 
-    @ApiModelProperty(value = "骑手接单时间", name = "riderOrderTime")
-    private LocalDateTime riderOrderTime;
+//    @ApiModelProperty(value = "骑手接单时间", name = "riderOrderTime")
+//    private LocalDateTime riderOrderTime;
 
 
     @ApiModelProperty(value = "用户收到时间", name = "userReceivedTime")
     @ApiModelProperty(value = "用户收到时间", name = "userReceivedTime")
     private LocalDateTime userReceivedTime;
     private LocalDateTime userReceivedTime;
 
 
-
+    private Boolean enabled;
 
 
 }
 }

+ 72 - 0
src/main/java/com/izouma/dingdong/domain/OrderRefundApply.java

@@ -0,0 +1,72 @@
+package com.izouma.dingdong.domain;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+
+import com.izouma.dingdong.enums.RefundReason;
+import com.izouma.dingdong.enums.RefundStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Builder
+@ApiModel(value = "退款申请", description = "退款申请")
+public class OrderRefundApply extends BaseEntity {
+    @ApiModelProperty(value = "订单ID", name = "orderId")
+    private Long orderId;
+
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
+
+    @ApiModelProperty(value = "商户ID", name = "merchantId")
+    private Long merchantId;
+
+//    @ApiModelProperty(value = "图片")
+//    private String img;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "理由", name = "reason")
+    private RefundReason reason;
+
+    @ApiModelProperty(value = "状态", name = "status")
+    private RefundStatus status;
+
+    @ApiModelProperty(value = "申请时间", name = "applyTime")
+    private LocalDateTime applyTime;
+
+    @ApiModelProperty(value = "审核时间", name = "auditTime")
+    private LocalDateTime auditTime;
+
+    @ApiModelProperty(value = "退款时间", name = "refundTime")
+    private LocalDateTime refundTime;
+
+    @ApiModelProperty(value = "退款单号", name = "refundId")
+    private String refundId;
+
+    @OneToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "orderId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+    @NotFound(action = NotFoundAction.IGNORE)
+    @ExcelIgnore
+    private OrderInfo orderInfo;
+
+    @ApiModelProperty(value = "上报", name = "report")
+    private Boolean report;
+
+    @ApiModelProperty(value = "沟通结果", name = "context")
+    private String context;
+
+    //付款流水Id
+    //private Long feeId;
+
+}

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

@@ -82,4 +82,5 @@ public class User extends BaseEntity implements Serializable {
     @Column(nullable = false)
     @Column(nullable = false)
     @ApiModelProperty(value = "黑名单", name = "blacklist")
     @ApiModelProperty(value = "黑名单", name = "blacklist")
     private Boolean blacklist = false;
     private Boolean blacklist = false;
+
 }
 }

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

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
 
 
 import javax.persistence.Entity;
 import javax.persistence.Entity;
 
 
@@ -15,6 +16,7 @@ import javax.persistence.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")

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

@@ -23,5 +23,5 @@ public class Tag extends BaseEntity {
     @Column(length = 30)
     @Column(length = 30)
     @ApiModelProperty(value = "标签名称", name = "name")
     @ApiModelProperty(value = "标签名称", name = "name")
     private String name;
     private String name;
-    //好评 人气 推荐
+    //口碑联盟
 }
 }

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

@@ -4,6 +4,7 @@ import com.izouma.dingdong.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.*;
+import org.hibernate.annotations.Where;
 
 
 import javax.persistence.*;
 import javax.persistence.*;
 import java.io.Serializable;
 import java.io.Serializable;
@@ -16,6 +17,7 @@ import java.time.LocalTime;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
+@Where(clause = "enabled = 1")
 //@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
 //@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
 @ApiModel(value = "Goods", description = "商品")
 @ApiModel(value = "Goods", description = "商品")
 public class Goods extends BaseEntity implements Serializable {
 public class Goods extends BaseEntity implements Serializable {
@@ -59,8 +61,8 @@ public class Goods extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "下架", name = "takeOff")
     @ApiModelProperty(value = "下架", name = "takeOff")
     private Boolean takeOff = false;
     private Boolean takeOff = false;
 
 
-    @ApiModelProperty(value = "排布", name = "sort")
-    private Integer sort;
+//    @ApiModelProperty(value = "排布", name = "sort")
+//    private Integer sort;
 
 
     @ApiModelProperty(value = "是否参与满减", name = "isFullReduction")
     @ApiModelProperty(value = "是否参与满减", name = "isFullReduction")
     private Boolean isFullReduction = false;
     private Boolean isFullReduction = false;
@@ -74,6 +76,9 @@ public class Goods extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "供应时间", name = "endTime")
     @ApiModelProperty(value = "供应时间", name = "endTime")
     private LocalTime endTime;
     private LocalTime endTime;
 
 
-    @ApiModelProperty(value = "包装价格",name = "packingPrice")
+    @ApiModelProperty(value = "包装价格", name = "packingPrice")
     private BigDecimal packingPrice;
     private BigDecimal packingPrice;
+
+    private Boolean enabled;
+
 }
 }

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

@@ -2,6 +2,7 @@ package com.izouma.dingdong.domain.merchant;
 
 
 import com.izouma.dingdong.domain.BaseEntity;
 import com.izouma.dingdong.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.*;
 import lombok.*;
 
 
 import javax.persistence.Entity;
 import javax.persistence.Entity;
@@ -22,5 +23,6 @@ public class GoodsSpecification extends BaseEntity implements Serializable {
 
 
     private String name;
     private String name;
 
 
+    @ApiModelProperty(value = "价钱", name = "amount")
     private BigDecimal amount;
     private BigDecimal amount;
 }
 }

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

@@ -80,4 +80,7 @@ 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;
 }
 }

+ 8 - 2
src/main/java/com/izouma/dingdong/domain/merchant/MerchantClassification.java

@@ -13,6 +13,7 @@ import javax.persistence.*;
 import javax.validation.constraints.Size;
 import javax.validation.constraints.Size;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.util.List;
 import java.util.List;
+import java.util.Set;
 
 
 @Data
 @Data
 @AllArgsConstructor
 @AllArgsConstructor
@@ -32,13 +33,18 @@ public class MerchantClassification extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
     private Long merchantId;
 
 
-    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH})
+/*    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH})
     @JoinTable(
     @JoinTable(
             name = "goods_class",
             name = "goods_class",
             joinColumns = {@JoinColumn(name = "mer_id", referencedColumnName = "merchantId", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))},
             joinColumns = {@JoinColumn(name = "mer_id", referencedColumnName = "merchantId", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))},
             inverseJoinColumns = {@JoinColumn(name = "class_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))})
             inverseJoinColumns = {@JoinColumn(name = "class_name", referencedColumnName = "name", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))})
     @BatchSize(size = 20)
     @BatchSize(size = 20)
     @ApiModelProperty(value = "商品列表", name = "goodsList")
     @ApiModelProperty(value = "商品列表", name = "goodsList")
-    private List<Goods> goodsList;
+    private Set<Goods> goodsList;*/
+
+    private String goodsIds;
+
+    @ApiModelProperty(value = "是否开启", name = "isOpen")
+    private Boolean isOpen;
 
 
 }
 }

+ 16 - 3
src/main/java/com/izouma/dingdong/domain/merchant/Sales.java

@@ -1,6 +1,8 @@
 package com.izouma.dingdong.domain.merchant;
 package com.izouma.dingdong.domain.merchant;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.izouma.dingdong.domain.BaseEntity;
 import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.domain.OrderInfo;
 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;
@@ -8,7 +10,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
-import javax.persistence.Entity;
+import javax.persistence.*;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDate;
@@ -18,10 +20,12 @@ import java.time.LocalDate;
 @AllArgsConstructor
 @AllArgsConstructor
 @NoArgsConstructor
 @NoArgsConstructor
 @Builder
 @Builder
-//@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
+@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
 @ApiModel(value = "Sales", description = "销售额表")
 @ApiModel(value = "Sales", description = "销售额表")
 public class Sales extends BaseEntity implements Serializable {
 public class Sales extends BaseEntity implements Serializable {
 
 
+    private Long merchantId;
+
     @ApiModelProperty(value = "商品ID")
     @ApiModelProperty(value = "商品ID")
     private Long goodsId;
     private Long goodsId;
 
 
@@ -32,9 +36,18 @@ public class Sales extends BaseEntity implements Serializable {
     private Integer dayLikes;
     private Integer dayLikes;
 
 
     @ApiModelProperty(value = "日差评数")
     @ApiModelProperty(value = "日差评数")
-    private Integer datBad;
+    private Integer dayBad;
 
 
     @ApiModelProperty(value = "日期")
     @ApiModelProperty(value = "日期")
     private LocalDate day;
     private LocalDate day;
 
 
+    @ApiModelProperty(value = "好评")
+    private Integer praise;
+
+    @ApiModelProperty(value = "人气")
+    private Integer popularity;
+
+//    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.DETACH)
+//    @JoinColumn(name = "goodsId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+//    private Goods goods;
 }
 }

+ 4 - 2
src/main/java/com/izouma/dingdong/dto/GoodsSpecDTO.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.dto;
 package com.izouma.dingdong.dto;
 
 
+import com.izouma.dingdong.domain.merchant.GoodsSpecification;
 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;
@@ -8,6 +9,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.List;
 
 
 @Data
 @Data
 @AllArgsConstructor
 @AllArgsConstructor
@@ -21,10 +23,10 @@ public class GoodsSpecDTO {
     @ApiModelProperty(value = "商品ID", name = "goodsId")
     @ApiModelProperty(value = "商品ID", name = "goodsId")
     private Long goodsId;
     private Long goodsId;
 
 
-    private String goodsName;
+//    private String goodsName;
 
 
     @ApiModelProperty(value = "规格", name = "specification")
     @ApiModelProperty(value = "规格", name = "specification")
-    private String specification;
+    private List<GoodsSpecification> specification;
 
 
     @ApiModelProperty(value = "数量", name = "num")
     @ApiModelProperty(value = "数量", name = "num")
     private Integer num;
     private Integer num;

+ 10 - 0
src/main/java/com/izouma/dingdong/dto/UserOrderDTO.java

@@ -23,6 +23,10 @@ public class UserOrderDTO {
 
 
     private Long addressId;
     private Long addressId;
 
 
+    @ApiModelProperty(value = "商户ID", name = "merchantId")
+    private Long merchantId;
+
+    @ApiModelProperty(value = "商品规格",name = "goodsSpecs")
     private List<GoodsSpecDTO> goodsSpecs;
     private List<GoodsSpecDTO> goodsSpecs;
 
 
     @ApiModelProperty(value = "包装价格",name = "packingPrice")
     @ApiModelProperty(value = "包装价格",name = "packingPrice")
@@ -37,12 +41,16 @@ public class UserOrderDTO {
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     @ApiModelProperty(value = "优惠券ID", name = "couponId")
     private Long couponId;
     private Long couponId;
 
 
+    @ApiModelProperty(value = "满减", name = "fullReduction")
     private BigDecimal fullReduction;
     private BigDecimal fullReduction;
 
 
+    @ApiModelProperty(value = "首单", name = "firstBuy")
     private BigDecimal firstBuy;
     private BigDecimal firstBuy;
 
 
+    @ApiModelProperty(value = "红包", name = "redBag")
     private BigDecimal redBag;
     private BigDecimal redBag;
 
 
+    @ApiModelProperty(value = "新用户", name = "newUser")
     private BigDecimal newUser;
     private BigDecimal newUser;
 
 
     private BigDecimal total;
     private BigDecimal total;
@@ -51,4 +59,6 @@ public class UserOrderDTO {
     private BigDecimal realAmount;
     private BigDecimal realAmount;
 
 
     private String remark;
     private String remark;
+
+    private PayMethod payMethod;
 }
 }

+ 28 - 0
src/main/java/com/izouma/dingdong/enums/MerchantStatus.java

@@ -0,0 +1,28 @@
+package com.izouma.dingdong.enums;
+
+public enum MerchantStatus {
+    /*
+    未接单
+     */
+    NOT_RECEIVED("未接单"),
+
+    /*
+    已接单
+     */
+    RECEIVED("已接单"),
+
+    /*
+    已拒单
+     */
+    REJECTED("已拒单");
+
+    private final String description;
+
+    MerchantStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 21 - 0
src/main/java/com/izouma/dingdong/enums/OrderStatus.java

@@ -0,0 +1,21 @@
+package com.izouma.dingdong.enums;
+
+public enum OrderStatus {
+
+    UNPAID("未支付"),
+    PAID("已支付"),
+    CANCELLED("已取消"),
+    PENDING("申请退款中"),
+    REFUNDED("已退款"),
+    COMPLETED("已完成");
+
+    private final String description;
+
+    OrderStatus(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 19 - 0
src/main/java/com/izouma/dingdong/enums/RefundReason.java

@@ -0,0 +1,19 @@
+package com.izouma.dingdong.enums;
+
+public enum RefundReason {
+
+    MERCHANT_REJECTED("商家拒单"),
+    WANT_TO_BUY("不想要了"),
+    NOT_CLEAN("不干净"),
+    TOO_SLOW("太慢"),
+    OTHER("其他");
+    private final String description;
+
+    RefundReason(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

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

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

+ 0 - 12
src/main/java/com/izouma/dingdong/enums/Week.java

@@ -1,12 +0,0 @@
-package com.izouma.dingdong.enums;
-
-public enum Week {
-    EVERYDAY,
-    MONDAY,
-    TUESDAY,
-    WEDNESDAY,
-    THURSDAY,
-    FRIDAY,
-    SATURDAY,
-    SUNDAY;
-}

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

@@ -0,0 +1,17 @@
+package com.izouma.dingdong.repo;
+
+import com.izouma.dingdong.domain.Appraisal;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface AppraisalRepo extends JpaRepository<Appraisal, Long>, JpaSpecificationExecutor<Appraisal> {
+
+    Optional<Appraisal> findByOrderId(Long orderId);
+
+    List<Appraisal> findAllByMerchantId(Long merchantId);
+
+    List<Appraisal> findAllByRiderId(Long riderId);
+}

+ 13 - 0
src/main/java/com/izouma/dingdong/repo/OrderGoodsSpecRepo.java

@@ -0,0 +1,13 @@
+package com.izouma.dingdong.repo;
+
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+public interface OrderGoodsSpecRepo extends JpaRepository<OrderGoodsSpec, Long>, JpaSpecificationExecutor<OrderGoodsSpec> {
+
+    List<OrderGoodsSpec> findAllByOrderId(Long orderId);
+
+}

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

@@ -3,6 +3,18 @@ package com.izouma.dingdong.repo;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.OrderInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
 
 
 public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecificationExecutor<OrderInfo> {
 public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecificationExecutor<OrderInfo> {
+
+    @Query("update OrderInfo t set t.enabled = false where t.id = ?1")
+    @Modifying
+    @Transactional
+    void deleteById(Long id);
+
+    List<OrderInfo> findAllByMerchantId(Long merchantId);
 }
 }

+ 23 - 0
src/main/java/com/izouma/dingdong/repo/OrderRefundApplyRepo.java

@@ -0,0 +1,23 @@
+package com.izouma.dingdong.repo;
+
+
+import com.izouma.dingdong.domain.OrderRefundApply;
+import com.izouma.dingdong.enums.RefundStatus;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface OrderRefundApplyRepo extends JpaRepository<OrderRefundApply, Long>, JpaSpecificationExecutor<OrderRefundApply> {
+
+    Optional<OrderRefundApply> findByOrderIdAndStatus(Long orderId, RefundStatus status);
+
+    //商家退款申请
+    List<OrderRefundApply> findAllByMerchantId(Long merchantId);
+
+    //显示上报退款申请
+    List<OrderRefundApply> findAllByReportIsTrue();
+
+}

+ 1 - 0
src/main/java/com/izouma/dingdong/repo/SysConfigRepo.java

@@ -7,5 +7,6 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import java.util.Optional;
 import java.util.Optional;
 
 
 public interface SysConfigRepo extends JpaRepository<SysConfig, String>, JpaSpecificationExecutor<SysConfig> {
 public interface SysConfigRepo extends JpaRepository<SysConfig, String>, JpaSpecificationExecutor<SysConfig> {
+
     Optional<SysConfig> findByName(String name);
     Optional<SysConfig> findByName(String name);
 }
 }

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

@@ -4,7 +4,10 @@ import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.security.Authority;
 import com.izouma.dingdong.security.Authority;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
 
 
+import javax.transaction.Transactional;
 import java.util.List;
 import java.util.List;
 
 
 public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
 public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
@@ -15,4 +18,9 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     User findByOpenId(String openId);
     User findByOpenId(String openId);
 
 
     User findByPhone(String phone);
     User findByPhone(String phone);
+
+    @Query("update User t set t.enabled = false where t.id = ?1")
+    @Modifying
+    @Transactional
+    void deleteById(Long id);
 }
 }

+ 13 - 0
src/main/java/com/izouma/dingdong/repo/merchant/AutomaticResponseRepo.java

@@ -0,0 +1,13 @@
+package com.izouma.dingdong.repo.merchant;
+
+import com.izouma.dingdong.domain.merchant.AutomaticResponse;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+public interface AutomaticResponseRepo extends JpaRepository<AutomaticResponse, Long>, JpaSpecificationExecutor<AutomaticResponse> {
+
+    //查找商户下的所有自动回复
+    List<AutomaticResponse> findAllByMerchantId(Long merchantId);
+}

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

@@ -7,6 +7,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import java.util.List;
 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);
 }
 }

+ 23 - 1
src/main/java/com/izouma/dingdong/repo/merchant/GoodsRepo.java

@@ -3,13 +3,35 @@ package com.izouma.dingdong.repo.merchant;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.Goods;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
 
 
+import javax.transaction.Transactional;
 import java.util.List;
 import java.util.List;
 
 
 public interface GoodsRepo extends JpaRepository<Goods, Long>, JpaSpecificationExecutor<Goods> {
 public interface GoodsRepo extends JpaRepository<Goods, Long>, JpaSpecificationExecutor<Goods> {
-    List<Goods> findAllByMerchantId(Long merchantId);
 
 
+    @Query("update Goods t set t.enabled = false where t.id = ?1")
+    @Modifying
+    @Transactional
+    void deleteById(Long id);
+
+    List<Goods> findAllByMerchantId(Long merchantId);
 
 
 
 
 //    List<Goods> findAllByMerchantIdAndTotalSalesIsLessThanEqual(Long merchant,Integer num);
 //    List<Goods> findAllByMerchantIdAndTotalSalesIsLessThanEqual(Long merchant,Integer num);
+
+
+    @Query("update Goods t set t.likes = t.likes + 1 where t.id = ?1")
+    @Modifying
+    @Transactional
+    Goods updateLikesById(Long id);
+
+    @Query("update Goods t set t.bad = t.bad + 1 where t.id = ?1")
+    @Modifying
+    @Transactional
+    Goods updateBadById(Long id);
+
+    @Query(nativeQuery = true, value = "SELECT ifnull(max(sort + 1),1) FROM menu")
+    int nextSort();
 }
 }

+ 3 - 0
src/main/java/com/izouma/dingdong/repo/merchant/MerchantClassificationRepo.java

@@ -8,4 +8,7 @@ import java.util.List;
 
 
 public interface MerchantClassificationRepo extends JpaRepository<MerchantClassification, Long>, JpaSpecificationExecutor<MerchantClassification> {
 public interface MerchantClassificationRepo extends JpaRepository<MerchantClassification, Long>, JpaSpecificationExecutor<MerchantClassification> {
     List<MerchantClassification> findAllByMerchantId(Long merchantId);
     List<MerchantClassification> findAllByMerchantId(Long merchantId);
+
+    MerchantClassification findByMerchantIdAndName(Long merchantId, String Name);
+
 }
 }

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

@@ -8,10 +8,25 @@ import java.time.LocalDate;
 import java.util.List;
 import java.util.List;
 
 
 public interface SalesRepo extends JpaRepository<Sales, Long>, JpaSpecificationExecutor<Sales> {
 public interface SalesRepo extends JpaRepository<Sales, Long>, JpaSpecificationExecutor<Sales> {
-    //前一日起,最近n天,日销量达num
-    Boolean findByGoodsIdAndDayAfterAndDaySalesGreaterThanEqual(Long goodsId, LocalDate day, Integer num);
+
+//    List<Sales> findByGoodsIdAndPopularityGreaterThanEqual(Long goodsId, Integer num);
+
+    //人气商品,前一天起连续五天,每天销量>50
+//    List<Sales> findByGoodsIdAndDayAndPopularityGreaterThanEqual(Long goodsId, LocalDate day, Integer num);
+
+    //好评商品,前一天起连续五天,每天销量>10,点赞数量在增加
+//    Sales findByGoodsIdAndDayAndPraiseGreaterThanEqual(Long goodsId, LocalDate day, Integer num);
 
 
     List<Sales> findAllByGoodsId(Long goodsId);
     List<Sales> findAllByGoodsId(Long goodsId);
 
 
+    //查找商品今天的销量
+    Sales findByGoodsIdAndDay(Long goodsId, LocalDate day);
+
+    List<Sales> findAllByDay(LocalDate day);
+
+    //好评商品
+    List<Sales> findAllByDayAndPopularityGreaterThanEqual(LocalDate day, Integer num);
 
 
+    //人气商品
+    List<Sales> findAllByDayAndPraiseGreaterThanEqual(LocalDate day, Integer num);
 }
 }

+ 38 - 0
src/main/java/com/izouma/dingdong/service/AppraisalService.java

@@ -0,0 +1,38 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.domain.Appraisal;
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.domain.merchant.AutomaticResponse;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.AppraisalRepo;
+import com.izouma.dingdong.repo.OrderInfoRepo;
+import com.izouma.dingdong.repo.merchant.AutomaticResponseRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AppraisalService {
+
+    private AppraisalRepo appraisalRepo;
+
+    private OrderInfoRepo orderInfoRepo;
+
+
+    /*
+    客户评价
+     */
+    public Appraisal userAppraisal(Appraisal appraisal) {
+
+        OrderInfo order = appraisal.getOrder();
+        order.setRated(true);
+        orderInfoRepo.save(order);
+
+        appraisal.setMerchantId(order.getMerchantId());
+        appraisal.setRiderId(order.getRiderId());
+
+        return appraisalRepo.save(appraisal);
+    }
+
+
+}

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

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class OrderGoodsSpecService {
+
+    private OrderGoodsSpecRepo orderGoodsSpecRepo;
+
+}

+ 66 - 5
src/main/java/com/izouma/dingdong/service/OrderInfoService.java

@@ -1,20 +1,30 @@
 package com.izouma.dingdong.service;
 package com.izouma.dingdong.service;
 
 
+import cn.hutool.core.bean.BeanUtil;
+import com.izouma.dingdong.domain.OrderGoodsSpec;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.OrderInfo;
 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.user.Coupon;
 import com.izouma.dingdong.domain.user.Coupon;
 import com.izouma.dingdong.dto.GoodsSpecDTO;
 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.CouponType;
+import com.izouma.dingdong.enums.MerchantStatus;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
+import com.izouma.dingdong.repo.merchant.GoodsRepo;
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
 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.MerchantSettingsService;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.List;
+import java.util.Objects;
 
 
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
@@ -22,13 +32,50 @@ public class OrderInfoService {
 
 
     private OrderInfoRepo orderInfoRepo;
     private OrderInfoRepo orderInfoRepo;
     private CouponRepo couponRepo;
     private CouponRepo couponRepo;
+    private OrderGoodsSpecRepo orderGoodsSpecRepo;
+    private GoodsRepo goodsRepo;
+    private GoodsService goodsService;
+    private MerchantRepo merchantRepo;
+    private MerchantSettingsService merchantSettingsService;
 
 
     /*
     /*
     用户下单
     用户下单
      */
      */
     public void userOrder(UserOrderDTO userOrderDTO) {
     public void userOrder(UserOrderDTO userOrderDTO) {
-        List<GoodsSpecDTO> goodsSpec = userOrderDTO.getGoodsSpecs();
+        //商家
+        Merchant merchant = merchantRepo.findById(userOrderDTO.getMerchantId()).orElseThrow(new BusinessException("无商家"));
 
 
+        OrderInfo orderInfo = new OrderInfo();
+        BeanUtil.copyProperties(userOrderDTO, orderInfo);
+        orderInfo.setMerchantStatus(MerchantStatus.NOT_RECEIVED);
+        orderInfo.setCancel(false);
+        orderInfoRepo.save(orderInfo);
+
+        //详细商品信息
+        userOrderDTO.getGoodsSpecs().forEach(goodsSpecDTO -> {
+                    //查库存是否足够
+                    Goods goods = goodsService.buy(goodsSpecDTO.getGoodsId(), goodsSpecDTO.getNum());
+
+                    //保存规格
+                    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);
+        }
 
 
     }
     }
 
 
@@ -37,13 +84,11 @@ public class OrderInfoService {
      */
      */
     private void sumAmount(OrderInfo orderInfo) {
     private void sumAmount(OrderInfo orderInfo) {
 
 
-
-
         Coupon coupon = couponRepo.findById(orderInfo.getCouponId()).orElseThrow(new BusinessException("优惠卷不存在"));
         Coupon coupon = couponRepo.findById(orderInfo.getCouponId()).orElseThrow(new BusinessException("优惠卷不存在"));
         CouponType type = coupon.getType();
         CouponType type = coupon.getType();
-        BigDecimal goodsAmount = orderInfo.getGoodsAmount();
+        BigDecimal goodsAmount = orderInfo.getTotalAmount();
         if (type == CouponType.REDUCTION) {
         if (type == CouponType.REDUCTION) {
-            if (goodsAmount.compareTo(coupon.getFullAmount()) >= 0){
+            if (goodsAmount.compareTo(coupon.getFullAmount()) >= 0) {
                 goodsAmount.subtract(coupon.getAmount());
                 goodsAmount.subtract(coupon.getAmount());
             }
             }
 
 
@@ -53,4 +98,20 @@ public class OrderInfoService {
         coupon.setIsUsed(true);
         coupon.setIsUsed(true);
     }
     }
 
 
+    /*
+    商家接单
+     */
+    public OrderInfo receiveOrder(Long orderId, Boolean pass) {
+        OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        if (pass) {
+            orderInfo.setMerchantStatus(MerchantStatus.RECEIVED);
+        }else {
+            orderInfo.setMerchantStatus(MerchantStatus.REJECTED);
+            orderInfo.setCancel(true);
+            //退款流程
+        }
+        return orderInfoRepo.save(orderInfo);
+    }
+
+
 }
 }

+ 127 - 0
src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java

@@ -0,0 +1,127 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.domain.OrderRefundApply;
+import com.izouma.dingdong.enums.OrderStatus;
+import com.izouma.dingdong.enums.RefundReason;
+import com.izouma.dingdong.enums.RefundStatus;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderInfoRepo;
+import com.izouma.dingdong.repo.OrderRefundApplyRepo;
+import com.izouma.dingdong.repo.UserRepo;
+import com.izouma.dingdong.utils.SnowflakeIdWorker;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+
+@Service
+@Slf4j
+public class OrderRefundApplyService {
+
+    @Autowired
+    private OrderRefundApplyRepo orderRefundApplyRepo;
+
+    @Autowired
+    private OrderInfoRepo orderInfoRepo;
+
+    @Autowired
+    private UserRepo userRepo;
+
+    private OrderStatus status;
+
+    /**
+     * 申请退款
+     *
+     * @param orderId 订单号
+     * @param reason  退款缘由
+     * @param remark  备注
+     */
+    public void apply(Long orderId, RefundReason reason, String remark) {
+        OrderInfo order = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无记录"));
+        //记录原来的订单状态
+        status = order.getStatus();
+        switch (status) {
+            case UNPAID:
+                throw new BusinessException("暂未支付");
+            case REFUNDED:
+                throw new BusinessException("订单已退");
+            case CANCELLED:
+                throw new BusinessException("订单已取消");
+            case PENDING:
+                return;
+        }
+
+        orderRefundApplyRepo.save(OrderRefundApply.builder()
+                .status(RefundStatus.PENDING)
+                .applyTime(LocalDateTime.now())
+                .reason(reason)
+                .remark(remark)
+                .orderId(orderId)
+                .report(false)
+                .build());
+
+        order.setStatus(OrderStatus.PENDING);
+        orderInfoRepo.save(order);
+    }
+
+    /**
+     * 审核退款 线下退
+     *
+     * @param applyId 申请退款ID
+     * @param consent 是否通过
+     */
+    public void audit(Long applyId, boolean consent) {
+        OrderRefundApply apply = orderRefundApplyRepo.findById(applyId).orElseThrow(new BusinessException("无记录"));
+        if (apply.getStatus() != RefundStatus.PENDING) {
+            return;
+        }
+
+        userRepo.findById(apply.getOrderInfo().getUserId()).orElseThrow(new BusinessException("无用户"));
+        if (consent) {
+
+            String refundId = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
+            apply.setStatus(RefundStatus.SUCCESS);
+
+            if (StringUtils.isEmpty(apply.getRefundId())) {
+                apply.setRefundId(refundId);
+            }
+
+        } else {
+            apply.setStatus(RefundStatus.DENY);
+            apply.getOrderInfo().setStatus((status != null) ? status : OrderStatus.PAID);
+            //上报到后台
+            apply.setReport(true);
+
+        }
+        apply.setAuditTime(LocalDateTime.now());
+        orderInfoRepo.save(apply.getOrderInfo());
+        orderRefundApplyRepo.save(apply);
+
+
+    }
+
+    /*
+    取消退款
+     */
+    public void cancelRefundApply(Long orderId) {
+        orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        OrderRefundApply apply = orderRefundApplyRepo.findByOrderIdAndStatus(orderId, RefundStatus.PENDING).orElseThrow(new BusinessException("未申请退款"));
+        apply.setStatus(RefundStatus.CANCEL);
+        apply.getOrderInfo().setStatus((status != null) ? status : OrderStatus.PAID);
+        orderInfoRepo.save(apply.getOrderInfo());
+        orderRefundApplyRepo.save(apply);
+    }
+
+    /*
+    商家的所有退款订单
+     */
+    public List<OrderRefundApply> merchantRefund(Long id){
+        return orderRefundApplyRepo.findAllByMerchantId(id);
+    }
+}

+ 14 - 0
src/main/java/com/izouma/dingdong/service/merchant/AutomaticResponseService.java

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.merchant;
+
+import com.izouma.dingdong.domain.merchant.AutomaticResponse;
+import com.izouma.dingdong.repo.merchant.AutomaticResponseRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class AutomaticResponseService {
+
+    private AutomaticResponseRepo automaticResponseRepo;
+
+}

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

@@ -48,23 +48,23 @@ public class GoodsService {
         return goodsRepo.save(goods);
         return goodsRepo.save(goods);
     }
     }
 
 
-    /*
-   推荐商品
-    */
-    public List<Goods> recommend(Long merchantId) {
-        List<Goods> goodsList = goodsRepo.findAllByMerchantId(merchantId);
-        goodsList.forEach(goods -> {
-            salesRepo.findByGoodsIdAndDayAfterAndDaySalesGreaterThanEqual(goods.getId(), LocalDate.now(),50);
-
-        });
-
-
-        return null;
-    }
 
 
     /*
     /*
-    人气商品
+    购买商品/销量
      */
      */
+    public Goods buy(Long goodsId, Integer num) {
+        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
 
 
+        //库存
+        Integer inventory = goods.getInventory();
+        if (inventory <= 0) {
+            throw new BusinessException("已售馨");
+        }
+        if (inventory - num < 0) {
+            throw new BusinessException("库存不足");
+        }
+
+        return goods;
+    }
 
 
 }
 }

+ 54 - 0
src/main/java/com/izouma/dingdong/service/merchant/MerchantClassificationService.java

@@ -1,14 +1,68 @@
 package com.izouma.dingdong.service.merchant;
 package com.izouma.dingdong.service.merchant;
 
 
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.dingdong.converter.StringArrayConverter;
+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.exception.BusinessException;
+import com.izouma.dingdong.repo.merchant.GoodsRepo;
 import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class MerchantClassificationService {
 public class MerchantClassificationService {
 
 
     private MerchantClassificationRepo merchantClassificationRepo;
     private MerchantClassificationRepo merchantClassificationRepo;
 
 
+    private MerchantService merchantService;
+
+    private GoodsRepo goodsRepo;
+
+
+    /*
+    添加商家自定义分类
+     */
+    public MerchantClassification add(Long id, MerchantClassification classification) {
+
+        MerchantClassification build = MerchantClassification.builder()
+                .name(classification.getName())
+                .goodsIds(classification.getGoodsIds())
+                .build();
+
+        //根据用户ID设置商户ID
+        build.setMerchantId(merchantService.findMerchantId(id));
+        if (classification.getIsOpen() == null) {
+            build.setIsOpen(true);
+        } else {
+            build.setIsOpen(classification.getIsOpen());
+        }
+
+        return merchantClassificationRepo.save(build);
+    }
+
+    /*
+    显示类别下的商品列表
+     */
+    public List<Goods> showGoods(Long classificationId) {
+        MerchantClassification merchantClassification = merchantClassificationRepo.findById(classificationId).orElseThrow(new BusinessException("分类不存在"));
+
+        StringArrayConverter converter = new StringArrayConverter();
+        List<String> string = converter.convertToEntityAttribute(merchantClassification.getGoodsIds());
+        List<Goods> goods = CollUtil.newArrayList();
+        string.forEach(s -> {
+            goods.add(goodsRepo.findById(Long.parseLong(s)).orElseThrow(new BusinessException("商品不存在")));
+        });
+        return goods;
+    }
+
+    /*
+    分类下添加商品
+     */
+
+
+
 }
 }

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

@@ -3,6 +3,7 @@ package com.izouma.dingdong.service.merchant;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
@@ -132,8 +133,9 @@ public class MerchantService {
             //新建一好评热销分类
             //新建一好评热销分类
             merchantClassificationRepo.save(MerchantClassification.builder()
             merchantClassificationRepo.save(MerchantClassification.builder()
                     .merchantId(merchantId)
                     .merchantId(merchantId)
-                    .name("好评热销")
+                    .name(Constants.CLASSIFICATION_NAME)
                     .sort(1)
                     .sort(1)
+                    .isOpen(false)
                     .build());
                     .build());
         } else {
         } else {
             merchant.setStatus(ApplyStatus.DENY);
             merchant.setStatus(ApplyStatus.DENY);
@@ -151,9 +153,9 @@ public class MerchantService {
     public Page<MerchantDTO> showAll(Pageable pageable) {
     public Page<MerchantDTO> showAll(Pageable pageable) {
         List<MerchantDTO> merchantDTOS = CollUtil.newArrayList();
         List<MerchantDTO> merchantDTOS = CollUtil.newArrayList();
         List<Merchant> merchants = merchantRepo.findAll();
         List<Merchant> merchants = merchantRepo.findAll();
-        for (int i = 0; i < merchants.size(); i++) {
-            MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(merchants.get(i).getId()).orElseThrow(new BusinessException("商户不存在"));
-            merchantDTOS.add(new MerchantDTO(merchants.get(i), merchantSettings));
+        for (Merchant merchant : merchants) {
+            MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(merchant.getId()).orElseThrow(new BusinessException("商户不存在"));
+            merchantDTOS.add(new MerchantDTO(merchant, merchantSettings));
         }
         }
         return new PageImpl<>(merchantDTOS, pageable, merchantDTOS.size());
         return new PageImpl<>(merchantDTOS, pageable, merchantDTOS.size());
     }
     }
@@ -169,12 +171,16 @@ public class MerchantService {
         return new MerchantDTO(merchant, merchantSettings);
         return new MerchantDTO(merchant, merchantSettings);
     }
     }
 
 
-    /*
-    用户查找商家
+    /**
+     * 用户查找商家
+     * @param userId 用户ID
+     * @return 商家ID
      */
      */
     public Long findMerchantId(Long userId){
     public Long findMerchantId(Long userId){
         Merchant merchant = merchantRepo.findByUserId(userId).orElseThrow(new BusinessException("商户不存在"));
         Merchant merchant = merchantRepo.findByUserId(userId).orElseThrow(new BusinessException("商户不存在"));
         return merchant.getId();
         return merchant.getId();
     }
     }
 
 
+
+
 }
 }

+ 17 - 0
src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java

@@ -1,14 +1,31 @@
 package com.izouma.dingdong.service.merchant;
 package com.izouma.dingdong.service.merchant;
 
 
+import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
+import com.izouma.dingdong.enums.MerchantStatus;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
 import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.List;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class MerchantSettingsService {
 public class MerchantSettingsService {
 
 
     private MerchantSettingsRepo merchantSettingsRepo;
     private MerchantSettingsRepo merchantSettingsRepo;
 
 
+    private OrderInfoRepo orderInfoRepo;
+
+    /*
+    显示所有订单
+     */
+    public List<OrderInfo> allOrder(Long id) {
+        return orderInfoRepo.findAllByMerchantId(id);
+    }
+
+
+
 }
 }

+ 142 - 0
src/main/java/com/izouma/dingdong/service/merchant/SalesService.java

@@ -1,14 +1,156 @@
 package com.izouma.dingdong.service.merchant;
 package com.izouma.dingdong.service.merchant;
 
 
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.dingdong.config.Constants;
+import com.izouma.dingdong.domain.Appraisal;
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.domain.merchant.Goods;
+import com.izouma.dingdong.domain.merchant.MerchantClassification;
 import com.izouma.dingdong.domain.merchant.Sales;
 import com.izouma.dingdong.domain.merchant.Sales;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.AppraisalRepo;
+import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
+import com.izouma.dingdong.repo.merchant.GoodsRepo;
+import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 import com.izouma.dingdong.repo.merchant.SalesRepo;
 import com.izouma.dingdong.repo.merchant.SalesRepo;
 import lombok.AllArgsConstructor;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
 @Service
 @Service
 @AllArgsConstructor
 @AllArgsConstructor
 public class SalesService {
 public class SalesService {
 
 
     private SalesRepo salesRepo;
     private SalesRepo salesRepo;
 
 
+    private AppraisalRepo appraisalRepo;
+
+    private MerchantClassificationRepo merchantClassificationRepo;
+
+    private OrderGoodsSpecRepo orderGoodsSpecRepo;
+
+    private GoodsRepo goodsRepo;
+
+    /*
+    订单插入销量
+     */
+    public void addSale(OrderInfo orderInfo) {
+        LocalDate localDate = LocalDate.now();
+
+        List<OrderGoodsSpec> orderGoodsSpecs = orderGoodsSpecRepo.findAllByOrderId(orderInfo.getId());
+        orderGoodsSpecs.forEach(
+                spec -> {
+                    //查商品销量表的销量数据
+                    Sales daySales = salesRepo.findByGoodsIdAndDay(spec.getGoodsId(), localDate);
+                    if (daySales == null) {
+                        daySales = Sales.builder()
+                                .goodsId(spec.getGoodsId())
+                                .day(localDate)
+                                .dayLikes(0)
+                                .dayBad(0)
+                                .popularity(0)
+                                .praise(0)
+                                .build();
+                    }
+
+                    //有订单,销量 + 购买数量
+                    daySales.setDaySales(daySales.getDaySales() + spec.getNum());
+
+                    //已评价
+                    if (orderInfo.getRated()) {
+                        Appraisal appraisal = appraisalRepo.findByOrderId(orderInfo.getId()).orElseThrow(new BusinessException("评价不存在"));
+                        if (appraisal.getGoodsLike()) {
+                            daySales.setDayLikes(daySales.getDayLikes() + 1);
+                            //查商品数据,加好评数
+                            goodsRepo.updateLikesById(spec.getGoodsId());
+                        }
+
+                        if (appraisal.getGoodsBad()) {
+                            daySales.setDayBad(daySales.getDayBad() + 1);
+                            //查商品数据,加差评数
+                            goodsRepo.updateBadById(spec.getGoodsId());
+                        }
+                    }
+
+                    //保存
+                    salesRepo.save(daySales);
+                }
+        );
+
+    }
+
+    /*
+    一天结束设置
+     */
+    public void dayOver() {
+        LocalDate now = LocalDate.now();
+        List<Sales> allSales = salesRepo.findAllByDay(now);
+        allSales.forEach(
+                sales -> {
+                    //无差评,销量 >=10,有好评
+                    if (sales.getDayBad() == 0 && sales.getDaySales() >= 10 && sales.getDayLikes() > 0) {
+                        //查找昨天的好评连续值
+                        Integer praise = salesRepo.findByGoodsIdAndDay(sales.getGoodsId(), now.plusDays(-1)).getPraise();
+                        //好评连续值+1
+                        sales.setPraise(praise + 1);
+                    } else {
+                        //如果有差评,不为好评商品
+                        sales.setPraise(0);
+                    }
+                    //销量 >50
+                    if (sales.getDaySales() >= 50) {
+                        //查找昨天的人气连续值
+                        Integer popularity = salesRepo.findByGoodsIdAndDay(sales.getGoodsId(), now.plusDays(-1)).getPopularity();
+                        //人气连续值+1
+                        sales.setPopularity(popularity + 1);
+                    } else {
+                        sales.setPopularity(0);
+                    }
+                    salesRepo.save(sales);
+                }
+        );
+    }
+
+    /*
+    如果有好评人气商品插入分类
+     */
+    public void addClass() {
+
+        //查出今天所有人气商品
+        List<Sales> popularities = salesRepo.findAllByDayAndPopularityGreaterThanEqual(LocalDate.now(), 5);
+
+        //查处今天所有好评商品
+        List<Sales> praises = salesRepo.findAllByDayAndPraiseGreaterThanEqual(LocalDate.now(), 5);
+
+        //插入
+        popularities.forEach(popularity -> into(popularity, Constants.CLASSIFICATION_NAME));
+        praises.forEach(praise -> into(praise, Constants.CLASSIFICATION_NAME));
+
+
+    }
+
+
+    /*
+    插入到商家自定义分类
+     */
+    private void into(Sales sales, String name) {
+        //查找好评热销
+        MerchantClassification merchantClass = merchantClassificationRepo.findByMerchantIdAndName(sales.getId(), name);
+        if (!merchantClass.getIsOpen()) {
+            return;
+        }
+//        Set<Goods> goodsList = merchantClass.getGoodsList();
+//        goodsList.add(sales.getGoods());
+//        merchantClass.setGoodsList(goodsList);
+
+        String goodsId = merchantClass.getGoodsIds();
+        goodsId = goodsId + "," + sales.getGoodsId();
+        merchantClass.setGoodsIds(goodsId);
+
+    }
+
 }
 }

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

@@ -0,0 +1,86 @@
+package com.izouma.dingdong.web;
+
+import com.izouma.dingdong.domain.Appraisal;
+import com.izouma.dingdong.service.AppraisalService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.AppraisalRepo;
+import com.izouma.dingdong.service.merchant.MerchantService;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.security.Security;
+import java.util.List;
+
+@RestController
+@RequestMapping("/appraisal")
+@AllArgsConstructor
+public class AppraisalController extends BaseController {
+    private AppraisalService appraisalService;
+    private AppraisalRepo appraisalRepo;
+    private MerchantService merchantService;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Appraisal save(@RequestBody Appraisal record) {
+        if (record.getId() != null) {
+            Appraisal orig = appraisalRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return appraisalRepo.save(orig);
+        }
+        return appraisalRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<Appraisal> all(PageQuery pageQuery) {
+        return appraisalRepo.findAll(toSpecification(pageQuery, Appraisal.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public Appraisal get(@PathVariable Long id) {
+        return appraisalRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        appraisalRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Appraisal> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @ApiOperation("用户评价")
+    @GetMapping("/userAppraisal")
+    public Appraisal userAppraisal(Appraisal appraisal) {
+        return appraisalService.userAppraisal(appraisal);
+    }
+
+    @ApiOperation("商家回复评价")
+    @GetMapping("/merchantReply")
+    public Appraisal merchantApply(Long id, String reply) {
+        Appraisal appraisal = appraisalRepo.findById(id).orElseThrow(new BusinessException("评价不存在"));
+        appraisal.setMerchantReply(reply);
+        return appraisalRepo.save(appraisal);
+    }
+
+    @ApiOperation("显示商家的所有评价")
+    public List<Appraisal> merchant() {
+        return appraisalRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
+    }
+
+}
+

+ 60 - 0
src/main/java/com/izouma/dingdong/web/OrderGoodsSpecController.java

@@ -0,0 +1,60 @@
+package com.izouma.dingdong.web;
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.service.OrderGoodsSpecService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
+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("/orderGoodsSpec")
+@AllArgsConstructor
+public class OrderGoodsSpecController extends BaseController {
+    private OrderGoodsSpecService orderGoodsSpecService;
+    private OrderGoodsSpecRepo orderGoodsSpecRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public OrderGoodsSpec save(@RequestBody OrderGoodsSpec record) {
+        if (record.getId() != null) {
+            OrderGoodsSpec orig = orderGoodsSpecRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return orderGoodsSpecRepo.save(orig);
+        }
+        return orderGoodsSpecRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<OrderGoodsSpec> all(PageQuery pageQuery) {
+        return orderGoodsSpecRepo.findAll(toSpecification(pageQuery,OrderGoodsSpec.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public OrderGoodsSpec get(@PathVariable Long id) {
+        return orderGoodsSpecRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        orderGoodsSpecRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<OrderGoodsSpec> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 98 - 0
src/main/java/com/izouma/dingdong/web/OrderRefundApplyController.java

@@ -0,0 +1,98 @@
+package com.izouma.dingdong.web;
+
+import com.izouma.dingdong.domain.OrderRefundApply;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.enums.RefundReason;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.OrderRefundApplyRepo;
+import com.izouma.dingdong.service.OrderRefundApplyService;
+import com.izouma.dingdong.service.merchant.MerchantService;
+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.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@AllArgsConstructor
+@RestController
+@RequestMapping("/orderRefundApply")
+public class OrderRefundApplyController extends BaseController {
+    /*generatedStart*/
+    private OrderRefundApplyService orderRefundApplyService;
+
+    private OrderRefundApplyRepo orderRefundApplyRepo;
+
+    private MerchantService merchantService;
+    /*generatedEnd*/
+
+    /*generatedStart*/
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public OrderRefundApply save(@RequestBody OrderRefundApply record) {
+        if (record.getId() != null) {
+            OrderRefundApply orig = orderRefundApplyRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return orderRefundApplyRepo.save(orig);
+        }
+        return orderRefundApplyRepo.save(record);
+    }
+
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<OrderRefundApply> all(PageQuery pageQuery) {
+        return orderRefundApplyRepo.findAll(toSpecification(pageQuery, OrderRefundApply.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public OrderRefundApply get(@PathVariable Long id) {
+        return orderRefundApplyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        orderRefundApplyRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<OrderRefundApply> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+    /*generatedEnd*/
+
+    @GetMapping("/apply")
+    @ApiOperation("申请退款")
+    public void apply(@RequestParam Long orderId, RefundReason reason, String remark) {
+        orderRefundApplyService.apply(orderId, reason, remark);
+    }
+
+    @GetMapping("/audit")
+    public void consent(@RequestParam Long id, @RequestParam Boolean consent) {
+        orderRefundApplyService.audit(id, consent);
+    }
+
+    @GetMapping("/cancel")
+    @ApiOperation("取消退款")
+    public void cancel(Long orderId) {
+        orderRefundApplyService.cancelRefundApply(orderId);
+    }
+
+
+    @GetMapping("/merchant")
+    @ApiOperation("商家退款订单")
+    public List<OrderRefundApply> cancel() {
+        return orderRefundApplyRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
+    }
+
+
+}
+

+ 80 - 0
src/main/java/com/izouma/dingdong/web/merchant/AutomaticResponseController.java

@@ -0,0 +1,80 @@
+package com.izouma.dingdong.web.merchant;
+
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
+import com.izouma.dingdong.service.merchant.MerchantService;
+import com.izouma.dingdong.utils.SecurityUtils;
+import com.izouma.dingdong.web.BaseController;
+import com.izouma.dingdong.domain.merchant.AutomaticResponse;
+import com.izouma.dingdong.service.merchant.AutomaticResponseService;
+import com.izouma.dingdong.dto.PageQuery;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.merchant.AutomaticResponseRepo;
+import com.izouma.dingdong.utils.ObjUtils;
+import com.izouma.dingdong.utils.excel.ExcelUtils;
+
+import io.swagger.annotations.ApiOperation;
+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("/automaticResponse")
+@AllArgsConstructor
+public class AutomaticResponseController extends BaseController {
+    private AutomaticResponseService automaticResponseService;
+    private AutomaticResponseRepo automaticResponseRepo;
+    private MerchantService merchantService;
+    private MerchantRepo merchantRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public AutomaticResponse save(@RequestBody AutomaticResponse record) {
+        if (record.getMerchantId() == null) {
+            //如果商家ID为空
+            record.setMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
+        }
+        merchantRepo.findById(record.getMerchantId()).orElseThrow(new BusinessException("商家不存在"));
+        if (record.getId() != null) {
+            AutomaticResponse orig = automaticResponseRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return automaticResponseRepo.save(orig);
+        }
+        return automaticResponseRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<AutomaticResponse> all(PageQuery pageQuery) {
+        return automaticResponseRepo.findAll(toSpecification(pageQuery, AutomaticResponse.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public AutomaticResponse get(@PathVariable Long id) {
+        return automaticResponseRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        automaticResponseRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<AutomaticResponse> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @ApiOperation("商家下的所有自动回复")
+    @GetMapping("/my")
+    public List<AutomaticResponse> my() {
+        return automaticResponseRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
+    }
+}
+

+ 2 - 0
src/main/java/com/izouma/dingdong/web/merchant/GoodsController.java

@@ -11,6 +11,7 @@ import com.izouma.dingdong.repo.merchant.GoodsRepo;
 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;
@@ -33,6 +34,7 @@ public class GoodsController extends BaseController {
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
+    @ApiOperation("添加修改商品")
     public Goods save(@RequestBody Goods record) {
     public Goods save(@RequestBody Goods record) {
         if (record.getInventory() < 1) {
         if (record.getInventory() < 1) {
             throw new BusinessException("商品供应数量不足");
             throw new BusinessException("商品供应数量不足");

+ 1 - 0
src/main/java/com/izouma/dingdong/web/merchant/GoodsSpecificationController.java

@@ -32,6 +32,7 @@ public class GoodsSpecificationController extends BaseController {
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
+    @ApiOperation("商品规格添加修改")
     public GoodsSpecification save(/*@RequestBody*/ GoodsSpecification record) {
     public GoodsSpecification save(/*@RequestBody*/ GoodsSpecification record) {
         goodsRepo.findById(record.getGoodsId()).orElseThrow(new BusinessException("商品不存在"));
         goodsRepo.findById(record.getGoodsId()).orElseThrow(new BusinessException("商品不存在"));
         if (record.getId() != null) {
         if (record.getId() != null) {

+ 15 - 4
src/main/java/com/izouma/dingdong/web/merchant/MerchantClassificationController.java

@@ -1,5 +1,7 @@
 package com.izouma.dingdong.web.merchant;
 package com.izouma.dingdong.web.merchant;
 
 
+import com.izouma.dingdong.service.merchant.MerchantService;
+import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
 import com.izouma.dingdong.domain.merchant.MerchantClassification;
 import com.izouma.dingdong.service.merchant.MerchantClassificationService;
 import com.izouma.dingdong.service.merchant.MerchantClassificationService;
@@ -9,6 +11,7 @@ import com.izouma.dingdong.repo.merchant.MerchantClassificationRepo;
 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;
@@ -25,23 +28,28 @@ import java.util.List;
 public class MerchantClassificationController extends BaseController {
 public class MerchantClassificationController extends BaseController {
     private MerchantClassificationService merchantClassificationService;
     private MerchantClassificationService merchantClassificationService;
     private MerchantClassificationRepo merchantClassificationRepo;
     private MerchantClassificationRepo merchantClassificationRepo;
+    private MerchantService merchantService;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     @PostMapping("/save")
+    @ApiOperation("商家添加修改分类")
     public MerchantClassification save(@RequestBody MerchantClassification record) {
     public MerchantClassification save(@RequestBody MerchantClassification record) {
+        //修改
         if (record.getId() != null) {
         if (record.getId() != null) {
             MerchantClassification orig = merchantClassificationRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             MerchantClassification orig = merchantClassificationRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             ObjUtils.merge(orig, record);
             ObjUtils.merge(orig, record);
             return merchantClassificationRepo.save(orig);
             return merchantClassificationRepo.save(orig);
         }
         }
-        return merchantClassificationRepo.save(record);
+        //添加
+        return merchantClassificationService.add(SecurityUtils.getAuthenticatedUser().getId(), record);
+        //return merchantClassificationRepo.save(record);
     }
     }
 
 
 
 
     //@PreAuthorize("hasRole('ADMIN')")
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
     @GetMapping("/all")
     public Page<MerchantClassification> all(PageQuery pageQuery) {
     public Page<MerchantClassification> all(PageQuery pageQuery) {
-        return merchantClassificationRepo.findAll(toSpecification(pageQuery,MerchantClassification.class), toPageRequest(pageQuery));
+        return merchantClassificationRepo.findAll(toSpecification(pageQuery, MerchantClassification.class), toPageRequest(pageQuery));
     }
     }
 
 
     @GetMapping("/get/{id}")
     @GetMapping("/get/{id}")
@@ -62,10 +70,13 @@ public class MerchantClassificationController extends BaseController {
     }
     }
 
 
     @GetMapping("/my")
     @GetMapping("/my")
-    public List<MerchantClassification> my(Long id){
-        List<MerchantClassification> merchantClassifications = merchantClassificationRepo.findAllByMerchantId(id);
+    @ApiOperation("商户下的分类名称")
+    public List<MerchantClassification> my() {
+        List<MerchantClassification> merchantClassifications = merchantClassificationRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
         merchantClassifications.sort(Comparator.comparing(MerchantClassification::getSort));
         merchantClassifications.sort(Comparator.comparing(MerchantClassification::getSort));
         return merchantClassifications;
         return merchantClassifications;
     }
     }
+
+
 }
 }
 
 

+ 3 - 3
src/main/resources/application.yaml

@@ -70,10 +70,10 @@ aliyun:
     access-key-id: PXzJyah5rZfWHIIH
     access-key-id: PXzJyah5rZfWHIIH
     access-key-secret: e1MS6j0wypXJrw8CM0hObZu8qKbfah
     access-key-secret: e1MS6j0wypXJrw8CM0hObZu8qKbfah
     oss-end-point: oss-cn-hangzhou.aliyuncs.com
     oss-end-point: oss-cn-hangzhou.aliyuncs.com
-    oss-bucket-name: ticket-exchange
-    oss-domain: https://ticket-exchange.oss-cn-hangzhou.aliyuncs.com
+    oss-bucket-name: dingdong
+    oss-domain: https://dingdong.oss-cn-hangzhou.aliyuncs.com
 general:
 general:
-    host: http://art.izouma.com
+    host: http://dingdong.izouma.com
 ---
 ---
 
 
 spring:
 spring:

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

@@ -0,0 +1 @@
+{"tableName":"AutomaticResponse","className":"AutomaticResponse","remark":"商家自动回复","genTable":true,"genClass":true,"genList":false,"genForm":false,"genRouter":false,"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":"merchantId","modelName":"merchantId","remark":"商户ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"context","modelName":"context","remark":"自动回复内容","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.merchant.AutomaticResponse","genPackage":"merchant"}

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

@@ -0,0 +1 @@
+{"tableName":"OrderGoodsSpec","className":"OrderGoodsSpec","remark":"订单商品规格","genTable":true,"genClass":true,"genList":false,"genForm":false,"genRouter":false,"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":"orderId","modelName":"orderId","remark":"订单ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"goodsId","modelName":"goodsId","remark":"商品ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"specification","modelName":"specification","remark":"规格","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"num","modelName":"num","remark":"数量","showInList":true,"showInForm":true,"formType":"number"},{"name":"goodsPrice","modelName":"goodsPrice","remark":"商品价格","showInList":true,"showInForm":true,"formType":"number"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.OrderGoodsSpec"}

+ 77 - 77
src/main/vue/package-lock.json

@@ -4675,8 +4675,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "delegates": "1.0.0",
-            "readable-stream": "2.3.6"
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
           }
           }
         },
         },
         "balanced-match": {
         "balanced-match": {
@@ -4691,7 +4691,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "balanced-match": "1.0.0",
+            "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
             "concat-map": "0.0.1"
           }
           }
         },
         },
@@ -4731,7 +4731,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "ms": "2.1.1"
+            "ms": "^2.1.1"
           }
           }
         },
         },
         "deep-extend": {
         "deep-extend": {
@@ -4758,7 +4758,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "minipass": "2.3.5"
+            "minipass": "^2.2.1"
           }
           }
         },
         },
         "fs.realpath": {
         "fs.realpath": {
@@ -4773,14 +4773,14 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "aproba": "1.2.0",
-            "console-control-strings": "1.1.0",
-            "has-unicode": "2.0.1",
-            "object-assign": "4.1.1",
-            "signal-exit": "3.0.2",
-            "string-width": "1.0.2",
-            "strip-ansi": "3.0.1",
-            "wide-align": "1.1.3"
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
           }
           }
         },
         },
         "glob": {
         "glob": {
@@ -4789,12 +4789,12 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "fs.realpath": "1.0.0",
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
           }
         },
         },
         "has-unicode": {
         "has-unicode": {
@@ -4809,7 +4809,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "safer-buffer": "2.1.2"
+            "safer-buffer": ">= 2.1.2 < 3"
           }
           }
         },
         },
         "ignore-walk": {
         "ignore-walk": {
@@ -4818,7 +4818,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "minimatch": "3.0.4"
+            "minimatch": "^3.0.4"
           }
           }
         },
         },
         "inflight": {
         "inflight": {
@@ -4827,8 +4827,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "once": "1.4.0",
-            "wrappy": "1.0.2"
+            "once": "^1.3.0",
+            "wrappy": "1"
           }
           }
         },
         },
         "inherits": {
         "inherits": {
@@ -4849,7 +4849,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "number-is-nan": "1.0.1"
+            "number-is-nan": "^1.0.0"
           }
           }
         },
         },
         "isarray": {
         "isarray": {
@@ -4864,7 +4864,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "brace-expansion": "1.1.11"
+            "brace-expansion": "^1.1.7"
           }
           }
         },
         },
         "minimist": {
         "minimist": {
@@ -4879,8 +4879,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "safe-buffer": "5.1.2",
-            "yallist": "3.0.3"
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
           }
           }
         },
         },
         "minizlib": {
         "minizlib": {
@@ -4889,7 +4889,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "minipass": "2.3.5"
+            "minipass": "^2.2.1"
           }
           }
         },
         },
         "mkdirp": {
         "mkdirp": {
@@ -4913,9 +4913,9 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "debug": "4.1.1",
-            "iconv-lite": "0.4.24",
-            "sax": "1.2.4"
+            "debug": "^4.1.0",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
           }
           }
         },
         },
         "node-pre-gyp": {
         "node-pre-gyp": {
@@ -4924,16 +4924,16 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "detect-libc": "1.0.3",
-            "mkdirp": "0.5.1",
-            "needle": "2.3.0",
-            "nopt": "4.0.1",
-            "npm-packlist": "1.4.1",
-            "npmlog": "4.1.2",
-            "rc": "1.2.8",
-            "rimraf": "2.6.3",
-            "semver": "5.7.0",
-            "tar": "4.4.8"
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
           }
           }
         },
         },
         "nopt": {
         "nopt": {
@@ -4942,8 +4942,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "abbrev": "1.1.1",
-            "osenv": "0.1.5"
+            "abbrev": "1",
+            "osenv": "^0.1.4"
           }
           }
         },
         },
         "npm-bundled": {
         "npm-bundled": {
@@ -4958,8 +4958,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "ignore-walk": "3.0.1",
-            "npm-bundled": "1.0.6"
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
           }
           }
         },
         },
         "npmlog": {
         "npmlog": {
@@ -4968,10 +4968,10 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "are-we-there-yet": "1.1.5",
-            "console-control-strings": "1.1.0",
-            "gauge": "2.7.4",
-            "set-blocking": "2.0.0"
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
           }
           }
         },
         },
         "number-is-nan": {
         "number-is-nan": {
@@ -4992,7 +4992,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "wrappy": "1.0.2"
+            "wrappy": "1"
           }
           }
         },
         },
         "os-homedir": {
         "os-homedir": {
@@ -5013,8 +5013,8 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "os-homedir": "1.0.2",
-            "os-tmpdir": "1.0.2"
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
           }
           }
         },
         },
         "path-is-absolute": {
         "path-is-absolute": {
@@ -5035,10 +5035,10 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "deep-extend": "0.6.0",
-            "ini": "1.3.5",
-            "minimist": "1.2.0",
-            "strip-json-comments": "2.0.1"
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
           },
           },
           "dependencies": {
           "dependencies": {
             "minimist": {
             "minimist": {
@@ -5055,13 +5055,13 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "core-util-is": "1.0.2",
-            "inherits": "2.0.3",
-            "isarray": "1.0.0",
-            "process-nextick-args": "2.0.0",
-            "safe-buffer": "5.1.2",
-            "string_decoder": "1.1.1",
-            "util-deprecate": "1.0.2"
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
           }
           }
         },
         },
         "rimraf": {
         "rimraf": {
@@ -5070,7 +5070,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "glob": "7.1.3"
+            "glob": "^7.1.3"
           }
           }
         },
         },
         "safe-buffer": {
         "safe-buffer": {
@@ -5115,9 +5115,9 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "code-point-at": "1.1.0",
-            "is-fullwidth-code-point": "1.0.0",
-            "strip-ansi": "3.0.1"
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
           }
           }
         },
         },
         "string_decoder": {
         "string_decoder": {
@@ -5126,7 +5126,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "safe-buffer": "5.1.2"
+            "safe-buffer": "~5.1.0"
           }
           }
         },
         },
         "strip-ansi": {
         "strip-ansi": {
@@ -5135,7 +5135,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "ansi-regex": "2.1.1"
+            "ansi-regex": "^2.0.0"
           }
           }
         },
         },
         "strip-json-comments": {
         "strip-json-comments": {
@@ -5150,13 +5150,13 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "chownr": "1.1.1",
-            "fs-minipass": "1.2.5",
-            "minipass": "2.3.5",
-            "minizlib": "1.2.1",
-            "mkdirp": "0.5.1",
-            "safe-buffer": "5.1.2",
-            "yallist": "3.0.3"
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
           }
           }
         },
         },
         "util-deprecate": {
         "util-deprecate": {
@@ -5171,7 +5171,7 @@
           "dev": true,
           "dev": true,
           "optional": true,
           "optional": true,
           "requires": {
           "requires": {
-            "string-width": "1.0.2"
+            "string-width": "^1.0.2 || 2"
           }
           }
         },
         },
         "wrappy": {
         "wrappy": {

+ 1 - 1
src/main/vue/public/index.html

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
 <!DOCTYPE html>
-<html lang="en">
+<html lang="zh-cmn-Hans">
   <head>
   <head>
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">

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

@@ -66,7 +66,7 @@ const router = new Router({
                 {
                 {
                     path: '/merchantEdit',
                     path: '/merchantEdit',
                     name: 'MerchantEdit',
                     name: 'MerchantEdit',
-                    component: () => import(/* webpackChunkName: "merchantEdit" */ '@/views/MerchantEdit.vue'),
+                    component: () => import(/* webpackChunkName: "merchantEdit" */ '@/views/merchant/MerchantEdit.vue'),
                     meta: {
                     meta: {
                        title: '商户编辑',
                        title: '商户编辑',
                     },
                     },
@@ -74,7 +74,7 @@ const router = new Router({
                 {
                 {
                     path: '/merchantList',
                     path: '/merchantList',
                     name: 'MerchantList',
                     name: 'MerchantList',
-                    component: () => import(/* webpackChunkName: "merchantList" */ '@/views/MerchantList.vue'),
+                    component: () => import(/* webpackChunkName: "merchantList" */ '@/views/merchant/MerchantList.vue'),
                     meta: {
                     meta: {
                        title: '商户',
                        title: '商户',
                     },
                     },
@@ -174,6 +174,22 @@ const router = new Router({
                     meta: {
                     meta: {
                        title: '优惠券',
                        title: '优惠券',
                     },
                     },
+               },
+                {
+                    path: '/appraisalEdit',
+                    name: 'AppraisalEdit',
+                    component: () => import(/* webpackChunkName: "appraisalEdit" */ '@/views/AppraisalEdit.vue'),
+                    meta: {
+                       title: '评价表编辑',
+                    },
+                },
+                {
+                    path: '/appraisalList',
+                    name: 'AppraisalList',
+                    component: () => import(/* webpackChunkName: "appraisalList" */ '@/views/AppraisalList.vue'),
+                    meta: {
+                       title: '评价表',
+                    },
                }
                }
                 /**INSERT_LOCATION**/,
                 /**INSERT_LOCATION**/,
                 {
                 {

+ 117 - 0
src/main/vue/src/views/AppraisalEdit.vue

@@ -0,0 +1,117 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="108px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="orderId" label="订单号">
+                            <el-input-number type="number" v-model="formData.orderId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="img" label="图片">
+                            <el-input v-model="formData.img"></el-input>
+                </el-form-item>
+                <el-form-item prop="goodsLike" label="商品评分">
+                            <el-input-number type="number" v-model="formData.goodsLike"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="goodsBad" label="商品评分">
+                            <el-input-number type="number" v-model="formData.goodsBad"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="goodsAppraise" label="商品评价">
+                            <el-input v-model="formData.goodsAppraise"></el-input>
+                </el-form-item>
+                <el-form-item prop="riderScore" label="骑手评分">
+                            <el-input-number type="number" v-model="formData.riderScore"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="riderAppraise" label="骑手评价">
+                            <el-input v-model="formData.riderAppraise"></el-input>
+                </el-form-item>
+                <el-form-item prop="merchantReply" label="商家回复评价">
+                            <el-input v-model="formData.merchantReply"></el-input>
+                </el-form-item>
+                <el-form-item prop="appraiseTime" label="评价日期">
+                            <el-date-picker
+                                    v-model="formData.appraiseTime"
+                                    type="datetime"
+                                    value-format="yyyy-MM-dd HH:mm:ss"
+                                    placeholder="选择日期时间">
+                            </el-date-picker>
+                </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'AppraisalEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('appraisal/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('/appraisal/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(`/appraisal/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>

+ 189 - 0
src/main/vue/src/views/AppraisalList.vue

@@ -0,0 +1,189 @@
+<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="orderId" label="订单号"
+>
+                    </el-table-column>
+                    <el-table-column prop="img" label="图片"
+>
+                    </el-table-column>
+                    <el-table-column prop="goodsLike" label="商品评分"
+>
+                    </el-table-column>
+                    <el-table-column prop="goodsBad" label="商品评分"
+>
+                    </el-table-column>
+                    <el-table-column prop="goodsAppraise" label="商品评价"
+>
+                    </el-table-column>
+                    <el-table-column prop="riderScore" label="骑手评分"
+>
+                    </el-table-column>
+                    <el-table-column prop="riderAppraise" label="骑手评价"
+>
+                    </el-table-column>
+                    <el-table-column prop="merchantReply" label="商家回复评价"
+>
+                    </el-table-column>
+                    <el-table-column prop="appraiseTime" label="评价日期"
+                            :formatter="datetimeFormatter"
+>
+                    </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: 'AppraisalList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/appraisal/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: "/appraisalEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/appraisalEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/appraisal/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(`/appraisal/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>

+ 25 - 20
src/main/vue/src/views/SalesEdit.vue

@@ -2,23 +2,30 @@
     <div class="edit-view">
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
         <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
                  style="max-width: 500px;">
                  style="max-width: 500px;">
-                <el-form-item prop="goodsId" label="商品ID">
-                            <el-input-number type="number" v-model="formData.goodsId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="daySales" label="销售数量">
-                            <el-input-number type="number" v-model="formData.daySales"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="day" label="日期">
-                            <el-date-picker
-                                    v-model="formData.day"
-                                    type="date"
-                                    value-format="yyyy-MM-dd"
-                                    placeholder="选择日期">
-                            </el-date-picker>
-                </el-form-item>
+            <el-form-item prop="goodsId" label="商品ID">
+                <el-input-number type="number" v-model="formData.goodsId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="daySales" label="销售数量">
+                <el-input-number type="number" v-model="formData.daySales"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="dayLikes" label="每日点赞">
+                <el-input-number type="number" v-model="formData.dayLikes"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="dayBad" label="每日差评">
+                <el-input-number type="number" v-model="formData.datBad"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="day" label="日期">
+                <el-date-picker
+                        v-model="formData.day"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择日期">
+                </el-date-picker>
+            </el-form-item>
             <el-form-item>
             <el-form-item>
                 <el-button @click="onSave" :loading="saving"
                 <el-button @click="onSave" :loading="saving"
-                           type="primary">保存</el-button>
+                           type="primary">保存
+                </el-button>
                 <el-button @click="onDelete" :loading="saving"
                 <el-button @click="onDelete" :loading="saving"
                            type="danger" v-if="formData.id">删除
                            type="danger" v-if="formData.id">删除
                 </el-button>
                 </el-button>
@@ -33,7 +40,7 @@
         created() {
         created() {
             if (this.$route.query.id) {
             if (this.$route.query.id) {
                 this.$http
                 this.$http
-                    .get('sales/get/'+this.$route.query.id)
+                    .get('sales/get/' + this.$route.query.id)
                     .then(res => {
                     .then(res => {
                         this.formData = res;
                         this.formData = res;
                     })
                     })
@@ -46,10 +53,8 @@
         data() {
         data() {
             return {
             return {
                 saving: false,
                 saving: false,
-                formData: {
-                },
-                rules: {
-                },
+                formData: {},
+                rules: {},
             }
             }
         },
         },
         methods: {
         methods: {

+ 23 - 17
src/main/vue/src/views/SalesList.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>
@@ -23,16 +23,22 @@
             </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="goodsId" label="商品ID"
->
-                    </el-table-column>
-                    <el-table-column prop="daySales" label="销售数量"
->
-                    </el-table-column>
-                    <el-table-column prop="day" label="日期"
-                            :formatter="dateFormatter"
->
-                    </el-table-column>
+            <el-table-column prop="goodsId" label="商品ID"
+            >
+            </el-table-column>
+            <el-table-column prop="daySales" label="销售数量"
+            >
+            </el-table-column>
+            <el-table-column prop="dayLikes" label="每日点赞"
+            >
+            </el-table-column>
+             <el-table-column prop="dayBad" label="每日差评"
+            >
+            </el-table-column>
+            <el-table-column prop="day" label="日期"
+                             :formatter="dateFormatter"
+            >
+            </el-table-column>
             <el-table-column
             <el-table-column
                     label="操作"
                     label="操作"
                     align="center"
                     align="center"
@@ -64,7 +70,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 {
@@ -89,7 +95,7 @@
         methods: {
         methods: {
             beforeGetData() {
             beforeGetData() {
                 if (this.search) {
                 if (this.search) {
-                    return { search: this.search };
+                    return {search: this.search};
                 }
                 }
             },
             },
             toggleMultipleMode(multipleMode) {
             toggleMultipleMode(multipleMode) {
@@ -102,7 +108,7 @@
                 this.$router.push({
                 this.$router.push({
                     path: "/salesEdit",
                     path: "/salesEdit",
                     query: {
                     query: {
-                    ...this.$route.query
+                        ...this.$route.query
                     }
                     }
                 });
                 });
             },
             },
@@ -110,16 +116,16 @@
                 this.$router.push({
                 this.$router.push({
                     path: "/salesEdit",
                     path: "/salesEdit",
                     query: {
                     query: {
-                    id: row.id
+                        id: row.id
                     }
                     }
                 });
                 });
             },
             },
             download() {
             download() {
                 this.downloading = true;
                 this.downloading = true;
                 this.$axios
                 this.$axios
-                    .get("/sales/excel", { 
+                    .get("/sales/excel", {
                         responseType: "blob",
                         responseType: "blob",
-                        params: { size: 10000 }
+                        params: {size: 10000}
                     })
                     })
                     .then(res => {
                     .then(res => {
                         console.log(res);
                         console.log(res);

+ 0 - 0
src/main/vue/src/views/MerchantEdit.vue → src/main/vue/src/views/merchant/MerchantEdit.vue


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


+ 27 - 0
src/test/java/com/izouma/dingdong/repo/SalesRepoTest.java

@@ -0,0 +1,27 @@
+package com.izouma.dingdong.repo;
+
+import com.izouma.dingdong.domain.merchant.Sales;
+import com.izouma.dingdong.repo.merchant.SalesRepo;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SalesRepoTest {
+    @Autowired
+    private SalesRepo salesRepo;
+
+    @Test
+    public void testRenqi() {
+//        List<Sales> sales = salesRepo.findByGoodsIdAndPopularityGreaterThanEqual(57L, 5);
+
+//        System.out.println(salesRepo.findByGoodsIdAndDayAndPopularityGreaterThanEqual(57l, LocalDate.now().plusDays(-1), 5));
+
+    }
+}