Эх сурвалжийг харах

评价/商家投诉/计算价钱接口

licailing 5 жил өмнө
parent
commit
7192043cb1
37 өөрчлөгдсөн 1384 нэмэгдсэн , 143 устгасан
  1. 4 1
      src/main/java/com/izouma/dingdong/domain/Appraisal.java
  2. 37 0
      src/main/java/com/izouma/dingdong/domain/FastAppraisal.java
  3. 52 0
      src/main/java/com/izouma/dingdong/domain/merchant/MerchantComplaint.java
  4. 37 0
      src/main/java/com/izouma/dingdong/dto/AppraisalRidDTO.java
  5. 40 0
      src/main/java/com/izouma/dingdong/dto/CouponDTO.java
  6. 36 0
      src/main/java/com/izouma/dingdong/dto/ShowAppRidDTO.java
  7. 16 0
      src/main/java/com/izouma/dingdong/repo/FastAppraisalRepo.java
  8. 16 0
      src/main/java/com/izouma/dingdong/repo/merchant/MerchantComplaintRepo.java
  9. 37 4
      src/main/java/com/izouma/dingdong/service/AppraisalService.java
  10. 16 0
      src/main/java/com/izouma/dingdong/service/CouponService.java
  11. 14 0
      src/main/java/com/izouma/dingdong/service/FastAppraisalService.java
  12. 2 6
      src/main/java/com/izouma/dingdong/service/merchant/GoodsService.java
  13. 14 0
      src/main/java/com/izouma/dingdong/service/merchant/MerchantComplaintService.java
  14. 6 3
      src/main/java/com/izouma/dingdong/service/rider/RiderService.java
  15. 15 8
      src/main/java/com/izouma/dingdong/service/user/ShoppingCartService.java
  16. 5 0
      src/main/java/com/izouma/dingdong/utils/MapUtils.java
  17. 12 9
      src/main/java/com/izouma/dingdong/web/AppraisalController.java
  18. 10 5
      src/main/java/com/izouma/dingdong/web/CouponController.java
  19. 60 0
      src/main/java/com/izouma/dingdong/web/FastAppraisalController.java
  20. 63 0
      src/main/java/com/izouma/dingdong/web/merchant/MerchantComplaintController.java
  21. 12 1
      src/main/java/com/izouma/dingdong/web/rider/RiderController.java
  22. 8 0
      src/main/java/com/izouma/dingdong/web/user/ShoppingCartController.java
  23. 1 0
      src/main/resources/genjson/FastAppraisal.json
  24. 1 0
      src/main/resources/genjson/MerchantComplaint.json
  25. 50 0
      src/main/vue/src/components/BlackButton.vue
  26. 2 0
      src/main/vue/src/main.js
  27. 32 0
      src/main/vue/src/router.js
  28. 6 5
      src/main/vue/src/views/CouponList.vue
  29. 98 0
      src/main/vue/src/views/FastAppraisalEdit.vue
  30. 173 0
      src/main/vue/src/views/FastAppraisalList.vue
  31. 108 0
      src/main/vue/src/views/MerchantComplaintEdit.vue
  32. 177 0
      src/main/vue/src/views/MerchantComplaintList.vue
  33. 2 1
      src/main/vue/src/views/OrderInfoEdit.vue
  34. 7 1
      src/main/vue/src/views/merchant/MerchantList.vue
  35. 47 44
      src/main/vue/src/views/rider/RiderEdit.vue
  36. 143 52
      src/main/vue/src/views/rider/RiderList.vue
  37. 25 3
      src/test/java/com/izouma/dingdong/service/RiderServiceTest.java

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

@@ -46,7 +46,10 @@ public class Appraisal extends BaseEntity {
     @ApiModelProperty(value = "骑手评分", name = "riderScore")
     private Integer riderLike;
 
-    @ApiModelProperty(value = "骑手评价", name = "riderAppraise")
+    @ApiModelProperty(value = "骑手快捷内容id", name = "fastIds")
+    private String fastIds;
+
+    @ApiModelProperty(value = "骑手评价内容", name = "riderAppraise")
     private String riderAppraise;
 
 /*    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH)

+ 37 - 0
src/main/java/com/izouma/dingdong/domain/FastAppraisal.java

@@ -0,0 +1,37 @@
+package com.izouma.dingdong.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "快捷评价", description = "快捷评价")
+public class FastAppraisal implements Serializable {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "内容", name = "content")
+    private String content;
+
+    /**
+     * 1-非常差,2-一般,3-超赞
+     */
+    @ApiModelProperty(value = "评价类型", name = "type")
+    private Integer type;
+
+    private Boolean enabled = true;
+}

+ 52 - 0
src/main/java/com/izouma/dingdong/domain/merchant/MerchantComplaint.java

@@ -0,0 +1,52 @@
+package com.izouma.dingdong.domain.merchant;
+
+import com.izouma.dingdong.domain.BaseEntity;
+import com.izouma.dingdong.enums.ComplaintTarget;
+import com.izouma.dingdong.enums.Solution;
+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;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+//@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
+@ApiModel(value = "投诉商家表", description = "投诉商家表")
+public class MerchantComplaint extends BaseEntity {
+    @ApiModelProperty(value = "投诉用户Id",name = "userId")
+    private Long userId;
+
+    @ApiModelProperty(value = "商家ID", name = "merchantId")
+    private Long merchantId;
+
+    @ApiModelProperty(value = "投诉类型", name = "type")
+    private String type;
+
+    @ApiModelProperty(value = "图片", name = "img")
+    private String img;
+
+    @ApiModelProperty(value = "具体内容", name = "content")
+    private String content;
+
+/*    @ApiModelProperty(value = "是否解决", name = "resolve")
+    private Boolean resolve = false;*/
+
+    @ApiModelProperty(value = "投诉时间", name = "time")
+    private LocalDateTime time;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+}

+ 37 - 0
src/main/java/com/izouma/dingdong/dto/AppraisalRidDTO.java

