Quellcode durchsuchen

推荐商家/发送美食/配送费设置

licailing vor 5 Jahren
Ursprung
Commit
1ac288323b
31 geänderte Dateien mit 982 neuen und 325 gelöschten Zeilen
  1. 1 9
      src/main/java/com/izouma/dingdong/domain/Appraisal.java
  2. 62 0
      src/main/java/com/izouma/dingdong/domain/backstage/DeliveryFee.java
  3. 13 3
      src/main/java/com/izouma/dingdong/domain/backstage/Tag.java
  4. 0 6
      src/main/java/com/izouma/dingdong/domain/merchant/Goods.java
  5. 10 20
      src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java
  6. 1 9
      src/main/java/com/izouma/dingdong/domain/merchant/MerchantSettings.java
  7. 4 3
      src/main/java/com/izouma/dingdong/dto/FilterDTO.java
  8. 10 2
      src/main/java/com/izouma/dingdong/dto/MerchantDTO.java
  9. 23 0
      src/main/java/com/izouma/dingdong/enums/DeliveryType.java
  10. 3 0
      src/main/java/com/izouma/dingdong/repo/UserRepo.java
  11. 16 0
      src/main/java/com/izouma/dingdong/repo/backstage/DeliveryFeeRepo.java
  12. 8 0
      src/main/java/com/izouma/dingdong/repo/backstage/TagRepo.java
  13. 4 1
      src/main/java/com/izouma/dingdong/repo/merchant/SalesRepo.java
  14. 15 7
      src/main/java/com/izouma/dingdong/service/UserService.java
  15. 14 0
      src/main/java/com/izouma/dingdong/service/backstage/DeliveryFeeService.java
  16. 71 107
      src/main/java/com/izouma/dingdong/service/merchant/GoodsService.java
  17. 11 17
      src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java
  18. 250 127
      src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java
  19. 8 6
      src/main/java/com/izouma/dingdong/service/merchant/SalesService.java
  20. 1 0
      src/main/java/com/izouma/dingdong/web/AppraisalController.java
  21. 1 1
      src/main/java/com/izouma/dingdong/web/backstage/CategoryController.java
  22. 66 0
      src/main/java/com/izouma/dingdong/web/backstage/DeliveryFeeController.java
  23. 7 2
      src/main/java/com/izouma/dingdong/web/merchant/GoodsController.java
  24. 22 2
      src/main/java/com/izouma/dingdong/web/merchant/MerchantSettingsController.java
  25. 1 0
      src/main/resources/genjson/DeliveryFee.json
  26. 16 0
      src/main/vue/src/router.js
  27. 118 0
      src/main/vue/src/views/DeliveryFeeEdit.vue
  28. 196 0
      src/main/vue/src/views/DeliveryFeeList.vue
  29. 26 0
      src/test/java/com/izouma/dingdong/repo/TagRepoTest.java
  30. 3 2
      src/test/java/com/izouma/dingdong/service/AppraisalServiceTest.java
  31. 1 1
      src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java

+ 1 - 9
src/main/java/com/izouma/dingdong/domain/Appraisal.java

@@ -23,7 +23,7 @@ public class Appraisal extends BaseEntity {
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
 
-    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
+    @ApiModelProperty(value = "骑手工号", name = "riderId")
     private Long riderId;
 
     @ApiModelProperty(value = "图片", name = "img")
@@ -37,11 +37,6 @@ public class Appraisal extends BaseEntity {
     @ApiModelProperty(value = "商品评分", name = "goodsScore")
     private Boolean goodsLike = true ;
 
-/*    @Builder.Default
-    @Column(nullable = false)
-    @ApiModelProperty(value = "商品评分", name = "goodsScore")
-    private Boolean goodsBad = false;*/
-
     @ApiModelProperty(value = "商品评价", name = "goodsAppraise")
     private String goodsAppraise;
 
@@ -51,9 +46,6 @@ public class Appraisal extends BaseEntity {
     @ApiModelProperty(value = "骑手评分", name = "riderScore")
     private Integer riderLike;
 
-//    @ApiModelProperty(value = "骑手评分", name = "riderScore")
-//    private Integer riderBad;
-
     @ApiModelProperty(value = "骑手评价", name = "riderAppraise")
     private String riderAppraise;
 

+ 62 - 0
src/main/java/com/izouma/dingdong/domain/backstage/DeliveryFee.java

@@ -0,0 +1,62 @@
+package com.izouma.dingdong.domain.backstage;
+
+import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.enums.DeliveryType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "配送费", description = "配送费")
+@Where(clause = "enabled = 1")
+public class DeliveryFee extends BaseEntity {
+
+    //类型
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "类型", name = "type")
+    private DeliveryType type;
+    //规则
+    @ApiModelProperty(value = "规则", name = "rule")
+    private String rule;
+
+    @ApiModelProperty(value = "规则单位", name = "ruleUnit")
+    private String ruleUnit;
+    //值
+    @ApiModelProperty(value = "值", name = "value")
+    private Integer value;
+
+    @ApiModelProperty(value = "值单位", name = "valueUnit")
+    private String valueUnit;
+    //描述
+    @ApiModelProperty(value = "描述", name = "description")
+    private String description;
+    //多值
+    @ApiModelProperty(value = "可多值", name = "multivalued")
+    private Boolean multivalued;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+    /*
+    基础费  基础距离  超出公里  添加费用  繁忙系数                 时间系数     配送件数
+     10      1       1        10      时间 10分钟              8-23   1    几件+1
+                                      订单量 10  繁忙系数 1     23-8   2
+                                      订单量 20  繁忙系数 2
+                                      订单量 30  繁忙系数 3
+                                      ...
+     */
+
+
+}

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

@@ -10,6 +10,7 @@ import lombok.NoArgsConstructor;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.Id;
 import javax.validation.constraints.Size;
 
 @Data
@@ -18,12 +19,21 @@ import javax.validation.constraints.Size;
 @NoArgsConstructor
 @Builder
 @ApiModel(value = "商户标签", description = "商户标签")
-public class Tag extends BaseEntity {
+public class Tag {
+
+    //口碑联盟 1
+    //明星商家 2
+    //新商家 3
+    @Id
+    private Long id;
+
     @Size(max = 30)
     @Column(length = 30)
     @ApiModelProperty(value = "标签名称", name = "name")
     private String name;
-    //口碑联盟
+    //口碑联盟 新商家 明星商家
+
+   // private String description;
 
-   // private
+    private Boolean enabled = true;
 }

+ 0 - 6
src/main/java/com/izouma/dingdong/domain/merchant/Goods.java

@@ -50,9 +50,6 @@ public class Goods extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "销量", name = "sales")
     private Integer totalSales;
 
-//    @ApiModelProperty(value = "日销售额", name = "daySales")
-//    private Integer daySales;
-
     @ApiModelProperty(value = "点赞数量", name = "likes")
     private Integer likes;
 
@@ -71,9 +68,6 @@ public class Goods extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "下架", name = "takeOff")
     private Boolean takeOff;
 
-//    @ApiModelProperty(value = "排布", name = "sort")
-//    private Integer sort;
-
     @ApiModelProperty(value = "是否参与满减", name = "isFullReduction")
     private Boolean isFullReduction;
 

+ 10 - 20
src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java

@@ -46,12 +46,6 @@ public class Merchant extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "商户地址", name = "address")
     private String address;
 
-//    @ApiModelProperty(value = "图片", name = "img")
-//    private String img;
-
-//    @ApiModelProperty(value = "横幅", name = "banner")
-//    private String banner;
-
     @Builder.Default
     @Column(nullable = false)
     @ApiModelProperty(value = "黑名单", name = "blacklist")