@@ -0,0 +1,37 @@
+package com.izouma.dingdong.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class AppraisalRidDTO {
+
+    @ApiModelProperty(value = "用户昵称", name = "userNickname")
+    private String userNickname;
+
+    @ApiModelProperty(value = "内容", name = "content")
+    private List<String> content;
+
+    @ApiModelProperty(value = "骑手评价内容", name = "riderAppraise")
+    private String riderAppraise;
+
+    @ApiModelProperty(value = "商家名称", name = "merShowName")
+    private String merShowName;
+
+    /**
+     * 1-非常差,2-一般,3-超赞
+     */
+    @ApiModelProperty(value = "骑手评分", name = "riderScore")
+    private Integer riderLike;
+
+    private LocalDate date;
+}

+ 40 - 0
src/main/java/com/izouma/dingdong/dto/CouponDTO.java

@@ -0,0 +1,40 @@
+package com.izouma.dingdong.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Data
+@ApiModel(value = "优惠券", description = "优惠券")
+public class CouponDTO {
+    @ApiModelProperty(value = "优惠券名称", name = "name")
+    private String name;
+
+    @ApiModelProperty(value = "规格", name = "rule")
+    private String rule;
+
+    private LocalDate startDate;
+
+    private LocalDate endDate;
+
+    //商家发的优惠券
+    private String merchantName;
+
+    //优惠券描述
+    private String description;
+
+    @ApiModelProperty(value = "金额", name = "amount")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "满额", name = "fullAmount")
+    private BigDecimal fullAmount;
+}

+ 36 - 0
src/main/java/com/izouma/dingdong/dto/ShowAppRidDTO.java

@@ -0,0 +1,36 @@
+package com.izouma.dingdong.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class ShowAppRidDTO {
+    @ApiModelProperty(value = "头像", name = "avatar")
+    private String avatar;
+
+    @ApiModelProperty(value = "昵称", name = "nickname")
+    private String nickname;
+
+    //非常差
+    @ApiModelProperty(value = "非常差", name = "bad")
+    private Integer bad;
+
+    //一般数量
+    @ApiModelProperty(value = "一般", name = "general")
+    private Integer general;
+
+    //超赞
+    @ApiModelProperty(value = "超赞", name = "awesome")
+    private Integer awesome;
+
+    @ApiModelProperty(value = "内容", name = "content")
+    private List<String> content;
+}

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

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

+ 16 - 0
src/main/java/com/izouma/dingdong/repo/merchant/MerchantComplaintRepo.java

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

+ 37 - 4
src/main/java/com/izouma/dingdong/service/AppraisalService.java

@@ -3,19 +3,23 @@ package com.izouma.dingdong.service;
 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.Appraisal;
 import com.izouma.dingdong.domain.OrderGoodsSpec;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.domain.merchant.Goods;
 import com.izouma.dingdong.dto.AppraisalMerDTO;
+import com.izouma.dingdong.dto.AppraisalRidDTO;
 import com.izouma.dingdong.enums.AppraisalSort;
 import com.izouma.dingdong.enums.OrderStatus;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.AppraisalRepo;
+import com.izouma.dingdong.repo.FastAppraisalRepo;
 import com.izouma.dingdong.repo.OrderGoodsSpecRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.service.merchant.SalesService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -34,6 +38,8 @@ public class AppraisalService {
     private OrderInfoRepo      orderInfoRepo;
     private OrderGoodsSpecRepo orderGoodsSpecRepo;
     private SalesService       salesService;
+    private MerchantRepo       merchantRepo;
+    private FastAppraisalRepo  fastAppraisalRepo;
 
     /*
     客户评价
@@ -74,14 +80,12 @@ public class AppraisalService {
         if (ObjectUtil.isNull(specs)) {
             return null;
         }
-//        List<Appraisal> appraisals = CollUtil.newArrayList();
         List<AppraisalMerDTO> appraisals = CollUtil.newArrayList();
         specs.forEach(s -> {
             Appraisal appraisal = appraisalRepo.findByOrderInfoId(s.getOrderInfoId())
                     .orElseThrow(new BusinessException("无订单"));
             if (ObjectUtil.isNotNull(appraisal)) {
-                appraisals.add(this.toDTO(appraisal));
-//                appraisals.add(appraisal);
+                appraisals.add(this.toMerDTO(appraisal));
             }
         });
         return appraisals;
@@ -93,7 +97,7 @@ public class AppraisalService {
      * @param appraisal 评价
      * @return 商家需要信息的评价dto
      */
-    public AppraisalMerDTO toDTO(Appraisal appraisal) {
+    public AppraisalMerDTO toMerDTO(Appraisal appraisal) {
         OrderInfo order = orderInfoRepo.findById(appraisal.getOrderInfoId()).orElseThrow(new BusinessException("无订单"));
         List<Goods> collect = order.getOrderGoodsSpecs()
                 .stream()
@@ -162,5 +166,34 @@ public class AppraisalService {
         return appraisals1;
     }
 
+    public List<AppraisalRidDTO> showRider(Long riderId) {
+        List<Appraisal> appraisals = appraisalRepo.findAllByRiderId(riderId);
+        return appraisals.stream().map(this::toRidDTO).collect(Collectors.toList());
+    }
+
+    public AppraisalRidDTO toRidDTO(Appraisal a) {
+        AppraisalRidDTO ridDTO = AppraisalRidDTO
+                .builder()
+                .riderLike(a.getRiderLike())
+                .userNickname("匿名")
+                .riderAppraise(a.getRiderAppraise())
+                .date(a.getAppraiseTime().toLocalDate())
+                .build();
 
+        //商家用户名
+        merchantRepo.findById(a.getMerchantId())
+                .ifPresent(m -> ridDTO.setMerShowName(m.getShowName()));
+
+        if (ObjectUtil.isNotEmpty(a.getFastIds())) {
+            List<String> content = new ArrayList<>();
+            LongArrayConverter converter = new LongArrayConverter();
+            List<Long> longs = converter.convertToEntityAttribute(a.getFastIds());
+            longs.forEach(l ->
+                    //快捷内容
+                    fastAppraisalRepo.findById(l).ifPresent(f -> content.add(f.getContent()))
+            );
+            ridDTO.setContent(content);
+        }
+        return ridDTO;
+    }
 }

+ 16 - 0
src/main/java/com/izouma/dingdong/service/CouponService.java

@@ -1,7 +1,10 @@
 package com.izouma.dingdong.service;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.izouma.dingdong.domain.Coupon;
+import com.izouma.dingdong.dto.CouponDTO;
 import com.izouma.dingdong.repo.CouponRepo;
+import com.izouma.dingdong.repo.merchant.MerchantRepo;
 import com.izouma.dingdong.service.merchant.MerchantService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -17,6 +20,7 @@ public class CouponService {
 
     private CouponRepo      couponRepo;
     private MerchantService merchantService;
+    private MerchantRepo    merchantRepo;
 
     public List<Coupon> my(Long userId, Boolean isAll) {
         Long merchantId = merchantService.findMerchantId(userId);
@@ -29,4 +33,16 @@ public class CouponService {
         return coupons.stream().filter(c -> !c.getEndDate().isBefore(LocalDate.now())).collect(Collectors.toList());
     }
 
+    public CouponDTO toDTO(Coupon coupon) {
+        CouponDTO dto = new CouponDTO();
+        BeanUtil.copyProperties(coupon, dto);
+        if (coupon.getFullAmount() == null) {
+            dto.setDescription("无使用限制");
+        } else {
+            dto.setDescription("满" + coupon.getFullAmount() + "减" + coupon.getAmount());
+        }
+        merchantRepo.findById(coupon.getMerchantId()).ifPresent(m -> dto.setMerchantName(m.getShowName()));
+        return dto;
+    }
+
 }

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

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.domain.FastAppraisal;
+import com.izouma.dingdong.repo.FastAppraisalRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class FastAppraisalService {
+
+    private FastAppraisalRepo fastAppraisalRepo;
+
+}

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

@@ -361,12 +361,8 @@ public class GoodsService {
                 }
             });
             cartId.forEach(c -> {
-                //查找购物车
-                ShoppingCart shoppingCart = shoppingCartRepo.findById(c).orElse(null);
-                if (ObjectUtil.isNotNull(shoppingCart)) {
-                    //改价格
-                    shoppingCartService.calculatePrice(c, orig.getMerchantId());
-                }
+                //查找购物车  改价格
+                shoppingCartRepo.findById(c).ifPresent(s -> shoppingCartService.calculatePrice(c, null, null));
             });
         }
 

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

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service.merchant;
+
+import com.izouma.dingdong.domain.merchant.MerchantComplaint;
+import com.izouma.dingdong.repo.merchant.MerchantComplaintRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class MerchantComplaintService {
+
+    private MerchantComplaintRepo merchantComplaintRepo;
+
+}