@@ -69,13 +63,13 @@ public class Merchant extends BaseEntity implements Serializable {
     private String aliAccount;
 
     @ApiModelProperty(value = "总好评数量", name = "goodNum")
-    private Integer goodNum = 0;
+    private Integer goodNum;
 
     @ApiModelProperty(value = "差评数量", name = "badNum")
-    private Integer badNum = 0;
+    private Integer badNum;
 
     @ApiModelProperty(value = "月销", name = "monthSales")
-    private Integer monthSales = 0;
+    private Integer monthSales;
 
     @ApiModelProperty(value = "通过", name = "isPass")
     private Boolean isPass;
@@ -87,9 +81,6 @@ public class Merchant extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "成立时间", name = "established")
     private LocalDateTime establishTime;
 
-//    @ApiModelProperty(value = "商家余额",name = "money")
-//    private BigDecimal money;
-
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)
     @JoinColumn(name = "userId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     private User user;
@@ -105,12 +96,11 @@ public class Merchant extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "推广语", name = "promo")
     private String promo;
 
-/*    @ApiModelProperty(value = "实名信息ID",name = "verifiedId")
-    private Long verifiedId;
-
-    @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.DETACH)
-    @JoinColumn(name = "verifiedId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    private Verified verified;*/
-
-
+    /**
+     * 都不是 0
+     * 新商家 1
+     * 明星商家 2
+     */
+    @ApiModelProperty(value = "商家标签", name = "tag")
+    private Integer tag;
 }

+ 1 - 9
src/main/java/com/izouma/dingdong/domain/merchant/MerchantSettings.java

@@ -65,15 +65,6 @@ public class MerchantSettings extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "经营品类", name = "category")
     private Set<Category> category = new HashSet<>();
 
-/*    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH})
-    @JoinTable(
-            name = "merchant_tag",
-            joinColumns = {@JoinColumn(name = "mer_id", referencedColumnName = "id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))},
-            inverseJoinColumns = {@JoinColumn(name = "tag_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "none", value = ConstraintMode.NO_CONSTRAINT))})
-    @BatchSize(size = 20)
-    @ApiModelProperty(value = "标签", name = "tag")
-    private Set<Tag> tag;*/
-
     @ApiModelProperty(value = "周几", name = "week")
     private String week;
 
@@ -121,4 +112,5 @@ public class MerchantSettings extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "优先级", name = "priority")
     private Integer priority;
+
 }

+ 4 - 3
src/main/java/com/izouma/dingdong/dto/FilterDTO.java