+ 6 - 3
src/main/java/com/izouma/dingdong/service/rider/RiderService.java

@@ -9,7 +9,6 @@ import com.izouma.dingdong.domain.rider.Rider;
 import com.izouma.dingdong.domain.rider.RiderLocation;
 import com.izouma.dingdong.domain.rider.RiderSign;
 import com.izouma.dingdong.dto.RiderDTO;
-import com.izouma.dingdong.dto.RiderDistanceDTO;
 import com.izouma.dingdong.enums.*;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.MoneyRecordRepo;
@@ -49,8 +48,12 @@ public class RiderService {
      */
     public Rider riderApply(RiderDTO riderDTO) {
         userRepo.findById(riderDTO.getUserId()).orElseThrow(new BusinessException("无用户"));
+
+        if (riderRepo.findByUserId(riderDTO.getUserId()).isPresent()) {
+            throw new BusinessException("已申请");
+        }
         Rider rider = new Rider();
-        BeanUtil.copyProperties(rider, riderDTO);
+        BeanUtil.copyProperties(riderDTO, rider);
         rider.setBlacklist(false);
         rider.setEnabled(true);
         //rider.setSignIn(false);
@@ -68,7 +71,7 @@ public class RiderService {
             //boolean i = true;
             while (true) {
                 //随机生成骑手工号 一个首字母+四个数字
-                String jobNumber1 = RandomStringUtils.randomAlphabetic(1);
+                String jobNumber1 = RandomStringUtils.randomAlphabetic(1).toUpperCase();
                 String jobNumber2 = RandomStringUtils.randomNumeric(4);
                 String jobNumber = jobNumber1 + jobNumber2;
                 Rider byJobNumber = riderRepo.findByJobNumber(jobNumber);

+ 15 - 8
src/main/java/com/izouma/dingdong/service/user/ShoppingCartService.java

@@ -75,10 +75,12 @@ public class ShoppingCartService {
     }
 
     //计算价钱
-    public ShoppingCart calculatePrice(Long cartId, Long merchantId) {
+    public ShoppingCart calculatePrice(Long cartId, Double longitude, Double latitude) {
 
         //购物车
         ShoppingCart cart = shoppingCartRepo.findById(cartId).orElseThrow(new BusinessException("无购物车"));
+        Long merchantId = cart.getMerchantId();
+
         List<OrderGoodsSpec> specs = cart.getOrderGoodsSpecs();
 
         //商品总价 商品实际
@@ -159,8 +161,15 @@ public class ShoppingCartService {
             sub2 = sub2.add(cart.getFirstBuy());
         }
 
+        if (longitude != null && latitude != null) {
+            BigDecimal deliveryFee = deliveryFeeService.deliveryFee(merchantId, specs, longitude, latitude);
+            cart.setDeliveryAmount(deliveryFee);
+        }
         cart.setGoodsTotal(goodsTotal);
         cart.setReducedAmount(sub2);
+        if (cart.getDeliveryAmount() == null) {
+            throw new BusinessException("无运费");
+        }
         cart.setRealAmount(total.subtract(sub2).add(cart.getDeliveryAmount()));
 
         return shoppingCartRepo.save(cart);
@@ -211,24 +220,23 @@ public class ShoppingCartService {
         }
 
         //配送费计算
-        BigDecimal deliveryFee = deliveryFeeService.deliveryFee(merchantId, specs, longitude, latitude);
-        shoppingCart.setDeliveryAmount(deliveryFee);
+        //BigDecimal deliveryFee = deliveryFeeService.deliveryFee(merchantId, specs, longitude, latitude);
+        //shoppingCart.setDeliveryAmount(deliveryFee);
 
         ShoppingCart save = shoppingCartRepo.save(shoppingCart);
 
         this.changeOrderSpec(save, orderGoodsSpec);
 
-        return this.calculatePrice(save.getId(), save.getMerchantId());
+        return this.calculatePrice(save.getId(), longitude, latitude);
     }
 
     //减规格
     public ShoppingCart sub(Long specId) {
         OrderGoodsSpec spec = orderGoodsSpecRepo.findById(specId).orElseThrow(new BusinessException("无订单详情"));
-        Long merchantId = spec.getGoods().getMerchantId();
         Long cartId = spec.getShoppingCartId();
         orderGoodsSpecRepo.deleteById(specId);
         //shoppingCartRepo.findById(spec.getShoppingCartId());
-        return this.calculatePrice(cartId, merchantId);
+        return this.calculatePrice(cartId, null, null);
     }
 
     /*
@@ -257,13 +265,12 @@ public class ShoppingCartService {
      */
     public ShoppingCart changeNum(Long specId, Integer num) {
         OrderGoodsSpec spec = orderGoodsSpecRepo.findById(specId).orElseThrow(new BusinessException("无订单详情"));
-        Long merchantId = spec.getGoods().getMerchantId();
         Long cartId = spec.getShoppingCartId();
 
         spec.setNum(num);
         orderGoodsSpecRepo.save(spec);
 
-        return this.calculatePrice(cartId, merchantId);
+        return this.calculatePrice(cartId, null, null);
     }
 
 }

+ 5 - 0
src/main/java/com/izouma/dingdong/utils/MapUtils.java

@@ -1,5 +1,7 @@
 package com.izouma.dingdong.utils;
 
+import com.izouma.dingdong.exception.BusinessException;
+
 public class MapUtils {
     //地球半径
     private static final Double EARTH_RADIUS = 6378.137;
@@ -14,6 +16,9 @@ public class MapUtils {
      * @return 距离
      */
     public static Double distance(Double longitude1, Double latitude1, Double longitude2, Double latitude2) {
+        if (latitude1 == null || latitude2 == null || longitude1 == null || longitude2 == null) {
+            throw new BusinessException("经纬度为空");
+        }
         double radLat1 = latitude1 * Math.PI / 180.0;
         double radLat2 = latitude2 * Math.PI / 180.0;
         double a = radLat1 - radLat2;

+ 12 - 9
src/main/java/com/izouma/dingdong/web/AppraisalController.java

@@ -2,24 +2,21 @@ package com.izouma.dingdong.web;
 
 import com.izouma.dingdong.domain.Appraisal;
 import com.izouma.dingdong.dto.AppraisalMerDTO;
+import com.izouma.dingdong.dto.AppraisalRidDTO;
 import com.izouma.dingdong.enums.AppraisalSort;
 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;
 import java.util.stream.Collectors;
 
@@ -28,8 +25,7 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class AppraisalController extends BaseController {
     private AppraisalService appraisalService;
-    private AppraisalRepo appraisalRepo;
-    private MerchantService merchantService;
+    private AppraisalRepo    appraisalRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -83,15 +79,16 @@ public class AppraisalController extends BaseController {
 
     /**
      * 显示所有评价
-     * @param appraisalSort  排序规则
+     *
+     * @param appraisalSort 排序规则
      * @return 所有
      */
     @GetMapping("/my")
     @ApiOperation("显示商户的所有评价")
-    public List<AppraisalMerDTO> my(@RequestParam Long merchantId,@RequestParam AppraisalSort appraisalSort) {
+    public List<AppraisalMerDTO> my(@RequestParam Long merchantId, @RequestParam AppraisalSort appraisalSort) {
         //List<Appraisal> allByMerchantId = appraisalRepo.findAllByMerchantId(merchantService.findMerchantId(SecurityUtils.getAuthenticatedUser().getId()));
         List<Appraisal> appraisals = appraisalService.appraisalsSort(merchantId, appraisalSort);
-        return appraisals.stream().map(appraisalService::toDTO).collect(Collectors.toList());
+        return appraisals.stream().map(appraisalService::toMerDTO).collect(Collectors.toList());
 
     }
 
@@ -107,5 +104,11 @@ public class AppraisalController extends BaseController {
         return appraisalService.goodsAppraisals(goodsId);
     }
 
+    @GetMapping("/riderList")
+    @ApiOperation("显示骑手的所有评价")
+    public List<AppraisalRidDTO> riderList(@RequestParam Long riderId) {
+        return appraisalService.showRider(riderId);
+    }
+
 }
 

+ 10 - 5
src/main/java/com/izouma/dingdong/web/CouponController.java

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.web;
 
+import com.izouma.dingdong.dto.CouponDTO;
 import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.domain.Coupon;
 import com.izouma.dingdong.service.CouponService;
@@ -25,7 +26,7 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class CouponController extends BaseController {
     private CouponService couponService;
-    private CouponRepo couponRepo;
+    private CouponRepo    couponRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -41,10 +42,14 @@ public class CouponController extends BaseController {
 
     //@PreAuthorize("hasRole('ADMIN')")
     @GetMapping("/all")
-    public Page<Coupon> all(PageQuery pageQuery) {
+    public Page<CouponDTO> all(PageQuery pageQuery) {
         //return couponRepo.findAll(toSpecification(pageQuery,Coupon.class),toPageRequest(pageQuery));
-        List<Coupon> collect = couponRepo.findAll(toSpecification(pageQuery, Coupon.class)).stream().filter(Coupon::getEnabled).collect(Collectors.toList());
-        return new PageImpl<>(collect, toPageRequest(pageQuery), pageQuery.getSize());
+        List<Coupon> collect = couponRepo.findAll(toSpecification(pageQuery, Coupon.class))
+                .stream()
+                .filter(Coupon::getEnabled)
+                .collect(Collectors.toList());
+        List<CouponDTO> dtos = collect.stream().map(couponService::toDTO).collect(Collectors.toList());
+        return new PageImpl<>(dtos, toPageRequest(pageQuery), pageQuery.getSize());
     }
 
     @GetMapping("/get/{id}")
@@ -60,7 +65,7 @@ public class CouponController extends BaseController {
     @GetMapping("/excel")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<Coupon> data = all(pageQuery).getContent();
+        List<CouponDTO> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
 

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

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

+ 63 - 0
src/main/java/com/izouma/dingdong/web/merchant/MerchantComplaintController.java

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

+ 12 - 1
src/main/java/com/izouma/dingdong/web/rider/RiderController.java

@@ -13,7 +13,6 @@ 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;
@@ -74,5 +73,17 @@ public class RiderController extends BaseController {
         riderService.dispatch(orderId);
     }
 
+
+    @ApiOperation("骑手信息")
+    public void riderInfo(Long riderId) {
+        Rider rider = riderRepo.findById(riderId).orElseThrow(new BusinessException("无骑手"));
+
+    }
+
+    @GetMapping("/audit")
+    @ApiOperation("审核骑手")
+    public String audit(Long id, Boolean pass, String reason) {
+        return riderService.riderAudit(id, pass, reason);
+    }
 }
 

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

@@ -16,6 +16,7 @@ import com.izouma.dingdong.utils.ObjUtils;
 import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.utils.excel.ExcelUtils;
 import com.izouma.dingdong.web.BaseController;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
@@ -24,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -139,5 +141,11 @@ public class ShoppingCartController extends BaseController {
     public ShoppingCart changeNum(Long specId, Integer num) {
         return shoppingCartService.changeNum(specId, num);
     }
+
+    @GetMapping("/calculatePrice")
+    @ApiOperation("计算价钱")
+    public ShoppingCart calculatePrice(Long cartId, Double longitude, Double latitude) {
+        return shoppingCartService.calculatePrice(cartId, longitude, latitude);
+    }
 }
 

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

@@ -0,0 +1 @@
+{"tableName":"FastAppraisal","className":"FastAppraisal","remark":"骑手快捷评价","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/java/com/izouma/dingdong","viewPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"content","modelName":"content","remark":"内容","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"type","modelName":"type","remark":"评价类型","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{label:\"非常差\",value:1},{label:\"一般\",value:2},{label:\"超赞\",value:3}"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.FastAppraisal"}

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

@@ -0,0 +1 @@
+{"tableName":"MerchantComplaint","className":"MerchantComplaint","remark":"商家投诉表","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/java/com/izouma/dingdong","viewPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/dingdong/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"投诉用户","showInList":true,"showInForm":true,"formType":"number"},{"name":"merchantId","modelName":"merchantId","remark":"商家ID","showInList":true,"showInForm":true,"formType":"number"},{"name":"type","modelName":"type","remark":"投诉类型","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"img","modelName":"img","remark":"图片","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"content","modelName":"content","remark":"具体内容","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"time","modelName":"time","remark":"投诉时间","showInList":true,"showInForm":true,"formType":"datetime"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.merchant.MerchantComplaint","genPackage":"merchant"}

+ 50 - 0
src/main/vue/src/components/BlackButton.vue

@@ -0,0 +1,50 @@
+<template>
+    <el-button @click="moveRow"
+               type="danger" v-if="this.$route.query.id && !this.$route.query.blacklist">移入黑名单
+    </el-button>
+</template>
+<script>
+
+    export default {
+        data() {
+            return {
+
+            }
+        },
+        mounted() {
+
+        },
+        methods: {
+            moveRow() {
+                this.$prompt('请输入理由', '提示', {
+                    inputType: 'textarea'
+                })
+                    .then(res => {
+                        // console.log(res);
+                        if (res.value) {
+                            this.$alert('确定拉入黑名单?', '提示', {
+                                showCancelButton: true
+                            })
+                                .then(() => {
+                                    return this.$http.post('/blackList/move', {
+                                        userId: this.$route.query.id,
+                                        reason: res.value
+                                    });
+                                })
+                                .then(res => {
+                                    this.$message.success('拉入黑名单成功');
+                                    this.$router.go(-1);
+                                })
+                                .catch(() => {
+                                    this.$message.error(res.error || '拉入黑名单失败');
+                                });
+                        }
+                    })
+                    .catch(() => {
+                    });
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 2 - 0
src/main/vue/src/main.js

@@ -13,6 +13,7 @@ import CropUpload from '@/components/CropUpload';
 import Formatters from '@/mixins/formatters';
 import 'normalize.css/normalize.css';
 import 'element-ui/lib/theme-chalk/index.css';
+import BlackButton from "./components/BlackButton";
 
 Vue.config.productionTip = false;
 Vue.use(ElementUI, { size: 'small' });
@@ -23,6 +24,7 @@ Vue.component('single-upload', SingleUpload);
 Vue.component('file-upload', FileUpload);
 Vue.component('rich-text', RichText);
 Vue.component('crop-upload', CropUpload);
+Vue.component('black-button', BlackButton);
 Vue.mixin(Formatters);
 
 new Vue({

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

@@ -446,6 +446,38 @@ const router = new Router({
                     meta: {
                        title: '骑手签到',
                     },
+               },
+                {
+                    path: '/fastAppraisalEdit',
+                    name: 'FastAppraisalEdit',
+                    component: () => import(/* webpackChunkName: "fastAppraisalEdit" */ '@/views/FastAppraisalEdit.vue'),
+                    meta: {
+                       title: '骑手快捷评价编辑',
+                    },
+                },
+                {
+                    path: '/fastAppraisalList',
+                    name: 'FastAppraisalList',
+                    component: () => import(/* webpackChunkName: "fastAppraisalList" */ '@/views/FastAppraisalList.vue'),
+                    meta: {
+                       title: '骑手快捷评价',
+                    },
+               },
+                {
+                    path: '/merchantComplaintEdit',
+                    name: 'MerchantComplaintEdit',
+                    component: () => import(/* webpackChunkName: "merchantComplaintEdit" */ '@/views/MerchantComplaintEdit.vue'),
+                    meta: {
+                       title: '商家投诉表编辑',
+                    },
+                },
+                {
+                    path: '/merchantComplaintList',
+                    name: 'MerchantComplaintList',
+                    component: () => import(/* webpackChunkName: "merchantComplaintList" */ '@/views/MerchantComplaintList.vue'),
+                    meta: {
+                       title: '商家投诉表',
+                    },
                }
                 /**INSERT_LOCATION**/,
                 {

+ 6 - 5
src/main/vue/src/views/CouponList.vue

@@ -29,6 +29,9 @@
             <el-table-column prop="amount" label="金额"
             >
             </el-table-column>
+            <el-table-column prop="fullAmount" label="满额"
+            >
+            </el-table-column>
             <el-table-column prop="startDate" label="开始时间"
                              :formatter="dateFormatter"
             >
@@ -48,13 +51,11 @@
             <!--                            :formatter="typeFormatter"-->
             <!--                        >-->
             <!--                    </el-table-column>-->
-            <el-table-column prop="fullAmount" label="满额"
+
+            <el-table-column prop="description" label="规格"
             >
             </el-table-column>
-            <!--                    <el-table-column prop="discount" label="折扣"-->
-            <!--&gt;-->
-            <!--                    </el-table-column>-->
-            <el-table-column prop="merchantId" label="商家ID"
+            <el-table-column prop="merchantName" label="商家"
             >
             </el-table-column>
             <el-table-column

+ 98 - 0
src/main/vue/src/views/FastAppraisalEdit.vue

@@ -0,0 +1,98 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+            <el-form-item prop="content" label="内容">
+                <el-input v-model="formData.content"></el-input>
+            </el-form-item>
+            <el-form-item prop="type" label="评价类型">
+                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                    <el-option
+                            v-for="item in typeOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <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: 'FastAppraisalEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('fastAppraisal/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: 1}, {label: "一般", value: 2}, {label: "超赞", value: 3}],
+            }
+        },
+        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('/fastAppraisal/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(`/fastAppraisal/del/${this.formData.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                }).catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 173 - 0
src/main/vue/src/views/FastAppraisalList.vue

@@ -0,0 +1,173 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable
+                      class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search"
+                       class="filter-item">搜索
+            </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus"
+                       class="filter-item">添加
+            </el-button>
+        </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="content" label="内容"
+            >
+            </el-table-column>
+            <el-table-column prop="type" label="评价类型"
+                             :formatter="typeFormatter"
+            >
+            </el-table-column>
+            <el-table-column
+                    label="操作"
+                    align="center"
+                    fixed="right"
+                    min-width="150">
+                <template slot-scope="{row}">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import {mapState} from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'FastAppraisalList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/fastAppraisal/all",
+                downloading: false,
+                typeOptions: [{label: "非常差", value: 1}, {label: "一般", value: 2}, {label: "超赞", value: 3}],
+            }
+        },
+        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: "/fastAppraisalEdit",
+                    query: {
+                        ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/fastAppraisalEdit",
+                    query: {
+                        id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/fastAppraisal/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(`/fastAppraisal/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>

+ 108 - 0
src/main/vue/src/views/MerchantComplaintEdit.vue

@@ -0,0 +1,108 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="80px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="userId" label="投诉用户">
+                            <el-input-number type="number" v-model="formData.userId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="merchantId" label="商家ID">
+                            <el-input-number type="number" v-model="formData.merchantId"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="type" label="投诉类型">
+                            <el-input v-model="formData.type"></el-input>
+                </el-form-item>
+                <el-form-item prop="img" label="图片">
+                            <el-input v-model="formData.img"></el-input>
+                </el-form-item>
+                <el-form-item prop="content" label="具体内容">
+                            <el-input v-model="formData.content"></el-input>
+                </el-form-item>
+                <el-form-item prop="time" label="投诉时间">
+                            <el-date-picker
+                                    v-model="formData.time"
+                                    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: 'MerchantComplaintEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('merchantComplaint/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('/merchantComplaint/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(`/merchantComplaint/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>

+ 177 - 0
src/main/vue/src/views/MerchantComplaintList.vue

@@ -0,0 +1,177 @@
+<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="userId" label="投诉用户"
+>
+                    </el-table-column>
+                    <el-table-column prop="merchantId" label="商家ID"
+>
+                    </el-table-column>
+                    <el-table-column prop="type" label="投诉类型"
+>
+                    </el-table-column>
+                    <el-table-column prop="img" label="图片"
+>
+                    </el-table-column>
+                    <el-table-column prop="content" label="具体内容"
+>
+                    </el-table-column>
+                    <el-table-column prop="time" 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: 'MerchantComplaintList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/merchantComplaint/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: "/merchantComplaintEdit",
+                    query: {
+                    ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/merchantComplaintEdit",
+                    query: {
+                    id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/merchantComplaint/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(`/merchantComplaint/del/${row.id}`)
+                }).then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                }).catch(action => {
+                    if (action === 'cancel') {
+                        this.$message.info('删除取消');
+                    } else {
+                        this.$message.error('删除失败');
+                    }
+                })
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

+ 2 - 1
src/main/vue/src/views/OrderInfoEdit.vue

@@ -19,7 +19,7 @@
             <!--            </el-form-item>-->
             <el-form-item prop="jobNumber" label="骑手工号">
                 <el-input v-model="formData.riderId"></el-input>
-                <el-button type="primary" @click="changeStatus">{{formData.riderStatus}}</el-button>
+                <!--<el-button type="primary" @click="changeStatus">{{formData.riderStatus}}</el-button>-->
             </el-form-item>
 
             <!--      <el-form-item prop="riderStatus" label="骑手状态">
@@ -165,6 +165,7 @@
                 formData: {},
                 rules: {},
                 riderStatusOptions: [
+                    {"label": "未接单", "value": "NOT_RECEIVED"},
                     {"label": "接单中", "value": "RECEIVED"},
                     {"label": "取餐中", "value": "TAKE_MEAL"},
                     {"label": "送餐中", "value": "MEAL_DELIVERY"},

+ 7 - 1
src/main/vue/src/views/merchant/MerchantList.vue

@@ -449,7 +449,13 @@
                 })
             },
             audit(row, pass) {
-                this.$prompt('请输入推广语(最多15字)', '提示', {
+                let remark;
+                if (pass){
+                    remark = '请输入推广语(最多15字)';
+                }else {
+                    remark = '请输入不通过理由'
+                }
+                this.$prompt(remark, '提示', {
                     inputType: 'textarea'
                 })
                     .then(res => {

+ 47 - 44
src/main/vue/src/views/rider/RiderEdit.vue

@@ -2,63 +2,68 @@
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="66px" label-position="right" size="small"
                  style="max-width: 500px;">
-                <el-form-item prop="userId" label="用户ID">
-                            <el-input-number type="number" v-model="formData.userId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="jobNumber" label="工号">
-                            <el-input-number type="number" v-model="formData.jobNumber"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="area" label="区域">
-                            <el-input v-model="formData.area"></el-input>
-                </el-form-item>
-                <el-form-item prop="signIn" label="签到">
-                            <el-switch v-model="formData.signIn"></el-switch>
-                </el-form-item>
-                <el-form-item prop="experience" label="经验值">
-                            <el-input v-model="formData.experience"></el-input>
-                </el-form-item>
-                <el-form-item prop="level" label="等级">
-                            <el-input v-model="formData.level"></el-input>
-                </el-form-item>
-                <el-form-item prop="monetary" label="货币">
-                            <el-input-number type="number" v-model="formData.monetary"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="singular" label="成单数">
-                            <el-input v-model="formData.singular"></el-input>
-                </el-form-item>
-                <el-form-item prop="distance" label="距离">
-                            <el-input v-model="formData.distance"></el-input>
-                </el-form-item>
-                <el-form-item prop="goodReview" label="好评数">
-                            <el-input v-model="formData.goodReview"></el-input>
-                </el-form-item>
-                <el-form-item prop="badReview" label="差评数">
-                            <el-input v-model="formData.badReview"></el-input>
-                </el-form-item>
-                <el-form-item prop="operate" label="操作">
+            <el-form-item prop="userId" label="用户ID">
+                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="jobNumber" label="工号">
+                <el-input-number type="number" v-model="formData.jobNumber"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="area" label="区域">
+                <el-input v-model="formData.area"></el-input>
+            </el-form-item>
+            <el-form-item prop="motorcycleImg" label="摩托车图片">
+                <el-switch v-model="formData.motorcycleImg"></el-switch>
+            </el-form-item>
+            <el-form-item prop="licensePlateImg" label="车牌照片">
+                <el-input v-model="formData.licensePlateImg"></el-input>
+            </el-form-item>
+            <el-form-item prop="driverLicenseImg" label="驾照照片">
+                <el-input v-model="formData.driverLicenseImg"></el-input>
+            </el-form-item>
+            <!--               <el-form-item prop="money" label="货币">
+                                        <el-input-number type="number" v-model="formData.user.money"></el-input-number>
+                            </el-form-item>-->
+            <!--                 <el-form-item prop="singular" label="成单数">
+                                        <el-input v-model="formData.singular"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="distance" label="距离">
+                                        <el-input v-model="formData.distance"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="goodReview" label="好评数">
+                                        <el-input v-model="formData.goodReview"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="badReview" label="差评数">
+                                        <el-input v-model="formData.badReview"></el-input>
+                            </el-form-item>-->
+            <!--            <el-form-item prop="operate" label="操作">
                             <el-input v-model="formData.operate"></el-input>
-                </el-form-item>
-                <el-form-item prop="blacklist" label="黑名单">
-                            <el-switch v-model="formData.blacklist"></el-switch>
-                </el-form-item>
+                        </el-form-item>-->
+<!--            <el-form-item prop="blacklist" label="黑名单">
+                <el-switch v-model="formData.blacklist"></el-switch>
+            </el-form-item>-->
+
             <el-form-item>
                 <el-button @click="onSave" :loading="saving"
-                           type="primary">保存</el-button>
+                           type="primary">保存
+                </el-button>
                 <el-button @click="onDelete" :loading="saving"
                            type="danger" v-if="formData.id">删除
                 </el-button>
+
+                <black-button></black-button>
                 <el-button @click="$router.go(-1)">取消</el-button>
             </el-form-item>
         </el-form>
     </div>
 </template>
 <script>
+
     export default {
         name: 'RiderEdit',
         created() {
             if (this.$route.query.id) {
                 this.$http
-                    .get('rider/get/'+this.$route.query.id)
+                    .get('rider/get/' + this.$route.query.id)
                     .then(res => {
                         this.formData = res;
                     })
@@ -71,10 +76,8 @@
         data() {
             return {
                 saving: false,
-                formData: {
-                },
-                rules: {
-                },
+                formData: {},
+                rules: {},
             }
         },
         methods: {

+ 143 - 52
src/main/vue/src/views/rider/RiderList.vue

@@ -1,5 +1,5 @@
 <template>
-    <div  class="list-view">
+    <div class="list-view">
         <div class="filters-container">
             <el-input placeholder="输入关键字" v-model="search" clearable
                       class="filter-item"></el-input>
@@ -23,51 +23,76 @@
             </el-table-column>
             <el-table-column prop="id" label="ID" width="100">
             </el-table-column>
-                                <el-table-column prop="userId" label="用户ID"
->
-                    </el-table-column>
-                    <el-table-column prop="jobNumber" label="工号"
->
-                    </el-table-column>
-                    <el-table-column prop="area" label="区域"
->
-                    </el-table-column>
-                    <el-table-column prop="signIn" label="签到"
->
-                            <template slot-scope="{row}">
-                                <el-tag :type="row.signIn?'':'info'">{{row.signIn}}</el-tag>
-                            </template>
-                    </el-table-column>
-                    <el-table-column prop="experience" label="经验值"
->
-                    </el-table-column>
-                    <el-table-column prop="level" label="等级"
->
-                    </el-table-column>
-                    <el-table-column prop="monetary" label="货币"
->
-                    </el-table-column>
-                    <el-table-column prop="singular" label="成单数"
->
-                    </el-table-column>
-                    <el-table-column prop="distance" label="距离"
->
-                    </el-table-column>
-                    <el-table-column prop="goodReview" label="好评数"
->
-                    </el-table-column>
-                    <el-table-column prop="badReview" label="差评数"
->
-                    </el-table-column>
-                    <el-table-column prop="operate" label="操作"
->
-                    </el-table-column>
-<!--                    <el-table-column prop="blacklist" label="黑名单"
->
-                            <template slot-scope="{row}">
-                                <el-tag :type="row.blacklist?'':'info'">{{row.blacklist}}</el-tag>
-                            </template>
-                    </el-table-column>-->
+            <el-table-column prop="user.nickname" label="昵称"
+            >
+            </el-table-column>
+            <el-table-column label="头像" min-width="100">
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.user.avatar" fit="cover"
+                              :preview-src-list="[row.user.avatar]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="user.phone" label="手机"
+            >
+            </el-table-column>
+            <el-table-column prop="jobNumber" label="工号"
+            >
+            </el-table-column>
+            <el-table-column prop="area" label="区域"
+            >
+            </el-table-column>
+            <!--                    <el-table-column prop="signIn" label="签到"
+            >
+                                        <template slot-scope="{row}">
+                                            <el-tag :type="row.signIn?'':'info'">{{row.signIn}}</el-tag>
+                                        </template>
+                                </el-table-column>-->
+            <!--                    <el-table-column prop="area" label="工作地点"
+            >
+                                </el-table-column>-->
+            <el-table-column prop="motorcycleImg" label="摩托车图片"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.motorcycleImg" fit="cover"
+                              :preview-src-list="[row.motorcycleImg]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="licensePlateImg" label="车牌照片"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.licensePlateImg" fit="cover"
+                              :preview-src-list="[row.licensePlateImg]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="driverLicenseImg" label="驾照照片"
+            >
+                <template slot-scope="{row}">
+                    <el-image style="width: 30px; height: 30px"
+                              :src="row.driverLicenseImg" fit="cover"
+                              :preview-src-list="[row.driverLicenseImg]"></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="status" label="状态"
+            >
+            </el-table-column>
+            <!--                    <el-table-column prop="goodReview" label="好评数"
+            >
+                                </el-table-column>
+                                <el-table-column prop="badReview" label="差评数"
+            >
+                                </el-table-column>
+                                <el-table-column prop="operate" label="操作"
+            >
+                                </el-table-column>-->
+            <!--                    <el-table-column prop="blacklist" label="黑名单"
+            >
+                                        <template slot-scope="{row}">
+                                            <el-tag :type="row.blacklist?'':'info'">{{row.blacklist}}</el-tag>
+                                        </template>
+                                </el-table-column>-->
             <el-table-column
                     label="操作"
                     align="center"
@@ -76,6 +101,25 @@
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            :loading="row.loading"
+                            @click="audit(row, true)"
+                            type="warning"
+                            size="mini"
+                            plain
+                    >通过
+                    </el-button
+                    >
+                    <el-button
+                            v-if="row.status === 'PENDING'"
+                            @click="deny(row)"
+                            type="danger"
+                            size="mini"
+                            plain
+                    >拒绝
+                    </el-button
+                    >
                 </template>
             </el-table-column>
         </el-table>
@@ -99,7 +143,7 @@
     </div>
 </template>
 <script>
-    import { mapState } from "vuex";
+    import {mapState} from "vuex";
     import pageableTable from "@/mixins/pageableTable";
 
     export default {
@@ -124,7 +168,7 @@
         methods: {
             beforeGetData() {
                 if (this.search) {
-                    return { search: this.search };
+                    return {search: this.search};
                 }
             },
             toggleMultipleMode(multipleMode) {
@@ -137,7 +181,7 @@
                 this.$router.push({
                     path: "/riderEdit",
                     query: {
-                    ...this.$route.query
+                        ...this.$route.query
                     }
                 });
             },
@@ -145,16 +189,16 @@
                 this.$router.push({
                     path: "/riderEdit",
                     query: {
-                    id: row.id
+                        id: row.id
                     }
                 });
             },
             download() {
                 this.downloading = true;
                 this.$axios
-                    .get("/rider/excel", { 
+                    .get("/rider/excel", {
                         responseType: "blob",
-                        params: { size: 10000 }
+                        params: {size: 10000}
                     })
                     .then(res => {
                         console.log(res);
@@ -199,6 +243,53 @@
                     }
                 })
             },
+            audit(row, pass) {
+                this.$set(row, 'loading', true);
+                this.$http
+                    .get('/rider/audit', {
+                        id: row.id,
+                        pass: pass
+                    })
+                    .then(res => {
+                        this.$set(row, 'loading', false);
+                        this.$message.success('OK');
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.$set(row, 'loading', false);
+                        this.$message.error(e.error);
+                    });
+            },
+            deny(row) {
+                this.$prompt('请输入理由', '提示', {
+                    inputType: 'textarea'
+                })
+                    .then(res => {
+                        // console.log(res);
+                        if (res.value) {
+                            this.$alert('确定拒绝通过?', '提示', {
+                                showCancelButton: true
+                            })
+                                .then(() => {
+                                    return this.$http.get('/rider/audit', {
+                                        id: row.id,
+                                        pass: false,
+                                        reason: res.value
+                                    });
+                                })
+                                .then(res => {
+                                    this.$message.success('成功');
+                                    this.$router.go(0);
+                                })
+                                .catch(() => {
+                                    this.$message.error(res.error || '失败');
+                                });
+                        }
+                    })
+                    .catch(() => {
+                    });
+            },
         }
     }
 </script>

+ 25 - 3
src/test/java/com/izouma/dingdong/service/RiderServiceTest.java

@@ -1,8 +1,11 @@
 package com.izouma.dingdong.service;
 
-import org.apache.commons.lang3.RandomStringUtils;
+import com.izouma.dingdong.dto.RiderDTO;
+import com.izouma.dingdong.repo.rider.RiderRepo;
+import com.izouma.dingdong.service.rider.RiderService;
 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.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.test.context.junit4.SpringRunner;
@@ -11,13 +14,32 @@ import org.springframework.test.context.junit4.SpringRunner;
 @SpringBootTest
 public class RiderServiceTest {
 
+    @Autowired
+    private RiderService riderService;
+    @Autowired
+    private RiderRepo    riderRepo;
+
     @Test
-    public void test(){
+    public void test() {
 
         String encode = new BCryptPasswordEncoder().encode("123456");
         String str = "123456";
-        System.out.println(new BCryptPasswordEncoder().matches(str,encode));
+        System.out.println(new BCryptPasswordEncoder().matches(str, encode));
 //        System.out.println(RandomStringUtils.randomAlphabetic(1));
 //        System.out.println(RandomStringUtils.randomNumeric(4));
     }
+
+    @Test
+    public void test1() {
+        RiderDTO build = RiderDTO.builder()
+                .area("国家广告园")
+                .latitude(31.981746)
+                .longitude(118.734661)
+                .userId(151L)
+                .build();
+        System.out.println(riderService.riderApply(build));
+//        System.out.println(riderRepo.findByUserId(151L).isPresent());
+    }
+
+
 }