@@ -20,18 +20,19 @@ public class FilterDTO {
     折扣商家 3
     下单返红包 4
     可用红包 5
+    可多选
     */
-    private Integer filter;
+    private String filter;
     /*
     商家标签
     新商家 1
     明星商家 2
     */
-    private Integer tag;
+    private String tag;
     /*
     商家性质
     */
-    private Long natureId;
+    private String natureId;
     /*
     人均范围 start-end
     */

+ 10 - 2
src/main/java/com/izouma/dingdong/dto/MerchantDTO.java

@@ -48,7 +48,6 @@ public class MerchantDTO implements Serializable {
         qualification = merchantSettings.getQualification();
         showName = merchant.getShowName();
         startTime = merchantSettings.getStartTime();
-        //tag = merchantSettings.getTag();
         isPass = merchant.getIsPass();
         status = merchant.getStatus();
         establishTime = merchant.getEstablishTime();
@@ -68,6 +67,7 @@ public class MerchantDTO implements Serializable {
         monthSales = merchant.getMonthSales();
         goodNum = merchant.getGoodNum();
         badNum = merchant.getBadNum();
+        tag = merchant.getTag();
     }
 
     //包含距离
@@ -90,7 +90,6 @@ public class MerchantDTO implements Serializable {
         qualification = merchantSettings.getQualification();
         showName = merchant.getShowName();
         startTime = merchantSettings.getStartTime();
-        //tag = merchantSettings.getTag();
         isPass = merchant.getIsPass();
         status = merchant.getStatus();
         establishTime = merchant.getEstablishTime();
@@ -112,6 +111,7 @@ public class MerchantDTO implements Serializable {
         priority = merchantSettings.getPriority();
         goodNum = merchant.getGoodNum();
         badNum = merchant.getBadNum();
+        tag = merchant.getTag();
     }
 
     private Long mid;
@@ -256,4 +256,12 @@ public class MerchantDTO implements Serializable {
 
     @ApiModelProperty(value = "差评数量", name = "badNum")
     private Integer badNum;
+
+    /**
+     * 都不是 0
+     * 新商家 1
+     * 明星商家 2
+     */
+    @ApiModelProperty(value = "商家标签",name = "tag")
+    private Integer tag;
 }

+ 23 - 0
src/main/java/com/izouma/dingdong/enums/DeliveryType.java

@@ -0,0 +1,23 @@
+package com.izouma.dingdong.enums;
+
+public enum DeliveryType {
+    BASE_FEE("起送距离和费用"),
+    //BASE_DISTANCE("基础距离"),
+    //OVER_DISTANCE("超出距离"),
+    EXCESS_COST("超出距离和费用"),
+    BUSYNESS_FACTOR("繁忙系数"),
+    BUSY_MINUTES("繁忙分钟"),
+    TIME_COEFFICIENT("时间段系数"),
+    NUMBER_OF_DELIVERY("配送件数"),
+    ;
+
+    private String description;
+
+    DeliveryType(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

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

@@ -21,6 +21,8 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
     User findByPhone(String phone);
 
+    User findByPhoneAndIdentity(String phone, Identity identity);
+
     @Query("update User t set t.enabled = false where t.id = ?1")
     @Modifying
     @Transactional
@@ -32,6 +34,7 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
 
     /**
      * 按身份查找,且不在黑名单
+     *
      * @param identity 身份
      * @return 用户列表
      */

+ 16 - 0
src/main/java/com/izouma/dingdong/repo/backstage/DeliveryFeeRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.dingdong.repo.backstage;
+
+import com.izouma.dingdong.domain.backstage.DeliveryFee;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface DeliveryFeeRepo extends JpaRepository<DeliveryFee, Long>, JpaSpecificationExecutor<DeliveryFee> {
+    @Query("update DeliveryFee t set t.enabled = false where t.id = ?1")
+    @Modifying
+    @Transactional
+    void deleteById(Long id);
+}

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

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

+ 4 - 1
src/main/java/com/izouma/dingdong/repo/merchant/SalesRepo.java

@@ -12,9 +12,12 @@ public interface SalesRepo extends JpaRepository<Sales, Long>, JpaSpecificationE
 
     List<Sales> findAllByGoodsId(Long goodsId);
 
-    //查找商品天的销量
+    //查找商品天的销量
     Sales findByGoodsIdAndDay(Long goodsId, LocalDate day);
 
+    //查找商户当天的销量
+    Sales findByMerchantIdAndDay(Long merchantId, LocalDate day);
+
     //找出时间段内销量
     List<Sales> findAllByGoodsIdAndDayBetween(Long goodsId, LocalDate start, LocalDate end);
 

+ 15 - 7
src/main/java/com/izouma/dingdong/service/UserService.java

@@ -101,14 +101,22 @@ public class UserService {
                     .avatar(Constants.DEFAULT_AVATAR)
                     .build();
 
-        } /*else {
-            if (MERCHANT.equals(user.getIdentity())){
-                throw new BusinessException("请使用商户端登陆");
-            }else if (RIDER.equals(user.getIdentity())){
-                throw new BusinessException("请使用骑手端登陆");
-            }
-        }*/
+        }
+        return user;
+    }
 
+    public User loginByPhoneAndIdentity(String phone, Identity identity) {
+        User user = userRepo.findByPhoneAndIdentity(phone, identity);
+        if (user == null) {
+            user = User.builder()
+                    .username(UUID.randomUUID().toString())
+                    .nickname(phone)
+                    .phone(phone)
+                    .identity(identity)
+                    .enabled(true)
+                    .avatar(Constants.DEFAULT_AVATAR)
+                    .build();
+        }
         return user;
     }
 

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

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.backstage;
+
+import com.izouma.dingdong.domain.backstage.DeliveryFee;
+import com.izouma.dingdong.repo.backstage.DeliveryFeeRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class DeliveryFeeService {
+
+    private DeliveryFeeRepo deliveryFeeRepo;
+
+}

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

@@ -1,21 +1,21 @@
 package com.izouma.dingdong.service.merchant;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.config.Constants;
 import com.izouma.dingdong.converter.LongArrayConverter;
 import com.izouma.dingdong.converter.StringArrayConverter;
 import com.izouma.dingdong.domain.OrderGoodsSpec;
 import com.izouma.dingdong.domain.backstage.Email;
-import com.izouma.dingdong.domain.backstage.Priority;
 import com.izouma.dingdong.domain.merchant.*;
 import com.izouma.dingdong.domain.user.ShoppingCart;
 import com.izouma.dingdong.dto.AppraisalMerDTO;
+import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.enums.ApplyStatus;
 import com.izouma.dingdong.enums.GoodType;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.backstage.EmailRepo;
-import com.izouma.dingdong.repo.backstage.PriorityRepo;
 import com.izouma.dingdong.repo.merchant.*;
 import com.izouma.dingdong.repo.user.ShoppingCartRepo;
 import com.izouma.dingdong.service.AppraisalService;
@@ -42,9 +42,7 @@ public class GoodsService {
     private MerchantRepo merchantRepo;
     private AppraisalService appraisalService;
     private GoodsSpecificationRepo goodsSpecificationRepo;
-    private SalesRepo salesRepo;
     private MerchantService merchantService;
-    private PriorityRepo priorityRepo;
     private ShoppingCartService shoppingCartService;
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
     private ShoppingCartRepo shoppingCartRepo;
@@ -84,9 +82,19 @@ public class GoodsService {
             throw new BusinessException("商品销售时间不得早于/晚于营业时间");
         }
 
-/*        if (containsWeek(goods.getWeek(), merchantSettings.getWeek())) {
+        List<Goods> goodsList = goodsRepo.findAllByMerchantId(goods.getMerchantId());
+        Set<Goods> signboard = goodsList.stream().filter(Goods::getSignboard).collect(Collectors.toSet());
+        if (signboard.size() > 10) {
+            throw new BusinessException("招牌商品大于10");
+        } else {
+            if (signboard.size() > goodsList.size() / 3) {
+                throw new BusinessException("招牌商品大于所有商品1/3");
+            }
+        }
+
+        if (containsWeek(goods.getWeek(), merchantSettings.getWeek())) {
             throw new BusinessException("商品销售日期不在营业日期内");
-        }*/
+        }
 
         if (goods.getId() == null) {
             goods.setLikes(0);
@@ -221,13 +229,9 @@ public class GoodsService {
        周几
     */
     public Boolean containsWeek(String goodsWeek, String merWeek) {
-
-        List<String> merWeeks = new StringArrayConverter().convertToEntityAttribute(merWeek);
-        List<String> goodsWeeks = new StringArrayConverter().convertToEntityAttribute(goodsWeek);
-
-        if (merWeeks.contains("EVERY")) {
-            return true;
-        }
+        StringArrayConverter converter = new StringArrayConverter();
+        List<String> merWeeks = converter.convertToEntityAttribute(merWeek);
+        List<String> goodsWeeks = converter.convertToEntityAttribute(goodsWeek);
 
         for (String g : goodsWeeks) {
             if (!merWeeks.contains(g)) {
@@ -235,7 +239,6 @@ public class GoodsService {
             }
         }
         return true;
-
     }
 
     /*
@@ -260,125 +263,86 @@ public class GoodsService {
      */
     public List<Goods> showAll(GoodType type, Double longitude, Double latitude, Double range) {
 
-        //用户3km以内的商品 3km以内的商户
+        //3km以内的商户
         Set<Merchant> merchantSet = new HashSet<>(merchantRepo.findAll());
-        //List<Merchant> merchantList = merchantService.distanceSorting(merchantSet, longitude, latitude, range);
-
-        Map<Merchant, Double> map = merchantService.distanceSorting(merchantSet, longitude, latitude, range);
+        List<MerchantDTO> dtos = merchantService.withDistance(merchantSet, longitude, latitude, range);
 
+        //用户3km以内的商品
         List<Goods> goodsList = new ArrayList<>();
-        for (Map.Entry<Merchant, Double> m : map.entrySet()) {
-            goodsList.addAll(goodsRepo.findAllByMerchantId(m.getKey().getId()));
+        for (MerchantDTO d:dtos){
+            goodsList.addAll(goodsRepo.findAllByMerchantId(d.getMid()));
         }
-        // List<Goods> goodsList = goodsRepo.findAll();
 
         List<Goods> all = new ArrayList<>();
-        //(1000-距离)/1000*0.5 + 月销/10000*0.5 (月销大于10000按照10000计算)
         switch (type) {
-            case PRAISE_FOOD:
+            case PRAISE_FOOD://好评美食
+                all.addAll(goodsList.stream().filter(Goods::getPraise).collect(Collectors.toList()));
+                break;
+            case POPULAR_FOOD://人气美食
+                all.addAll(goodsList.stream().filter(Goods::getPopularity).collect(Collectors.toList()));
+                break;
+            case SIGNBOARD_FOOD://招牌美食
                 all.addAll(goodsList.stream().filter(Goods::getSignboard)
                         .sorted((a, b) -> b.getPriority().compareTo(a.getPriority())).collect(Collectors.toList()));
-            case POPULAR_FOOD:
-                all.addAll(goodsList.stream().filter(Goods::getPopularity).collect(Collectors.toList()));
-            case SIGNBOARD_FOOD:
-                all.addAll(goodsList.stream().filter(Goods::getPraise).collect(Collectors.toList()));
+                break;
         }
 
-        return all;
-    }
-
-    //更新商品优先级,每月1日更新
-    public void priority(Long goodsId) {
-        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
-
-        LocalDate now = LocalDate.now();
-        //上个月日期
-        LocalDate lastMonth = now.minusMonths(1);
-
-        LocalDate day = now.minusDays(1);
-        //月销为0天数
-        int countZeroSales = 0;
-        //点赞数
-        Integer likes = 0;
-        //差评数
-        Integer badReview = 0;
-        //销量
-        Integer sales = 0;
-
-        while (day.isBefore(lastMonth)) {
-            Sales daySales = salesRepo.findByGoodsIdAndDay(goodsId, now.minusDays(1));
-            if (ObjectUtil.isNull(daySales)) {
-                //月销为0天数
-                countZeroSales++;
-            } else {
-                likes += daySales.getDayLikes();
-                badReview += daySales.getDayBad();
-                sales += daySales.getDaySales();
+        //排序
+        all.sort((a, b) -> {
+            //从大到小
+//            int i = b.getPriority().compareTo(a.getPriority());
+//            if (i == 0) {
+            MerchantDTO dtoA = dtos.stream().filter(d -> d.getMid().equals(a.getMerchantId())).findFirst().orElseThrow(new BusinessException("无商家"));
+            MerchantDTO dtoB = dtos.stream().filter(d -> d.getMid().equals(b.getMerchantId())).findFirst().orElseThrow(new BusinessException("无商家"));
+            Integer monthSalesA = dtoA.getMonthSales();
+            if (monthSalesA > 10000) {
+                monthSalesA = 10000;
             }
-        }
-
-//        List<Sales> monthSales = salesRepo.findAllByGoodsIdAndDayBetween(goodsId, lastMonth, now);
-//        //点赞数
-//        Integer likes = 0;
-//        //差评数
-//        Integer badReview = 0;
-//        //销量
-//        Integer sales = 0;
-//        for (Sales s : monthSales) {
-//            likes += s.getDayLikes();
-//            badReview += s.getDayBad();
-//            sales += s.getDaySales();
-//        }
-
-        boolean add = true;
-        boolean plus = false;
-
-        //上一月该商品新增点赞数-新增差评数*10>0
-        if (likes - badReview * 10 < 0) {
-            add = false;
-        }
-
-        Integer priority = goods.getPriority();
-        Priority goodsPriority = priorityRepo.findByTypeAndLevel(1, priority);
-
-        //新增点赞数  月销量
-        if (likes < goodsPriority.getLikes() || sales < goodsPriority.getMonthSales()) {
-            add = false;
-        }
-
-        if (countZeroSales < goodsPriority.getZeroSalesDay()) {
-            plus = true;
-        } else if (likes - badReview * 3 < 0) {
-            plus = true;
-        } else if (sales < goodsPriority.getLessMonthSales()) {
-            plus = true;
-        }
-
-        if (add) {
-            if (!priority.equals(priorityRepo.findByTypeAndLevelMax(1))) {
-                goods.setPriority(priority + 1);
+            Integer monthSalesB = dtoB.getMonthSales();
+            if (monthSalesB > 10000) {
+                monthSalesB = 10000;
             }
-        }
-        if (plus) {
-            if (!priority.equals(1)) {
-                goods.setPriority(priority - 1);
+
+            //(1000-距离)/1000*0.5 + 月销/10000*0.5 (月销大于10000按照10000计算)
+            double scoreA = (1000.0 - dtoA.getDistance()) / 1000.0 * 0.5 + monthSalesA / 10000.0 * 0.5;
+            double scoreB = (1000.0 - dtoB.getDistance()) / 1000.0 * 0.5 + monthSalesB / 10000.0 * 0.5;
+            if (scoreB > scoreA) {
+                return 1;
+            } else if (scoreB == scoreA) {
+                return 0;
             }
-        }
+            return -1;
+//            }
+//            return i;
+        });
 
+        return all;
     }
 
+    /*
+    修改商品
+     */
     public Goods change(Goods record) {
         Goods orig = goodsRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
         //如果修改商品名称和图片就重新审核
         if (record.getName() != null || record.getImg() != null) {
             record.setStatus(ApplyStatus.PENDING);
         }
+        ObjUtils.merge(orig, record);
+        Goods save = this.save(orig);
         //如果修改价格,购物车内的商品就要重新计算
         if (record.getAmount() != null || record.getDiscountAmount() != null) {
             //所有包含此商品的订单规格
             List<OrderGoodsSpec> goodsSpec = orderGoodsSpecRepo.findAllByGoodsId(record.getId());
+
             Set<Long> cartId = new HashSet<>();
-            goodsSpec.forEach(g -> cartId.add(g.getShoppingCartId()));
+            goodsSpec.forEach(g -> {
+                cartId.add(g.getShoppingCartId());
+                if (ApplyStatus.PENDING.equals(save.getStatus())) {
+                    //商品状态变为待审核,购物车里就删除
+                    orderGoodsSpecRepo.deleteById(g.getId());
+                }
+            });
             cartId.forEach(c -> {
                 //查找购物车
                 ShoppingCart shoppingCart = shoppingCartRepo.findById(c).orElse(null);
@@ -388,8 +352,8 @@ public class GoodsService {
                 }
             });
         }
-        ObjUtils.merge(orig, record);
+
         //修改商品
-        return this.save(orig);
+        return save;
     }
 }

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

@@ -85,16 +85,6 @@ public class MerchantService {
             }
         }
 
-//        user.setPassword(new BCryptPasswordEncoder().encode(merchantDTO.getPassword()));
-//        if (ObjectUtil.isNotNull(merchantDTO.getLogo())) {
-//            user.setAvatar(merchantDTO.getLogo());
-//        }
-//        if (ObjectUtil.isNotNull(merchantDTO.getShowName())) {
-//            user.setNickname(merchantDTO.getShowName());
-//        }
-//    user.setIdentity(Identity.MERCHANT);
-//        userRepo.save(user);
-
         //新建商家
         Merchant merchant = new Merchant();
         MerchantSettings merchantSettings = new MerchantSettings();
@@ -104,6 +94,10 @@ public class MerchantService {
         merchant.setUserId(user.getId());
         merchant.setStatus(ApplyStatus.PENDING);
 
+        merchant.setMonthSales(0);
+        merchant.setGoodNum(0);
+        merchant.setBadNum(0);
+
         merchant.setEnabled(true);
         merchant.setBlacklist(false);
         merchant = merchantRepo.save(merchant);
@@ -219,6 +213,8 @@ public class MerchantService {
             merchant.setStatus(ApplyStatus.PASS);
             merchant.setIsPass(true);
             merchant.setEstablishTime(LocalDateTime.now());
+            //标签 新商家
+            merchant.setTag(1);
             //推广语
             merchant.setPromo(promo);
 
@@ -297,7 +293,6 @@ public class MerchantService {
                 }
             });
         }
-
 /*        //所有商家要按距离排序规则
         Map<Merchant, Double> map = new HashMap<>();
         //算距离
@@ -307,7 +302,6 @@ public class MerchantService {
                 map.put(m, distance);
             }
         }
-
         //排序
         List<Map.Entry<Merchant, Double>> list = new ArrayList<>(map.entrySet());
         list.sort(Comparator.comparing(Map.Entry<Merchant, Double>::getValue));
@@ -443,20 +437,20 @@ public class MerchantService {
         list.sort(Comparator.comparing(Map.Entry<Merchant, Double>::getValue));
         //List<Merchant> mers = new ArrayList<>();
 
-        Map<Merchant, Double> map1 = new HashMap<>();
+        Map<Merchant, Double> merchantMap = new HashMap<>();
         for (Map.Entry<Merchant, Double> m : list) {
             //mers.add(m.getKey());
-            map1.put(m.getKey(), m.getValue());
+            merchantMap.put(m.getKey(), m.getValue());
         }
 
-        return map1;
+        return merchantMap;
     }
 
     //带距离的商家
     public List<MerchantDTO> withDistance(Set<Merchant> merchants, Double longitude, Double latitude, Double range) {
-        Map<Merchant, Double> mers = this.distanceSorting(merchants, longitude, latitude, null);
+        Map<Merchant, Double> merchantMap = this.distanceSorting(merchants, longitude, latitude, null);
         List<MerchantDTO> dtos = new ArrayList<>();
-        for (Map.Entry<Merchant, Double> m : mers.entrySet()) {
+        for (Map.Entry<Merchant, Double> m : merchantMap.entrySet()) {
             merchantSettingsRepo.findByMerchantId(m.getKey().getId()).ifPresent(s -> dtos.add(new MerchantDTO(m.getKey(), s, m.getValue())));
         }
         return dtos;

+ 250 - 127
src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java

@@ -3,16 +3,15 @@ package com.izouma.dingdong.service.merchant;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.izouma.dingdong.converter.LongArrayConverter;
 import com.izouma.dingdong.domain.MoneyRecord;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.User;
-import com.izouma.dingdong.domain.backstage.Banner;
-import com.izouma.dingdong.domain.backstage.Category;
-import com.izouma.dingdong.domain.backstage.Promote;
-import com.izouma.dingdong.domain.backstage.TimeTag;
+import com.izouma.dingdong.domain.backstage.*;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
+import com.izouma.dingdong.domain.merchant.Sales;
 import com.izouma.dingdong.domain.user.UserCoupon;
 import com.izouma.dingdong.dto.FilterDTO;
 import com.izouma.dingdong.dto.MerchantDTO;
@@ -21,10 +20,7 @@ import com.izouma.dingdong.enums.ApplyStatus;
 import com.izouma.dingdong.enums.FinancialType;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.*;
-import com.izouma.dingdong.repo.backstage.BannerRepo;
-import com.izouma.dingdong.repo.backstage.CategoryRepo;
-import com.izouma.dingdong.repo.backstage.PromoteRepo;
-import com.izouma.dingdong.repo.backstage.TimeTagRepo;
+import com.izouma.dingdong.repo.backstage.*;
 import com.izouma.dingdong.repo.merchant.*;
 import com.izouma.dingdong.repo.user.UserCouponRepo;
 import com.izouma.dingdong.service.backstage.CategoryService;
@@ -61,13 +57,8 @@ public class MerchantSettingsService {
     private MerchantService merchantService;
     private CouponRepo couponRepo;
     private UserCouponRepo userCouponRepo;
-
-    /*
-    显示所有订单
-     */
-    public List<OrderInfo> allOrder(Long id) {
-        return orderInfoRepo.findAllByMerchantId(id);
-    }
+    private PriorityRepo priorityRepo;
+    private SalesRepo salesRepo;
 
     /*
     时间标签类商家列表
@@ -91,8 +82,14 @@ public class MerchantSettingsService {
     }
 
 
-    /*
-    商户叮咚币记录
+    /**
+     * 商户叮咚币记录
+     *
+     * @param merchantId 商户id
+     * @param fromUserId 支出用户
+     * @param amount     金额
+     * @param type       类型
+     * @param remark     备注
      */
     public void income(Long merchantId, Long fromUserId, BigDecimal amount, FinancialType type, String remark) {
         //按商户Id找出用户
@@ -174,18 +171,6 @@ public class MerchantSettingsService {
         return map;
     }
 
-    /*
-    明星商家
-     */
-    public boolean starMerchant(Merchant merchant) {
-        //非新商家
-        boolean b = merchant.getEstablishTime().isAfter(LocalDateTime.now().minusMonths(1));
-        if (b) {
-            return merchant.getMonthSales() >= 10000 && merchant.getBadNum() > 0 && merchant.getGoodNum() > 3000;
-        }
-        return false;
-
-    }
 
     /*
     人均消费 月订单
@@ -212,62 +197,20 @@ public class MerchantSettingsService {
         //删除商户
         merchantRepo.deleteById(merchantId);
         merchantSettingsRepo.deleteByMerchantId(merchantId);
-
         //删除商品规格
         List<Long> collect = goodsRepo.findAllByMerchantId(merchantId).stream().map(Goods::getId).collect(Collectors.toList());
         collect.forEach(c -> goodsSpecificationRepo.deleteByGoodsId(c));
-
         //删除商品
         goodsRepo.deleteAllByMerchantId(merchantId);
-
         //删除订单
         orderInfoRepo.deleteAllByMerchantId(merchantId);
-
         //删除评价
         appraisalRepo.deleteAllByMerchantId(merchantId);
-
         //删除商家分类
         merchantClassificationRepo.findAllByMerchantId(merchantId);
 
     }
 
-    //商家推广语
-    //每月一更
-    public void merPromo() {
-        List<Category> byParent = categoryRepo.findAllByParent(1L);
-        byParent.forEach(this::accept);
-    }
-
-    private void accept(Category c) {
-        List<MerchantDTO> list = categoryService.categoryMer(c.getId());
-        List<Merchant> merchants = new ArrayList<>();
-        list.sort((a, b) -> b.getMonthSales().compareTo(a.getMonthSales()));
-
-        for (int i = 0; i < 5; i++) {
-            Merchant merchant = merchantRepo.findById(list.get(i).getMid()).orElseThrow(new BusinessException("无商家"));
-            String name;
-            switch (i) {
-                case 0:
-                    name = "商家月销售冠军";
-                    break;
-                case 1:
-                    name = "商家月销售亚军";
-                    break;
-                case 2:
-                    name = "商家月销售季军";
-                    break;
-                case 3:
-                    name = "商家月销售第四名";
-                    break;
-                default:
-                    name = "商家月销售第五名";
-            }
-            merchant.setPromo(c.getName() + name);
-            merchants.add(merchant);
-        }
-        merchantRepo.saveAll(merchants);
-    }
-
     public MerchantDTO getDTO(Long id) {
         Merchant merchant = merchantRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(id).orElseThrow(new BusinessException("无记录"));
@@ -343,118 +286,119 @@ public class MerchantSettingsService {
                         return conB.compareTo(conA);
                     });
                     break;
-                case 7:
+                //case 7:
                     //距离
                     //dtos.sort(Comparator.comparing(MerchantDTO::getDistance));
                 case 8:
                     //月销
                     dtos.sort((a, b) -> b.getMonthSales().compareTo(a.getMonthSales()));
                     break;
+                default:
+                    break;
             }
         }
         return dtos;
     }
 
-    public List<MerchantDTO> listFilter(List<MerchantDTO> dtos, Integer filter, Long userId) {
-        List<MerchantDTO> collect = new ArrayList<>();
-//        if (filter != null) {
-        switch (filter) {
-            case 1:
-                //首单立减
+    public List<MerchantDTO> listFilter(List<MerchantDTO> dtos, String filter, Long userId) {
+        Set<MerchantDTO> collect = new HashSet<>();
+        LongArrayConverter converter = new LongArrayConverter();
+        List<Long> longs = converter.convertToEntityAttribute(filter);
+        for (Long l : longs) {
+            if (l == 1) {//首单立减
                 collect.addAll(dtos.stream()
                         .filter(d -> d.getFirstOrder() != null && d.getFirstOrder().compareTo(BigDecimal.ZERO) > 0)
-                        .collect(Collectors.toList()));
-                break;
-            case 2:
-                //满减优惠
+                        .collect(Collectors.toSet()));
+            } else if (l == 2) {//满减优惠
                 collect.addAll(dtos.stream()
                         .filter(d -> CollUtil.isNotEmpty(fullReductionRepo.findAllByMerchantId(d.getMid())))
-                        .collect(Collectors.toList()));
-                break;
-            case 3:
-                //折扣商家
+                        .collect(Collectors.toSet()));
+            } else if (l == 3) {//折扣商家
                 collect.addAll(dtos.stream()
-                        .filter(d -> StrUtil.isNotEmpty(merchantClassificationRepo.findByMerchantIdAndType(d.getMid(), 2).getGoodsIds()))
-                        .collect(Collectors.toList()));
-                break;
-            case 4:
-                //下单返红包
+                        .filter(d -> StrUtil.isNotEmpty(
+                                merchantClassificationRepo.findByMerchantIdAndType(d.getMid(), 2).getGoodsIds()))
+                        .collect(Collectors.toSet()));
+            } else if (l == 4) {//下单返红包
                 collect.addAll(dtos.stream()
                         .filter(d -> CollUtil.isNotEmpty(couponRepo.findAllByMerchantIdAndEnabledTrue(d.getMid())))
-                        .collect(Collectors.toList()));
-                break;
-            case 5:
-                //可用红包
+                        .collect(Collectors.toSet()));
+            } else if (l == 5) {//可用红包
                 List<UserCoupon> coupons = userCouponRepo.findAllByUserIdAndIsUsedFalse(userId);
                 collect.addAll(dtos.stream()
                         .filter(d ->
                                 ObjectUtil.isNotEmpty(coupons.stream().filter(c ->
                                         !c.getCoupon().getEndDate().isBefore(LocalDate.now())
                                                 && (c.getCoupon().getMerchantId() == null || c.getCoupon().getMerchantId().equals(d.getMid()))
-                                ).collect(Collectors.toList()))
+                                ).collect(Collectors.toSet()))
                         )
-                        .collect(Collectors.toList()));
-                break;
+                        .collect(Collectors.toSet()));
+            }
         }
-//        }
-        return collect;
+        return new ArrayList<>(collect);
     }
 
     //其他筛选条件
     public List<MerchantDTO> otherFilter(List<MerchantDTO> dtos, FilterDTO filterDto) {
-        List<MerchantDTO> collect = new ArrayList<>();
+        Set<MerchantDTO> collect = new HashSet<>();
+        LongArrayConverter converter = new LongArrayConverter();
         if (filterDto.getNatureId() != null) {
+            List<Long> natureIds = converter.convertToEntityAttribute(filterDto.getFilter());
             //商家性质筛选
-            collect.addAll(dtos.stream()
-                    .filter(d -> d.getMerchantNatureId().equals(filterDto.getNatureId()))
-                    .collect(Collectors.toList()));
+            natureIds.forEach(n ->
+                    collect.addAll(dtos.stream()
+                            .filter(d -> d.getMerchantNatureId().equals(n))
+                            .collect(Collectors.toSet()))
+            );
         }
 
+        //金额区间
         if (filterDto.getStartAmount() != null && filterDto.getEndAmount() != null) {
             collect.addAll(dtos.stream()
                     .filter(d -> this.consumption(d.getMid()).compareTo(filterDto.getStartAmount()) >= 0
                             && this.consumption(d.getMid()).compareTo(filterDto.getEndAmount()) <= 0
-                    ).collect(Collectors.toList()));
+                    ).collect(Collectors.toSet()));
 
         } else if (filterDto.getStartAmount() != null) {
             collect.addAll(dtos.stream()
                     .filter(d -> this.consumption(d.getMid()).compareTo(filterDto.getStartAmount()) >= 0
-                    ).collect(Collectors.toList()));
+                    ).collect(Collectors.toSet()));
 
         } else if (filterDto.getEndAmount() != null) {
             collect.addAll(dtos.stream()
                     .filter(d -> this.consumption(d.getMid()).compareTo(filterDto.getEndAmount()) <= 0
-                    ).collect(Collectors.toList()));
+                    ).collect(Collectors.toSet()));
         } else {
             collect.addAll(dtos);
         }
 
+        //标签
         if (filterDto.getTag() != null) {
-            switch (filterDto.getTag()) {
-                case 1:
-                    //新商家
-                    LocalDate date = LocalDate.now().minusMonths(1);
-                    LocalTime time = LocalTime.parse("00:00:00");
-                    LocalDateTime dateTime = LocalDateTime.of(date, time);
+            List<Long> tags = converter.convertToEntityAttribute(filterDto.getTag());
+            tags.forEach(t -> {
+                if (t == 1) {//新商家
                     collect.addAll(dtos.stream()
-                            .filter(d -> d.getEstablishTime().isAfter(dateTime))
-                            .collect(Collectors.toList()));
-                    break;
-
-                case 2:
-                    //明星商家
-
-                case 3:
+                            .filter(d -> d.getTag() == 1)
+                            .collect(Collectors.toSet()));
+                } else if (t == 2) {//明星商家
+                    collect.addAll(dtos.stream()
+                            .filter(d -> d.getTag() == 2)
+                            .collect(Collectors.toSet()));
+                } else if (t == 3) {//口碑联盟
                     //口碑联盟
                     collect.addAll(dtos.stream()
                             .filter(MerchantDTO::getBuyAlliance)
-                            .collect(Collectors.toList()));
-            }
+                            .collect(Collectors.toSet()));
+                }
+
+            });
         }
-        return collect;
+        return new ArrayList<>(collect);
     }
 
-    public List<MerchantDTO> page(Double longitude, Double latitude, Integer sort, FilterDTO filterDto, Long userId) {
+    /*
+    推荐商家
+     */
+    public List<MerchantDTO> recommended(Double longitude, Double latitude, Integer sort, FilterDTO filterDto, Long userId) {
         List<MerchantDTO> dtoList;
         dtoList = this.listSort(longitude, latitude, sort);
         if (filterDto.getFilter() != null) {
@@ -464,7 +408,7 @@ public class MerchantSettingsService {
     }
 
 
-    public List<MerchantDTO> showAll(PageQuery pageQuery, Double longitude, Double latitude, Integer popularTag, Long userId) {
+    public List<MerchantDTO> showAll(PageQuery pageQuery, Double longitude, Double latitude, Long popularTag, Long userId) {
 
         List<Merchant> merchantList = merchantRepo.findAll((root, criteriaQuery, criteriaBuilder) -> {
                     List<Predicate> predicates = new ArrayList<>();
@@ -497,9 +441,188 @@ public class MerchantSettingsService {
         //带距离 且按距离排好序
         List<MerchantDTO> dtos = merchantService.withDistance(merchants, longitude, latitude, null);
         if (popularTag != null) {
-            return this.listFilter(dtos, popularTag, userId);
+            return this.listFilter(dtos, popularTag.toString(), userId);
         }
         return dtos;
     }
 
+    //月更的东西
+    /*
+    推广语
+    优先级
+    明星商家
+     */
+    public void monthUpdate() {
+        List<Merchant> merchants = merchantRepo.findAll();
+        merchants.forEach(a -> {
+            //明星商家
+            this.starMerchant(a);
+            //优先级
+            this.priority(a.getId(), 0);
+        });
+        List<Goods> goods = goodsRepo.findAll();
+        //优先级
+        goods.forEach(g -> this.priority(g.getId(), 1));
+        this.merPromo();
+    }
+
+    /*
+    明星商家
+     */
+    public void starMerchant(Merchant merchant) {
+        LocalDate date = LocalDate.now().minusMonths(1);
+        LocalTime time = LocalTime.parse("00:00:00");
+        LocalDateTime dateTime = LocalDateTime.of(date, time);
+        //非新商家
+        boolean b = dateTime.isAfter(merchant.getEstablishTime());
+        if (b) {
+            if (merchant.getMonthSales() >= 10000 && merchant.getBadNum() > 0 && merchant.getGoodNum() > 3000) {
+                //明星商家
+                merchant.setTag(2);
+            } else {
+                //都不是
+                merchant.setTag(0);
+            }
+        } else {
+            //新商家
+            merchant.setTag(1);
+        }
+        merchantRepo.save(merchant);
+    }
+
+    //商家推广语
+    //每月一更
+    public void merPromo() {
+        List<Category> byParent = categoryRepo.findAllByParent(1L);
+        byParent.forEach(this::accept);
+    }
+
+    private void accept(Category c) {
+        List<MerchantDTO> list = categoryService.categoryMer(c.getId());
+        List<Merchant> merchants = new ArrayList<>();
+        list.sort((a, b) -> b.getMonthSales().compareTo(a.getMonthSales()));
+
+        for (int i = 0; i < 5; i++) {
+            Merchant merchant = merchantRepo.findById(list.get(i).getMid()).orElseThrow(new BusinessException("无商家"));
+            String name;
+            switch (i) {
+                case 0:
+                    name = "商家月销售冠军";
+                    break;
+                case 1:
+                    name = "商家月销售亚军";
+                    break;
+                case 2:
+                    name = "商家月销售季军";
+                    break;
+                case 3:
+                    name = "商家月销售第四名";
+                    break;
+                default:
+                    name = "商家月销售第五名";
+            }
+            merchant.setPromo(c.getName() + name);
+            merchants.add(merchant);
+        }
+        merchantRepo.saveAll(merchants);
+    }
+
+    //更新商品/商户优先级,每月1日更新
+    public void priority(Long id, Integer type) {
+
+        LocalDate now = LocalDate.now();
+        //上个月日期
+        LocalDate lastMonth = now.minusMonths(1);
+
+        LocalDate day = now.minusDays(1);
+        //月销为0天数
+        int countZeroSales = 0;
+        //点赞数
+        Integer likes = 0;
+        //差评数
+        Integer badReview = 0;
+        //销量
+        Integer sales = 0;
+
+        while (day.isBefore(lastMonth)) {
+            Sales daySales;
+            if (type == 0) {
+                daySales = salesRepo.findByMerchantIdAndDay(id, day);
+            } else {
+                daySales = salesRepo.findByGoodsIdAndDay(id, day);
+            }
+
+            if (ObjectUtil.isNull(daySales)) {
+                //月销为0天数
+                countZeroSales++;
+            } else {
+                likes += daySales.getDayLikes();
+                badReview += daySales.getDayBad();
+                sales += daySales.getDaySales();
+            }
+            day = now.minusDays(1);
+        }
+
+        boolean add = true;
+        boolean plus = false;
+
+        //上一月该商品新增点赞数-新增差评数*10>0
+        if (likes - badReview * 10 < 0) {
+            add = false;
+        }
+
+        Integer p;
+        Priority priority;
+
+        MerchantSettings settings = null;
+        Goods goods = null;
+        if (type == 0) {
+            settings = merchantSettingsRepo.findByMerchantId(id).orElseThrow(new BusinessException("无商户"));
+
+            p = settings.getPriority();
+            priority = priorityRepo.findByTypeAndLevel(0, p);
+        } else {
+            goods = goodsRepo.findById(id).orElseThrow(new BusinessException("无商品"));
+
+            p = goods.getPriority();
+            priority = priorityRepo.findByTypeAndLevel(1, p);
+        }
+
+
+        //新增点赞数  月销量
+        if (likes < priority.getLikes() || sales < priority.getMonthSales()) {
+            add = false;
+        }
+
+        if (countZeroSales < priority.getZeroSalesDay()) {
+            plus = true;
+        } else if (likes - badReview * 3 < 0) {
+            plus = true;
+        } else if (sales < priority.getLessMonthSales()) {
+            plus = true;
+        }
+
+        if (add) {
+            if (!p.equals(priorityRepo.findByTypeAndLevelMax(1))) {
+                if (type == 0) {
+                    settings.setPriority(p + 1);
+                    merchantSettingsRepo.save(settings);
+                } else {
+                    goods.setPriority(p + 1);
+                    goodsRepo.save(goods);
+                }
+            }
+        }
+        if (plus) {
+            if (!p.equals(1)) {
+                if (type == 0) {
+                    settings.setPriority(p - 1);
+                    merchantSettingsRepo.save(settings);
+                } else {
+                    goods.setPriority(p - 1);
+                    goodsRepo.save(goods);
+                }
+            }
+        }
+    }
 }

+ 8 - 6
src/main/java/com/izouma/dingdong/service/merchant/SalesService.java

@@ -124,18 +124,20 @@ public class SalesService {
         List<Sales> praises = salesRepo.findAllByDayAndPraiseGreaterThanEqual(LocalDate.now(), 5);
 
         //插入
-       // popularities.forEach(this::into);
-        popularities.forEach(p->{
+        // popularities.forEach(this::into);
+        popularities.forEach(p -> {
             this.into(p);
             Goods goods = goodsRepo.findById(p.getGoodsId()).orElseThrow(new BusinessException("无商品"));
+            //人气
             goods.setPopularity(true);
             goodsRepo.save(goods);
         });
 
-       // praises.forEach(this::into);
-        praises.forEach(p->{
+        // praises.forEach(this::into);
+        praises.forEach(p -> {
             this.into(p);
             Goods goods = goodsRepo.findById(p.getGoodsId()).orElseThrow(new BusinessException("无商品"));
+            //好评
             goods.setPraise(true);
             goodsRepo.save(goods);
         });
@@ -168,11 +170,11 @@ public class SalesService {
      */
     public Sales newSales(Long goodsId, LocalDate localDate) {
         Sales daySales = salesRepo.findByGoodsIdAndDay(goodsId, localDate);
-       // Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
+        Goods goods = goodsRepo.findById(goodsId).orElseThrow(new BusinessException("无商品"));
 
         if (daySales == null) {
             daySales = Sales.builder()
-                 //   .merchantId(goods.getMerchantId())
+                    .merchantId(goods.getMerchantId())
                     .goodsId(goodsId)
                     .day(localDate)
                     .dayLikes(0)

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

@@ -69,6 +69,7 @@ public class AppraisalController extends BaseController {
     @ApiOperation("用户评价")
     @PostMapping("/userAppraisal")
     public Appraisal userAppraisal(Appraisal appraisal) {
+        //商家id和骑手id可不传
         return appraisalService.userAppraisal(appraisal);
     }
 

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

@@ -77,7 +77,7 @@ public class CategoryController extends BaseController {
     }
 
     @GetMapping("/merchants")
-    @ApiOperation("分类下的所有商品")
+    @ApiOperation("分类下的商家列表")
     public List<MerchantDTO> merchants(Long id) {
         return categoryService.categoryMer(id);
     }

+ 66 - 0
src/main/java/com/izouma/dingdong/web/backstage/DeliveryFeeController.java

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

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

@@ -42,14 +42,15 @@ public class GoodsController extends BaseController {
     @ApiOperation("添加修改商品")
     public Goods save(@RequestBody Goods record) {
         if (record.getId() != null) {
-            Goods orig = goodsRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+           /* Goods orig = goodsRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
             //如果修改商品名称和图片就重新审核
             if (record.getName() != null || record.getImg() != null) {
                 record.setStatus(ApplyStatus.PENDING);
             }
             //如果修改价格,购物车内的商品就要重新计算
             ObjUtils.merge(orig, record);
-            return goodsService.save(orig);
+            return goodsService.save(orig);*/
+            goodsService.change(record);
         }
         return goodsService.save(record);
     }
@@ -111,6 +112,10 @@ public class GoodsController extends BaseController {
     @ApiOperation("发现美食下商品所有信息")
     public List<Goods> showAll(GoodType type, Double longitude, Double latitude) {
         //type 发现美食标签, 以及经纬度
+        if (type == null) {
+            type = GoodType.SIGNBOARD_FOOD;
+        }
+        //3KM 以内
         return goodsService.showAll(type, longitude, latitude, 3000.0);
     }
 }

+ 22 - 2
src/main/java/com/izouma/dingdong/web/merchant/MerchantSettingsController.java

@@ -1,5 +1,8 @@
 package com.izouma.dingdong.web.merchant;
 
+import com.izouma.dingdong.dto.FilterDTO;
+import com.izouma.dingdong.dto.MerchantDTO;
+import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.service.merchant.MerchantSettingsService;
@@ -9,8 +12,10 @@ import com.izouma.dingdong.repo.merchant.MerchantSettingsRepo;
 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.data.domain.PageImpl;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -19,7 +24,7 @@ import java.io.IOException;
 import java.util.List;
 
 @RestController
-@RequestMapping("/merchantSettings")
+@RequestMapping("/settings")
 @AllArgsConstructor
 public class MerchantSettingsController extends BaseController {
     private MerchantSettingsService merchantSettingsService;
@@ -40,7 +45,7 @@ public class MerchantSettingsController extends BaseController {
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
     public Page<MerchantSettings> all(PageQuery pageQuery) {
-        return merchantSettingsRepo.findAll(toSpecification(pageQuery,MerchantSettings.class), toPageRequest(pageQuery));
+        return merchantSettingsRepo.findAll(toSpecification(pageQuery, MerchantSettings.class), toPageRequest(pageQuery));
     }
 
     @GetMapping("/get/{id}")
@@ -59,5 +64,20 @@ public class MerchantSettingsController extends BaseController {
         List<MerchantSettings> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @GetMapping("/search")
+    @ApiOperation("搜索栏的商户列表")
+    public Page<MerchantDTO> search(PageQuery pageQuery, Double longitude, Double latitude, Long popularTag) {
+        Long id = SecurityUtils.getAuthenticatedUser().getId();
+        List<MerchantDTO> dtos = merchantSettingsService.showAll(pageQuery, longitude, latitude, popularTag, id);
+        return new PageImpl<>(dtos, toPageRequest(pageQuery), dtos.size());
+    }
+
+    @GetMapping("/show")
+    @ApiOperation("推荐商家下的商户列表")
+    public List<MerchantDTO> showAll(Double longitude, Double latitude, Integer sort, FilterDTO filterDto) {
+        Long id = SecurityUtils.getAuthenticatedUser().getId();
+        return merchantSettingsService.recommended(longitude, latitude, sort, filterDto, id);
+    }
 }
 

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

@@ -0,0 +1 @@
+{"tableName":"DeliveryFee","className":"DeliveryFee","remark":"配送管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"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":"type","modelName":"type","remark":"类型","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"基础费\",\"value\":\"BASE_FEE\"},{\"label\":\"基础距离\",\"value\":\"BASE_DISTANCE\"},{\"label\":\"超出距离\",\"value\":\"OVER_DISTANCE\"},{\"label\":\"超出费用\",\"value\":\"EXCESS_COST\"},{\"label\":\"繁忙系数\",\"value\":\"BUSYNESS_FACTOR\"},{\"label\":\"时间系数\",\"value\":\"TIME_COEFFICIENT\"},{\"label\":\"配送件数\",\"value\":\"NUMBER_OF_DELIVERY\"}]"},{"name":"rule","modelName":"rule","remark":"rule","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"value","modelName":"value","remark":"值","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"description","modelName":"description","remark":"描述","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"multivalued","modelName":"multivalued","remark":"可多值","showInList":true,"showInForm":true,"formType":"switch"},{"name":"enabled","modelName":"enabled","remark":"enabled","showInList":true,"showInForm":true,"formType":"switch"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.backstage.DeliveryFee","genPackage":"backstage"}

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

@@ -414,6 +414,22 @@ const router = new Router({
                     meta: {
                        title: '优先级',
                     },
+               },
+                {
+                    path: '/deliveryFeeEdit',
+                    name: 'DeliveryFeeEdit',
+                    component: () => import(/* webpackChunkName: "deliveryFeeEdit" */ '@/views/DeliveryFeeEdit.vue'),
+                    meta: {
+                       title: '配送管理编辑',
+                    },
+                },
+                {
+                    path: '/deliveryFeeList',
+                    name: 'DeliveryFeeList',
+                    component: () => import(/* webpackChunkName: "deliveryFeeList" */ '@/views/DeliveryFeeList.vue'),
+                    meta: {
+                       title: '配送管理',
+                    },
                }
                 /**INSERT_LOCATION**/,
                 {

+ 118 - 0
src/main/vue/src/views/DeliveryFeeEdit.vue

@@ -0,0 +1,118 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="77px" label-position="right" size="small"
+                 style="max-width: 500px;">
+            <el-form-item prop="type" label="类型">
+                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                    <el-option
+                            v-for="item in typeOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="rule" label="规则">
+                <el-input v-model="formData.rule"></el-input>
+            </el-form-item>
+            <el-form-item prop="ruleUnit" label="规则单位">
+                <el-input v-model="formData.ruleUnit"></el-input>
+            </el-form-item>
+            <el-form-item prop="value" label="值">
+                <el-input v-model="formData.value"></el-input>
+            </el-form-item>
+            <el-form-item prop="valueUnit" label="值单位">
+                <el-input v-model="formData.valueUnit"></el-input>
+            </el-form-item>
+            <el-form-item prop="description" label="描述">
+                <el-input v-model="formData.description"></el-input>
+            </el-form-item>
+            <el-form-item prop="multivalued" label="可多值">
+                <el-switch v-model="formData.multivalued"></el-switch>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存
+                </el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'DeliveryFeeEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('deliveryFee/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: {},
+                typeOptions: [{"label": "起送距离和费用", "value": "BASE_FEE"},
+                    {"label": "超出距离和费用", "value": "EXCESS_COST"},
+                    {"label": "繁忙系数", "value": "BUSYNESS_FACTOR"},
+                    {"label": "繁忙分钟", "value": "BUSY_MINUTES"},
+                    {"label": "时间段系数", "value": "TIME_COEFFICIENT"},
+                    {"label": "配送件数", "value": "NUMBER_OF_DELIVERY"}],
+            }
+        },
+        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('/deliveryFee/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(`/deliveryFee/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>

+ 196 - 0
src/main/vue/src/views/DeliveryFeeList.vue

@@ -0,0 +1,196 @@
+<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>
+        </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="type" label="类型"
+                             :formatter="typeFormatter"
+            >
+            </el-table-column>
+            <el-table-column prop="rule" label="规则"
+            >
+            </el-table-column>
+            <el-table-column prop="ruleUnit" label="规则单位"
+            >
+            </el-table-column>
+            <el-table-column prop="value" label="值"
+            >
+            </el-table-column>
+            <el-table-column prop="valueUnit" label="值单位"
+            >
+            </el-table-column>
+            <el-table-column prop="description" label="描述"
+            >
+            </el-table-column>
+            <el-table-column prop="multivalued" label="可多值"
+            >
+                <template slot-scope="{row}">
+                    <el-tag :type="row.multivalued?'':'info'">{{row.multivalued}}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import {mapState} from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'DeliveryFeeList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/deliveryFee/all",
+                downloading: false,
+                typeOptions: [{"label": "起送距离和费用", "value": "BASE_FEE"},
+                    {"label": "超出距离和费用", "value": "EXCESS_COST"},
+                    {"label": "繁忙系数", "value": "BUSYNESS_FACTOR"},
+                    {"label": "繁忙分钟", "value": "BUSY_MINUTES"},
+                    {"label": "时间段系数", "value": "TIME_COEFFICIENT"},
+                    {"label": "配送件数", "value": "NUMBER_OF_DELIVERY"}],
+            }
+        },
+        computed: {
+            selection() {
+                return this.$refs.table.selection.map(i => i.id);
+            }
+        },
+        methods: {
+            typeFormatter(row, column, cellValue, index) {
+                let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+                if (selectedOption) {
+                    return selectedOption.label;
+                }
+                return '';
+            },
+            beforeGetData() {
+                if (this.search) {
+                    return {search: this.search};
+                }
+            },
+            toggleMultipleMode(multipleMode) {
+                this.multipleMode = multipleMode;
+                if (!multipleMode) {
+                    this.$refs.table.clearSelection();
+                }
+            },
+            addRow() {
+                this.$router.push({
+                    path: "/deliveryFeeEdit",
+                    query: {
+                        ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/deliveryFeeEdit",
+                    query: {
+                        id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/deliveryFee/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(`/deliveryFee/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>

+ 26 - 0
src/test/java/com/izouma/dingdong/repo/TagRepoTest.java

@@ -0,0 +1,26 @@
+package com.izouma.dingdong.repo;
+
+import com.izouma.dingdong.domain.backstage.Tag;
+import com.izouma.dingdong.repo.backstage.TagRepo;
+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;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class TagRepoTest {
+
+    @Autowired
+    private TagRepo tagRepo;
+
+    @Test
+    public void testSave() {
+        tagRepo.save(Tag.builder()
+                .id(3L)
+                .name("新商家")
+                .enabled(true)
+                .build());
+    }
+}

+ 3 - 2
src/test/java/com/izouma/dingdong/service/AppraisalServiceTest.java

@@ -28,8 +28,9 @@ public class AppraisalServiceTest {
 
 //        System.out.println(shoppingCartRepo.findById(322L).orElse(null));
         Appraisal appraisal = Appraisal.builder()
-                .goodsLike(false)
-                .orderInfoId(1352L)
+                .goodsLike(true)
+                .orderInfoId(1760L)
+                .merchantId(1731L)
                 .goodsAppraise("商品不好,很差")
                 .riderLike(1)
                 .riderAppraise("外卖送货慢!")

+ 1 - 1
src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java

@@ -121,7 +121,7 @@ public class MerchantServiceTest {
         pageQuery.setSearch(null);
         pageQuery.setSort("");
         //118.738275 31.991961
-        List<MerchantDTO> list = merchantSettingsService.showAll(pageQuery, 1.0,1.0 , 1, 82L);
+        List<MerchantDTO> list = merchantSettingsService.showAll(pageQuery, 1.0,1.0 , 1L, 82L);
 
         System.out.println(list.size());
     }