licailing 5 лет назад
Родитель
Сommit
9ba47cf0a9
30 измененных файлов с 749 добавлено и 268 удалено
  1. 18 2
      pom.xml
  2. 3 3
      src/main/java/com/izouma/dingdong/config/KsherPaySdk.java
  3. 1 1
      src/main/java/com/izouma/dingdong/domain/Appraisal.java
  4. 2 12
      src/main/java/com/izouma/dingdong/domain/OrderInfo.java
  5. 4 0
      src/main/java/com/izouma/dingdong/domain/User.java
  6. 128 0
      src/main/java/com/izouma/dingdong/dto/OrderDTO.java
  7. 127 0
      src/main/java/com/izouma/dingdong/dto/OrderInfoDTO.java
  8. 1 0
      src/main/java/com/izouma/dingdong/enums/PayMethod.java
  9. 14 5
      src/main/java/com/izouma/dingdong/enums/RiderStatus.java
  10. 2 0
      src/main/java/com/izouma/dingdong/repo/OrderInfoRepo.java
  11. 39 0
      src/main/java/com/izouma/dingdong/service/ConsumptionService.java
  12. 59 1
      src/main/java/com/izouma/dingdong/service/OrderInfoService.java
  13. 6 0
      src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java
  14. 5 1
      src/main/java/com/izouma/dingdong/service/UserService.java
  15. 0 128
      src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java
  16. 16 22
      src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java
  17. 19 13
      src/main/java/com/izouma/dingdong/service/rider/RiderService.java
  18. 25 0
      src/main/java/com/izouma/dingdong/service/tencent/UserSigService.java
  19. 0 6
      src/main/java/com/izouma/dingdong/web/AuthenticationController.java
  20. 36 2
      src/main/java/com/izouma/dingdong/web/OrderInfoController.java
  21. 2 3
      src/main/java/com/izouma/dingdong/web/merchant/MerchantController.java
  22. 7 0
      src/main/java/com/izouma/dingdong/web/rider/RiderController.java
  23. 21 0
      src/main/java/com/izouma/dingdong/web/tencent/UserSigController.java
  24. 7 0
      src/main/resources/application.yaml
  25. 44 41
      src/main/vue/src/views/AppraisalEdit.vue
  26. 48 16
      src/main/vue/src/views/OrderInfoEdit.vue
  27. 13 10
      src/main/vue/src/views/OrderInfoList.vue
  28. 16 0
      src/test/java/com/izouma/dingdong/KsherTest.java
  29. 2 2
      src/test/java/com/izouma/dingdong/service/MerchantServiceTest.java
  30. 84 0
      src/test/java/com/izouma/dingdong/service/UserSigServiceTest.java

+ 18 - 2
pom.xml

@@ -266,10 +266,26 @@
         </dependency>
 
         <!-- TPNS移动推送 -->
-<!--        <dependency>
+        <dependency>
             <groupId>com.github.xingePush</groupId>
             <artifactId>xinge</artifactId>
             <version>1.2.2</version>
-        </dependency>-->
+        </dependency>
+
+        <!-- 注册userSig -->
+        <dependency>
+            <groupId>com.github.tencentyun</groupId>
+            <artifactId>tls-sig-api-v2</artifactId>
+            <version>1.1</version>
+        </dependency>
+
+<!--
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.62</version>
+        </dependency>
+-->
+
     </dependencies>
 </project>

+ 3 - 3
src/main/java/com/izouma/dingdong/config/ksher_pay_sdk.java → src/main/java/com/izouma/dingdong/config/KsherPaySdk.java

@@ -32,7 +32,7 @@ import java.util.*;
  * 2、PKCS1私钥转换为PKCS8(该格式一般Java调用)
  * openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem
  */
-public class ksher_pay_sdk {
+public class KsherPaySdk {
 
     private String appid;
     private String privateKey;
@@ -45,7 +45,7 @@ public class ksher_pay_sdk {
     private final java.text.SimpleDateFormat timeStampFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
     private final String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7955OCuN4I8eYNL/mixZWIXIgCvIVEivlxqdpiHPcOLdQ2RPSx/pORpsUu/E9wz0mYS2PY7hNc2mBgBOQT+wUCAwEAAQ==";
 
-    public ksher_pay_sdk(String appid, String privateKey) {
+    public KsherPaySdk(String appid, String privateKey) {
         this.appid = appid;
         this.privateKey = privateKey;
     }
@@ -301,7 +301,7 @@ public class ksher_pay_sdk {
         mch_order_no
         total_fee
         fee_type
-        channel
+        channel wechat/alipay
         sub_openid
         channel_sub_appid
     选传参数

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

@@ -35,7 +35,7 @@ public class Appraisal extends BaseEntity {
      */
     @Column(nullable = false)
     @ApiModelProperty(value = "商品评分", name = "goodsScore")
-    private Boolean goodsLike = true ;
+    private Boolean goodsLike;
 
     @ApiModelProperty(value = "商品评价", name = "goodsAppraise")
     private String goodsAppraise;

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

@@ -24,8 +24,8 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "用户ID", name = "userId")
     private Long userId;
 
-    @ApiModelProperty(value = "用户昵称")
-    private String nickname;
+//    @ApiModelProperty(value = "用户昵称")
+//    private String nickname;
 
     //经度在前 纬度在后
     @ApiModelProperty(value = "用户地址经纬度",name = "location")
@@ -39,10 +39,6 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "商户ID", name = "merchantId")
     private Long merchantId;
 
-//    @ManyToMany(fetch = FetchType.EAGER)
-//    @ApiModelProperty(value = "商品ID", name = "goodsId")
-//    private List<Goods> goods;
-
     @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "商家状态", name = "merchantStatus")
     private MerchantStatus merchantStatus;
@@ -146,10 +142,6 @@ public class OrderInfo extends BaseEntity {
     @JoinColumn(name = "merchantId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     private Merchant merchant;
 
-/*    @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.DETACH)
-    @JoinColumn(name = "merchantId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    private MerchantSettings merchantSettings;*/
-
     @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "取消订单原因", name = "reason")
     private RefundReason reason;
@@ -157,8 +149,6 @@ public class OrderInfo extends BaseEntity {
     @ApiModelProperty(value = "预计到达时间")
     private LocalDateTime timeOfArrival;
 
-    //不显示的骑手列表
-//    private String NotDisplayRiderIds;
     @ApiModelProperty(value = "期望送达时间段")
     private String expectDeliveryTime;
 

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

@@ -97,6 +97,10 @@ public class User extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "余额", name = "money")
     private BigDecimal money;
 
+    //为-1时为永久不可下单
+    @ApiModelProperty(value = "多少时间不可点单", name = "notOrder")
+    private Integer notOrder;
+
     //默认用户名
     public String getDefaultUsername(String phone) {
         return phone.replace(phone.substring(3, 7), "****");

+ 128 - 0
src/main/java/com/izouma/dingdong/dto/OrderDTO.java

@@ -0,0 +1,128 @@
+package com.izouma.dingdong.dto;
+
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.enums.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单表", description = "订单表")
+public class OrderDTO {
+
+    @ApiModelProperty(value = "用户昵称")
+    private String nickname;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "订单状态", name = "orderStatus")
+    private OrderStatus status;
+
+    //商家信息
+    @ApiModelProperty(value = "商户名称", name = "merchantShowName")
+    private String merchantShowName;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "商家状态", name = "merchantStatus")
+    private MerchantStatus merchantStatus;
+
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
+
+    @ApiModelProperty(value = "包装价格", name = "packingPrice")
+    private BigDecimal packingPrice;
+
+    @ApiModelProperty(value = "配送费", name = "deliveryAmount")
+    private BigDecimal deliveryAmount;
+
+    @ApiModelProperty(value = "满减", name = "fullReduction")
+    private BigDecimal fullReduction;
+
+    @ApiModelProperty(value = "首单", name = "firstBuy")
+    private BigDecimal firstBuy;
+
+    @ApiModelProperty(value = "红包", name = "redBag")
+    private BigDecimal redBag;
+
+    @ApiModelProperty(value = "新用户", name = "newUser")
+    private BigDecimal newUser;
+
+    @ApiModelProperty(value = "总价", name = "totalAmount")
+    private BigDecimal totalAmount;
+
+//    @ApiModelProperty(value = "商品总价", name = "goodsAmount")
+//    private BigDecimal goodsAmount;
+
+    @ApiModelProperty(value = "实付金额", name = "realAmount")
+    private BigDecimal realAmount;
+
+    @ApiModelProperty(value = "优惠券ID", name = "couponId")
+    private Long userCouponId;
+
+
+    //配送信息
+    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
+    private String jobNumber;
+
+    @ApiModelProperty(value = "骑手名称", name = "riderName")
+    private String riderName;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "骑手状态", name = "riderStatus")
+    private RiderStatus riderStatus;
+
+    //订单信息
+    private String orderNo;
+
+    @ApiModelProperty(value = "下单时间", name = "orderTime")
+    private LocalDateTime orderTime;
+
+    @ApiModelProperty(value = "配送地址", name = "userAddress")
+    private String userAddress;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "支付方式", name = "payMethod")
+    private PayMethod payMethod;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "取消订单", name = "cancel")
+    private Boolean cancel = false;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "已评价", name = "rated")
+    private Boolean rated = false;
+
+    @ApiModelProperty(value = "用户收到时间", name = "userReceivedTime")
+    private LocalDateTime userReceivedTime;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumn(name = "orderInfoId")
+    List<OrderGoodsSpec> orderGoodsSpecs;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "取消订单原因", name = "reason")
+    private RefundReason reason;
+
+    @ApiModelProperty(value = "预计到达时间", name = "timeOfArrival")
+    private LocalDateTime timeOfArrival;
+
+    @ApiModelProperty(value = "期望送达时间段", name = "expectDeliveryTime")
+    private String expectDeliveryTime;
+
+    @ApiModelProperty(value = "评价ID", name = "appraisalId")
+    private Long appraisalId;
+
+}

+ 127 - 0
src/main/java/com/izouma/dingdong/dto/OrderInfoDTO.java

@@ -0,0 +1,127 @@
+package com.izouma.dingdong.dto;
+
+import com.izouma.dingdong.domain.OrderGoodsSpec;
+import com.izouma.dingdong.enums.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "订单表", description = "订单表")
+public class OrderInfoDTO {
+
+    private Long id;
+
+    @ApiModelProperty(value = "用户昵称")
+    private String nickname;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "订单状态", name = "orderStatus")
+    private OrderStatus status;
+
+    //商家信息
+    @ApiModelProperty(value = "商户名称", name = "merchantShowName")
+    private String merchantShowName;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "商家状态", name = "merchantStatus")
+    private MerchantStatus merchantStatus;
+
+    @ApiModelProperty(value = "备注", name = "remark")
+    private String remark;
+
+    //价格
+    @ApiModelProperty(value = "包装价格", name = "packingPrice")
+    private BigDecimal packingPrice;
+
+    @ApiModelProperty(value = "配送费", name = "deliveryAmount")
+    private BigDecimal deliveryAmount;
+
+    @ApiModelProperty(value = "满减", name = "fullReduction")
+    private BigDecimal fullReduction;
+
+    @ApiModelProperty(value = "首单", name = "firstBuy")
+    private BigDecimal firstBuy;
+
+    @ApiModelProperty(value = "红包", name = "redBag")
+    private BigDecimal redBag;
+
+    @ApiModelProperty(value = "新用户", name = "newUser")
+    private BigDecimal newUser;
+
+    @ApiModelProperty(value = "总价", name = "totalAmount")
+    private BigDecimal totalAmount;
+
+//    @ApiModelProperty(value = "商品总价", name = "goodsAmount")
+//    private BigDecimal goodsAmount;
+
+    @ApiModelProperty(value = "实付金额", name = "realAmount")
+    private BigDecimal realAmount;
+
+    @ApiModelProperty(value = "优惠券ID", name = "couponId")
+    private Long userCouponId;
+
+
+    //配送信息
+    @ApiModelProperty(value = "骑手工号", name = "jobNumber")
+    private String jobNumber;
+
+    @ApiModelProperty(value = "骑手名称", name = "riderName")
+    private String riderName;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "骑手状态", name = "riderStatus")
+    private RiderStatus riderStatus;
+
+    //订单信息
+    private String orderNo;
+
+    @ApiModelProperty(value = "下单时间", name = "orderTime")
+    private LocalDateTime orderTime;
+
+    @ApiModelProperty(value = "配送地址", name = "userAddress")
+    private String userAddress;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "支付方式", name = "payMethod")
+    private PayMethod payMethod;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "取消订单", name = "cancel")
+    private Boolean cancel = false;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "已评价", name = "rated")
+    private Boolean rated = false;
+
+    @ApiModelProperty(value = "用户收到时间", name = "userReceivedTime")
+    private LocalDateTime userReceivedTime;
+
+    @Column(nullable = false)
+    private Boolean enabled = true;
+
+    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumn(name = "orderInfoId")
+    List<OrderGoodsSpec> orderGoodsSpecs;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "取消订单原因", name = "reason")
+    private RefundReason reason;
+
+    @ApiModelProperty(value = "预计到达时间", name = "timeOfArrival")
+    private LocalDateTime timeOfArrival;
+
+    @ApiModelProperty(value = "期望送达时间段", name = "expectDeliveryTime")
+    private String expectDeliveryTime;
+
+    @ApiModelProperty(value = "评价ID", name = "appraisalId")
+    private Long appraisalId;
+
+}

+ 1 - 0
src/main/java/com/izouma/dingdong/enums/PayMethod.java

@@ -2,6 +2,7 @@ package com.izouma.dingdong.enums;
 
 public enum PayMethod {
     ALI_PAY("支付宝"),
+    WE_CHAT("微信支付"),
     CASH_DELIVERY("货到付款"),
     CREDIT_CARD("信用卡");
 

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

@@ -4,19 +4,19 @@ public enum RiderStatus {
     /*
     未接单 待接单
      */
-    NOT_RECEIVED,
+    NOT_RECEIVED("未接单"),
     /*
     接单 待取餐
      */
-    RECEIVED,
+    RECEIVED("已接单,待取餐"),
     /*
     到达 待取餐
      */
-    ARRIVE,
+    ARRIVE("已到店,待取餐"),
     /*
     取餐 待送达
      */
-    TAKE_MEAL,
+    TAKE_MEAL("已取餐,配送中"),
     /*
     送餐
      */
@@ -24,6 +24,15 @@ public enum RiderStatus {
     /*
     送达
      */
-    CARRY_OUT,
+    CARRY_OUT("已送达");
 
+    private final String description;
+
+    RiderStatus(String description){
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
 }

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

@@ -33,6 +33,8 @@ public interface OrderInfoRepo extends JpaRepository<OrderInfo, Long>, JpaSpecif
     //按骑手查找状态不为完成的订单
     List<OrderInfo> findAllByRiderIdAndRiderStatusIsNot(Long riderId, RiderStatus riderStatus);
 
+    Integer countByRiderIdAndRiderStatusIsNot(Long riderId, RiderStatus riderStatus);
+
     //按商家和用户查找订单,判断是不是第一次购买
     List<OrderInfo> findAllByUserIdAndMerchantId(Long userId, Long merchantId);
 

+ 39 - 0
src/main/java/com/izouma/dingdong/service/ConsumptionService.java

@@ -0,0 +1,39 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.config.KsherPaySdk;
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.enums.PayMethod;
+import com.izouma.dingdong.utils.SnowflakeIdWorker;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Service
+@Slf4j
+public class ConsumptionService {
+
+    @Value("${ksher.appid}")
+    private String appid;
+
+    @Value("${ksher.private_key}")
+    private String privateKey;
+
+    public void payOrder(OrderInfo orderInfo) {
+        //ksher支付SDK
+        KsherPaySdk ksherPaySdk = new KsherPaySdk(appid, privateKey);
+        //商家产生的唯一no
+        String mchOrderNo = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
+        //总数 分为单位
+        Integer total = orderInfo.getRealAmount().multiply(BigDecimal.valueOf(100)).intValue();
+        //支付方式
+        String channel = "wechat";
+        if (PayMethod.ALI_PAY.equals(orderInfo.getPayMethod())){
+            channel = "alipay";
+        }
+
+        //调app支付
+        //ksherPaySdk.AppPay(mchOrderNo,"CNY",)
+    }
+}

+ 59 - 1
src/main/java/com/izouma/dingdong/service/OrderInfoService.java

@@ -3,6 +3,7 @@ package com.izouma.dingdong.service;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.domain.*;
+import com.izouma.dingdong.domain.backstage.BlackList;
 import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.rider.Rider;
 import com.izouma.dingdong.domain.user.ShoppingCart;
@@ -14,6 +15,7 @@ import com.izouma.dingdong.dto.UserOrderDTO;
 import com.izouma.dingdong.enums.*;
 import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.*;
+import com.izouma.dingdong.repo.backstage.BlackListRepo;
 import com.izouma.dingdong.repo.rider.RiderRepo;
 import com.izouma.dingdong.repo.user.ShoppingCartRepo;
 import com.izouma.dingdong.repo.merchant.GoodsRepo;
@@ -55,6 +57,7 @@ public class OrderInfoService {
     private RiderRepo               riderRepo;
     private DeliveryFeeService      deliveryFeeService;
     private SysConfigService        sysConfigService;
+    private BlackListRepo           blackListRepo;
 
     /*
     用户下单
@@ -319,6 +322,11 @@ public class OrderInfoService {
 
         }
 
+        //如果是货到付款
+        if (PayMethod.CASH_DELIVERY.equals(orderInfo.getPayMethod())) {
+            this.cancelCashOrder(id);
+        }
+
         //订单待评价/已完成
         if (orderInfo.getStatus().equals(OrderStatus.RATED) || orderInfo.getStatus().equals(OrderStatus.COMPLETED)) {
             throw new BusinessException("订单已完成");
@@ -366,8 +374,58 @@ public class OrderInfoService {
     /*
     货到付款取消订单
      */
-    public void can(Long orderId) {
+    public void cancelCashOrder(Long orderId) {
         OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        //已送达
+        RiderStatus riderStatus = orderInfo.getRiderStatus();
+        if (RiderStatus.CARRY_OUT.equals(riderStatus)) {
+            throw new BusinessException("已送达,不可取消");
+        }
+
+        //取消订单
+        orderInfo.setCancel(true);
+        orderInfo.setStatus(OrderStatus.CANCELLED);
+
+        //骑手已接单,已到店,正在配送
+        //用户n小时不可下单
+        if (RiderStatus.RECEIVED.equals(riderStatus)
+                || RiderStatus.ARRIVE.equals(riderStatus)
+                || RiderStatus.TAKE_MEAL.equals(riderStatus)) {
+
+            //查出用户所有的订单信息,按时间倒叙
+            List<OrderInfo> infos = orderInfoRepo.findAllByUserId(orderInfo.getUserId());
+            infos.sort((a, b) -> b.getOrderTime().compareTo(a.getOrderTime()));
+            //连续次数
+            int times = 1;
+            for (OrderInfo i : infos) {
+                if (!i.getCancel() && !PayMethod.CASH_DELIVERY.equals(i.getPayMethod())) {
+                    break;
+                }
+                times++;
+            }
+            //找出用户
+            User user = userRepo.findById(orderInfo.getUserId()).orElseThrow(new BusinessException("无用户"));
+            if (times == 2) {
+                user.setNotOrder(1);
+            } else if (times == 3) {
+                user.setNotOrder(24);
+            } else if (times >= 4) {
+                user.setNotOrder(-1);
+                user.setBlacklist(true);
+                //拉入黑名单
+                blackListRepo.save(BlackList.builder()
+                        .userId(user.getId())
+                        .otherId(user.getId())
+                        .remove(false)
+                        .moveTime(LocalDateTime.now())
+                        .reason("连续四次货到付款取消订单")
+                        .identity(Identity.USER)
+                        .enabled(true)
+                        .build());
+            }
+            userRepo.save(user);
+        }
+
 
     }
 

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

@@ -258,6 +258,12 @@ public class OrderRefundApplyService {
         riderService.income(orderInfo.getRiderId(), orderInfo.getUserId(), orderInfo.getDeliveryAmount(), FinancialType.INCOME, orderInfo
                 .getId()
                 .toString(), RiderMoneyType.DISTRIBUTION_REVENUE);
+
+        //如果是货到付款
+        if (PayMethod.CASH_DELIVERY.equals(orderInfo.getPayMethod())){
+            //从骑手账户减去金额
+//            riderService.income(orderInfo.getRiderId());
+        }
     }
 
     /*

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

@@ -50,7 +50,7 @@ public class UserService {
     public User register(String phone, String password, Identity identity) {
         User user = userRepo.findByPhoneAndIdentity(phone, identity);
         if (ObjectUtil.isNull(user)) {
-            if (RIDER.equals(identity)){
+            if (RIDER.equals(identity)) {
                 throw new BusinessException("未注册");
             }
             user = User.builder()
@@ -68,6 +68,10 @@ public class UserService {
                 user.setPassword(new BCryptPasswordEncoder().encode(password));
             }
             userRepo.save(user);
+        } else {
+            if (user.getBlacklist()) {
+                throw new BusinessException("被拉入黑名单!");
+            }
         }
         return user;
     }

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

@@ -247,134 +247,6 @@ public class MerchantService {
         return new PageImpl<>(merchantDTOS, toPageRequest(pageQuery), merchantDTOS.size());
     }
 
-    /**
-     * 用户端显示的所有商家
-     *
-     * @param pageQuery  分页
-     * @param longitude  经度
-     * @param latitude   纬度
-     * @param popularTag 热门标签
-     * @param userId     用户Id
-     * @return 用户附近的上级列表
-     */
-    public List<MerchantDTO> showAll(PageQuery pageQuery, Double longitude, Double latitude, String popularTag, Long userId) {
-
-        List<Merchant> merchantList = merchantRepo.findAll((root, criteriaQuery, criteriaBuilder) -> {
-                    List<Predicate> predicates = new ArrayList<>();
-                    predicates.add(criteriaBuilder.equal(root.get("status"), ApplyStatus.PASS));
-                    if (StrUtil.isNotBlank(pageQuery.getSearch())) {
-                        predicates.add(criteriaBuilder.like(root.get("name"), "%" + pageQuery.getSearch() + "%"));
-                    }
-                    return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
-                }
-                //criteriaBuilder.like(root.get("name"), "%" + pageQuery.getSearch() + "%")).getRestriction()
-        );
-
-        Set<Merchant> merchants = new HashSet<>(merchantList);
-
-        if (StrUtil.isNotBlank(pageQuery.getSearch())) {
-            List<Goods> goods = goodsRepo.findAll((root, criteriaQuery, criteriaBuilder) ->
-                    criteriaQuery.where(
-                            criteriaBuilder.and(
-                                    criteriaBuilder.like(root.get("name"), "%" + pageQuery.getSearch() + "%")),
-                            criteriaBuilder.equal(root.get("status"), ApplyStatus.PASS)).getRestriction()
-            );
-
-            goods.forEach(g -> {
-                Merchant merchant = merchantRepo.findById(g.getMerchantId()).orElse(null);
-                if (ObjectUtil.isNotNull(merchant) && ApplyStatus.PASS.equals(merchant.getStatus())) {
-                    merchants.add(merchant);
-                }
-            });
-        }
-/*        //所有商家要按距离排序规则
-        Map<Merchant, Double> map = new HashMap<>();
-        //算距离
-        for (Merchant m : merchants) {
-            if (m.getLatitude() != null && m.getLongitude() != null) {
-                Double distance = MapUtils.distance(m.getLongitude(), m.getLatitude(), longitude, latitude);
-                map.put(m, distance);
-            }
-        }
-        //排序
-        List<Map.Entry<Merchant, Double>> list = new ArrayList<>(map.entrySet());
-        list.sort(Comparator.comparing(Map.Entry<Merchant, Double>::getValue));
-        List<Merchant> mers = new ArrayList<>();
-        for (Map.Entry<Merchant, Double> m : list) {
-            mers.add(m.getKey());
-        }*/
-
-        //距离排序
-        //List<Merchant> mers = this.distanceSorting(merchants, longitude, latitude, null);
-
-        Map<Merchant, Double> mers = this.distanceSorting(merchants, longitude, latitude, null);
-
-/*        if (popularTag == null) {
-            popularTag = pageQuery.getSearch();
-        }*/
-
-        //转DTO
-        List<MerchantDTO> merchantDTOS = CollUtil.newArrayList();
-
-        for (Map.Entry<Merchant, Double> m : mers.entrySet()) {
-
-            //  }
-            // for (Merchant m : mers) {
-            MerchantSettings settings = merchantSettingsRepo.findByMerchantId(m.getKey().getId())
-                    .orElseThrow(new BusinessException("商户不存在"));
-            MerchantDTO merchantDTO = new MerchantDTO(m.getKey(), settings, m.getValue());
-            if (StrUtil.isNotBlank(popularTag)) {
-                merchantDTO.setFullReductions(fullReductionRepo.findAllByMerchantId(merchantDTO.getMid()));
-                switch (popularTag) {
-                    case "首单立减":
-                        if ((settings.getFirstOrder() != null ? settings.getFirstOrder()
-                                .compareTo(BigDecimal.ZERO) : 0) > 0) {
-                            merchantDTOS.add(merchantDTO);
-                        }
-                        break;
-                    case "满减优惠":
-                        if (CollUtil.isNotEmpty(fullReductionRepo.findAllByMerchantId(m.getKey().getId()))) {
-                            merchantDTOS.add(merchantDTO);
-                        }
-                        break;
-                    case "折扣商家":
-                        if (StrUtil.isNotEmpty(merchantClassificationRepo.findByMerchantIdAndType(m.getKey().getId(), 2)
-                                .getGoodsIds())) {
-                            merchantDTOS.add(merchantDTO);
-                        }
-                        break;
-                    case "下单返红包":
-                        if (CollUtil.isNotEmpty(couponRepo.findAllByMerchantIdAndEnabledTrue(m.getKey().getId()))) {
-                            merchantDTOS.add(merchantDTO);
-                        }
-                        break;
-                    case "可用红包":
-                        List<UserCoupon> coupons = userCouponRepo.findAllByUserIdAndIsUsedFalse(userId);
-                        List<UserCoupon> collect = coupons.stream().filter(c ->
-                                !c.getCoupon().getEndDate().isBefore(LocalDate.now()) && (c.getCoupon()
-                                        .getMerchantId() == null || c.getCoupon()
-                                        .getMerchantId()
-                                        .equals(m.getKey().getId()))
-                        ).collect(Collectors.toList());
-                        if (CollUtil.isNotEmpty(collect)) {
-                            merchantDTOS.add(merchantDTO);
-                        }
-                        break;
-
-                    default:
-                        merchantDTOS.add(merchantDTO);
-                        break;
-                }
-            } else {
-                merchantDTO.setFullReductions(fullReductionRepo.findAllByMerchantId(merchantDTO.getMid()));
-                merchantDTOS.add(merchantDTO);
-            }
-        }
-
-//        new PageImpl<>(merchantDTOS, toPageRequest(pageQuery), merchantDTOS.size())
-        return merchantDTOS;
-    }
-
 
     /**
      * 显示个人的商户信息

+ 16 - 22
src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java

@@ -159,18 +159,6 @@ public class MerchantSettingsService {
                 }
             });
         }
-/*        List<TimeTag> timeTag = new ArrayList<>();
-        timeTags.forEach(t -> {
-            if (t.getEndTime().compareTo(t.getStartTime()) < 0) {
-                if (now.isAfter(t.getEndTime()) && now.isBefore(LocalTime.MAX)) {
-                    timeTag.add(t);
-                }
-            } else {
-                if (now.isAfter(t.getStartTime()) && now.isBefore(t.getEndTime())) {
-                    timeTag.add(t);
-                }
-            }
-        });*/
 
         //优惠专区
         //主推荐位 2个
@@ -294,7 +282,7 @@ public class MerchantSettingsService {
                 )
                 .collect(Collectors.toList());
         Set<Merchant> merchantList = new HashSet<>();
-
+        //商家信息1表
         collect.forEach(c ->
                 merchantRepo.findById(c.getMerchantId()).ifPresent(merchantList::add)
         );
@@ -355,6 +343,9 @@ public class MerchantSettingsService {
         return dtos;
     }
 
+    /*
+    筛选满减等。
+     */
     public List<MerchantDTO> listFilter(List<MerchantDTO> dtos, String filter, Long userId) {
         Set<MerchantDTO> collect = new HashSet<>();
         LongArrayConverter converter = new LongArrayConverter();
@@ -456,7 +447,8 @@ public class MerchantSettingsService {
     /*
     推荐商家
      */
-    public List<MerchantDTO> recommended(Double longitude, Double latitude, Integer sort, String filter, String tag, String natureId, BigDecimal startAmount,
+    public List<MerchantDTO> recommended(Double longitude, Double latitude, Integer sort, String filter, String tag,
+                                         String natureId, BigDecimal startAmount,
                                          BigDecimal endAmount, Long userId) {
         List<MerchantDTO> dtoList;
         dtoList = this.listSort(longitude, latitude, sort);
@@ -468,7 +460,7 @@ public class MerchantSettingsService {
 
 
     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<>();
                     predicates.add(criteriaBuilder.equal(root.get("status"), ApplyStatus.PASS));
@@ -481,6 +473,7 @@ public class MerchantSettingsService {
 
         Set<Merchant> merchants = new HashSet<>(merchantList);
 
+        //匹配商品名称
         if (StrUtil.isNotBlank(pageQuery.getSearch())) {
             List<Goods> goods = goodsRepo.findAll((root, criteriaQuery, criteriaBuilder) ->
                     criteriaQuery.where(
@@ -488,13 +481,13 @@ public class MerchantSettingsService {
                                     criteriaBuilder.like(root.get("name"), "%" + pageQuery.getSearch() + "%")),
                             criteriaBuilder.equal(root.get("status"), ApplyStatus.PASS)).getRestriction()
             );
-
-            goods.forEach(g -> {
-                Merchant merchant = merchantRepo.findById(g.getMerchantId()).orElse(null);
-                if (ObjectUtil.isNotNull(merchant) && ApplyStatus.PASS.equals(merchant.getStatus())) {
-                    merchants.add(merchant);
-                }
-            });
+            //商品名称匹配出商家
+            goods.forEach(g ->
+                merchantRepo.findById(g.getMerchantId()).ifPresent(m -> {
+                    if (ApplyStatus.PASS.equals(m.getStatus()))
+                        merchants.add(m);
+                })
+            );
         }
 
         //带距离 且按距离排好序
@@ -556,6 +549,7 @@ public class MerchantSettingsService {
         byParent.forEach(this::accept);
     }
 
+    //更新推广语
     private void accept(Category c) {
         List<MerchantDTO> list = categoryService.categoryMer(c.getId());
         List<Merchant> merchants = new ArrayList<>();

+ 19 - 13
src/main/java/com/izouma/dingdong/service/rider/RiderService.java

@@ -198,16 +198,28 @@ public class RiderService {
      */
     public void dispatch(Long orderId) {
         OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        //是否货到付款
+        boolean cash = PayMethod.CASH_DELIVERY.equals(orderInfo.getPayMethod());
+
         //查找骑手位置列表
         List<RiderLocation> locationList = riderLocationRepo.findAllByCreatedAt(orderInfo.getOrderTime());
 
         Map<Long, Double> map = new HashMap<>();
+        //筛查骑手,查出订单数小于5,3000米以内,(支持货到付款)
         locationList.forEach(d -> {
-            Merchant merchant = orderInfo.getMerchant();
-            Double distance = MapUtils.distance(merchant.getLongitude(), merchant.getLatitude(), d.getLongitude(), d.getLatitude());
-            //所有附近的骑手的距离
-            if (distance < sysConfigService.getRange()) {
-                map.put(d.getRiderId(), distance);
+            if (orderInfoRepo.countByRiderIdAndRiderStatusIsNot(d.getRiderId(), RiderStatus.CARRY_OUT) < 5) {
+                boolean t = true;
+                if (cash) {
+                    //是否支持货到付款
+                    t = this.canCash(d.getRiderId());
+                }
+                Merchant merchant = orderInfo.getMerchant();
+                Double distance = MapUtils.distance(merchant.getLongitude(), merchant.getLatitude(), d.getLongitude(), d
+                        .getLatitude());
+                //所有附近的骑手的距离
+                if (distance < sysConfigService.getRange() && t) {
+                    map.put(d.getRiderId(), distance);
+                }
             }
         });
 
@@ -227,13 +239,9 @@ public class RiderService {
 //            Rider rider = riderRepo.findById(m.getKey()).orElseThrow(new BusinessException("无骑手"));
 
             List<OrderInfo> infos = orderInfoRepo.findAllByRiderIdAndRiderStatusIsNot(m.getKey(), RiderStatus.CARRY_OUT);
-            //如果是货到付款
-            boolean t = true;
-            if (PayMethod.CASH_DELIVERY.equals(orderInfo.getPayMethod())) {
-                t = this.canCash(m.getKey());
-            }
+
             //有空闲骑手且可以接货到付款,自动接单,不可拒单
-            if (CollUtil.isEmpty(infos) && t) {
+            if (CollUtil.isEmpty(infos)) {
                 orderInfo.setRiderId(m.getKey());
                 orderInfo.setRiderStatus(RiderStatus.RECEIVED);
                 orderInfoRepo.save(orderInfo);
@@ -295,6 +303,4 @@ public class RiderService {
         BigDecimal account = sysConfigService.getBigDecimal("accountRequirements");
         return account.compareTo(rider.getUser().getMoney()) <= 0;
     }
-
-
 }

+ 25 - 0
src/main/java/com/izouma/dingdong/service/tencent/UserSigService.java

@@ -0,0 +1,25 @@
+package com.izouma.dingdong.service.tencent;
+
+import com.tencentyun.TLSSigAPIv2;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserSigService {
+
+//    @Value("$IMConfig.sdkAppId")
+//    private Long sdkAppId;
+
+//    @Value("$IMConfig.secretKey")
+//    private String secretKey;
+
+    private Long expire = 604800L;
+
+    public String generateUserSig(String userId) {
+//        TLSSigAPIv2 api = new TLSSigAPIv2(sdkAppId, secretKey);
+
+//        return api.genSig(userId, expire);
+
+        return null;
+    }
+}

+ 0 - 6
src/main/java/com/izouma/dingdong/web/AuthenticationController.java

@@ -1,11 +1,9 @@
 package com.izouma.dingdong.web;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.izouma.dingdong.domain.User;
 import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.enums.Identity;
 import com.izouma.dingdong.exception.AuthenticationException;
-import com.izouma.dingdong.security.Authority;
 import com.izouma.dingdong.security.JwtTokenUtil;
 import com.izouma.dingdong.security.JwtUserDetailsService;
 import com.izouma.dingdong.security.JwtUserFactory;
@@ -19,14 +17,10 @@ import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.DisabledException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.math.BigDecimal;
-import java.util.Collections;
 import java.util.Objects;
 
 @Slf4j

+ 36 - 2
src/main/java/com/izouma/dingdong/web/OrderInfoController.java

@@ -1,13 +1,17 @@
 package com.izouma.dingdong.web;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.StrUtil;
+import com.izouma.dingdong.domain.Appraisal;
 import com.izouma.dingdong.domain.OrderInfo;
 import com.izouma.dingdong.domain.User;
+import com.izouma.dingdong.dto.OrderInfoDTO;
 import com.izouma.dingdong.dto.UserOrderDTO;
 import com.izouma.dingdong.enums.Identity;
 import com.izouma.dingdong.enums.MerchantStatus;
 import com.izouma.dingdong.enums.OrderStatus;
 import com.izouma.dingdong.enums.RefundReason;
+import com.izouma.dingdong.repo.AppraisalRepo;
 import com.izouma.dingdong.repo.UserRepo;
 import com.izouma.dingdong.repo.rider.RiderRepo;
 import com.izouma.dingdong.service.OrderInfoService;
@@ -40,6 +44,7 @@ public class OrderInfoController extends BaseController {
     private UserRepo         userRepo;
     private MerchantService  merchantService;
     private RiderRepo        riderRepo;
+    private AppraisalRepo    appraisalRepo;
 
 
     //@PreAuthorize("hasRole('ADMIN')")
@@ -61,8 +66,15 @@ public class OrderInfoController extends BaseController {
     }
 
     @GetMapping("/get/{id}")
-    public OrderInfo get(@PathVariable Long id) {
-        return orderInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    public OrderInfoDTO get(@PathVariable Long id) {
+        OrderInfo orderInfo = orderInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        OrderInfoDTO dto = this.toDto(orderInfo);
+
+        //评价ID插入
+        if (orderInfo.getRated()) {
+            appraisalRepo.findByOrderInfoId(orderInfo.getId()).ifPresent(a -> dto.setAppraisalId(a.getId()));
+        }
+        return dto;
     }
 
     @PostMapping("/del/{id}")
@@ -169,5 +181,27 @@ public class OrderInfoController extends BaseController {
         return orderInfoRepo.findAllByStatusAndMerchantStatus(OrderStatus.PAID, MerchantStatus.RECEIVED);
     }
 
+    @GetMapping("/blackAll")
+    public Page<OrderInfoDTO> blackAll(PageQuery pageQuery) {
+        return orderInfoRepo.findAll(toSpecification(pageQuery, OrderInfo.class), toPageRequest(pageQuery))
+                .map(this::toDto);
+    }
+
+    public OrderInfoDTO toDto(OrderInfo orderInfo) {
+        OrderInfoDTO dto = new OrderInfoDTO();
+        BeanUtil.copyProperties(orderInfo, dto);
+        if (orderInfo.getRiderId() != null) {
+            riderRepo.findById(orderInfo.getRiderId()).ifPresent(r -> {
+                dto.setJobNumber(r.getJobNumber());
+                dto.setRiderName(r.getUser().getNickname());
+            });
+        }
+        dto.setNickname(orderInfo.getUser().getNickname());
+        dto.setMerchantShowName(orderInfo.getMerchant().getShowName());
+
+        return dto;
+    }
+
+
 }
 

+ 2 - 3
src/main/java/com/izouma/dingdong/web/merchant/MerchantController.java

@@ -104,13 +104,12 @@ public class MerchantController extends BaseController {
     }
 
 
-    @GetMapping("/showAll")
+/*    @GetMapping("/showAll")
     @ApiOperation("商家所有信息")
     public Page<MerchantDTO> showAll(PageQuery pageQuery, Double longitude, Double latitude, String popularTag) {
         List<MerchantDTO> list = merchantService.showAll(pageQuery, longitude, latitude, popularTag, SecurityUtils.getAuthenticatedUser().getId());
         return new PageImpl<>(list, toPageRequest(pageQuery), list.size());
-
-    }
+    }*/
 
     @GetMapping("/timeTag")
     @ApiOperation("时间标签下的商户")

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

@@ -1,5 +1,6 @@
 package com.izouma.dingdong.web.rider;
 
+import com.izouma.dingdong.dto.RiderDTO;
 import com.izouma.dingdong.utils.SecurityUtils;
 import com.izouma.dingdong.web.BaseController;
 import com.izouma.dingdong.domain.rider.Rider;
@@ -80,6 +81,12 @@ public class RiderController extends BaseController {
 
     }
 
+    @GetMapping("/apply")
+    @ApiOperation("骑手注册")
+    public Rider apply(@RequestBody RiderDTO riderDTO) {
+        return riderService.riderApply(riderDTO);
+    }
+
     @GetMapping("/audit")
     @ApiOperation("审核骑手")
     public String audit(Long id, Boolean pass, String reason) {

+ 21 - 0
src/main/java/com/izouma/dingdong/web/tencent/UserSigController.java

@@ -0,0 +1,21 @@
+package com.izouma.dingdong.web.tencent;
+
+import com.izouma.dingdong.utils.SecurityUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@AllArgsConstructor
+@RestController
+public class UserSigController {
+
+//    private UserSigService userSigService;
+
+    @GetMapping("/getUserSig")
+    public String getUserSig() {
+        Long id = SecurityUtils.getAuthenticatedUser().getId();
+//        return userSigService.generateUserSig(id.toString());
+        return null;
+    }
+
+}

+ 7 - 0
src/main/resources/application.yaml

@@ -74,6 +74,9 @@ aliyun:
     oss-domain: https://idingdong.oss-cn-hangzhou.aliyuncs.com
 general:
     host: http://dingdong.izouma.com
+ksher:
+    appid:
+    private_key:
 ---
 
 spring:
@@ -84,4 +87,8 @@ spring:
 spring:
     profiles: prod
 
+---
+IMConfig:
+    sdkAppId: 1400375593
+    secretKey: 7fe225c3b41cf2e7f0c79ebaf0e3b7ec60f6c7188e1561dcfddacb4767654417
 

+ 44 - 41
src/main/vue/src/views/AppraisalEdit.vue

@@ -2,45 +2,50 @@
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="108px" label-position="right" size="small"
                  style="max-width: 500px;">
-                <el-form-item prop="orderId" label="订单号">
-                            <el-input-number type="number" v-model="formData.orderId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="img" label="图片">
-                            <el-input v-model="formData.img"></el-input>
-                </el-form-item>
-                <el-form-item prop="goodsLike" label="商品评分">
-                            <el-input-number type="number" v-model="formData.goodsLike"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="goodsBad" label="商品评分">
-                            <el-input-number type="number" v-model="formData.goodsBad"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="goodsAppraise" label="商品评价">
-                            <el-input v-model="formData.goodsAppraise"></el-input>
-                </el-form-item>
-                <el-form-item prop="riderScore" label="骑手评分">
-                            <el-input-number type="number" v-model="formData.riderScore"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="riderAppraise" label="骑手评价">
-                            <el-input v-model="formData.riderAppraise"></el-input>
-                </el-form-item>
-                <el-form-item prop="merchantReply" label="商家回复评价">
-                            <el-input v-model="formData.merchantReply"></el-input>
-                </el-form-item>
-                <el-form-item prop="appraiseTime" label="评价日期">
-                            <el-date-picker
-                                    v-model="formData.appraiseTime"
-                                    type="datetime"
-                                    value-format="yyyy-MM-dd HH:mm:ss"
-                                    placeholder="选择日期时间">
-                            </el-date-picker>
-                </el-form-item>
+            <el-form-item prop="orderInfoId" label="订单号">
+                <el-input v-model="formData.orderInfoId"></el-input>
+            </el-form-item>
+            <el-form-item prop="img" label="图片">
+                <el-image
+                        style="width: 100px; height: 100px"
+                        :src="formData.img"
+                        :preview-src-list="formData.img">
+                </el-image>
+            </el-form-item>
+            <el-form-item prop="goodsLike" label="商品评分">
+                <el-input v-model="formData.goodsLike?'好评':'差评'"></el-input>
+            </el-form-item>
+            <el-form-item prop="goodsAppraise" label="商品评价">
+                <el-input type="textarea" v-model="formData.goodsAppraise"></el-input>
+            </el-form-item>
+            <el-form-item prop="riderLike" label="骑手评分">
+                <el-input v-model="formData.riderLike"></el-input>
+            </el-form-item>
+            <el-form-item prop="riderAppraise" label="骑手评价">
+                <el-input type="textarea" v-model="formData.riderAppraise"></el-input>
+            </el-form-item>
+            <el-form-item prop="fastIds" label="快捷评价">
+                <el-input v-model="formData.fastIds"></el-input>
+            </el-form-item>
+            <el-form-item prop="merchantReply" label="商家回复评价">
+                <el-input type="textarea" v-model="formData.merchantReply"></el-input>
+            </el-form-item>
+            <el-form-item prop="appraiseTime" label="评价日期">
+                <el-date-picker
+                        v-model="formData.appraiseTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        placeholder="选择日期时间">
+                </el-date-picker>
+            </el-form-item>
             <el-form-item>
-                <el-button @click="onSave" :loading="saving"
-                           type="primary">保存</el-button>
+               <!-- <el-button @click="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-button>-->
+                <el-button @click="$router.go(-1)">返回</el-button>
             </el-form-item>
         </el-form>
     </div>
@@ -51,7 +56,7 @@
         created() {
             if (this.$route.query.id) {
                 this.$http
-                    .get('appraisal/get/'+this.$route.query.id)
+                    .get('appraisal/get/' + this.$route.query.id)
                     .then(res => {
                         this.formData = res;
                     })
@@ -64,10 +69,8 @@
         data() {
             return {
                 saving: false,
-                formData: {
-                },
-                rules: {
-                },
+                formData: {},
+                rules: {},
             }
         },
         methods: {

+ 48 - 16
src/main/vue/src/views/OrderInfoEdit.vue

@@ -2,23 +2,30 @@
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="108px" label-position="right" size="small"
                  style="max-width: 500px;">
-            <el-form-item prop="userId" label="用户ID">
-                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            <el-form-item prop="nickname" label="用户昵称">
+                <el-input v-model="formData.nickname"></el-input>
             </el-form-item>
             <el-form-item prop="userAddress" label="配送地址">
-                <el-input v-model="formData.userAddress"></el-input>
+                <el-input v-model="address.name" style="width: 100px;padding-right: 10px"></el-input>
+                <el-input v-model="address.phone" style="width: 150px"></el-input>
+                <el-input type="textarea" v-model="address.info" style="padding-top: 10px"></el-input>
             </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 prop="merchantShowName" label="商户">
+                <el-input v-model="formData.merchantShowName"></el-input>
             </el-form-item>
             <el-form-item prop="merchantStatus" label="商家状态">
-                <el-input v-model="formData.merchantStatus"></el-input>
+                <el-input v-model="formData.merchantStatus"
+                ></el-input>
             </el-form-item>
             <!--            <el-form-item prop="merchantAddress" label="商家地址">-->
             <!--                <el-input v-model="formData.merchantAddress"></el-input>-->
             <!--            </el-form-item>-->
+            <el-form-item prop="riderName" label="骑手">
+                <el-input v-model="formData.riderName"></el-input>
+                <!--<el-button type="primary" @click="changeStatus">{{formData.riderStatus}}</el-button>-->
+            </el-form-item>
             <el-form-item prop="jobNumber" label="骑手工号">
-                <el-input v-model="formData.riderId"></el-input>
+                <el-input v-model="formData.jobNumber"></el-input>
                 <!--<el-button type="primary" @click="changeStatus">{{formData.riderStatus}}</el-button>-->
             </el-form-item>
 
@@ -26,7 +33,7 @@
                       <el-input v-model="formData.riderStatus"></el-input>
                   </el-form-item>-->
             <el-form-item prop="riderStatus" label="骑手状态">
-                <el-select v-model="formData.riderStatus" clearable filterable placeholder="请选择">
+                <el-select v-model="formData.riderStatus" disabled placeholder="请选择">
                     <el-option
                             v-for="item in riderStatusOptions"
                             :key="item.value"
@@ -36,19 +43,19 @@
                 </el-select>
             </el-form-item>
             <el-form-item prop="totalAmount" label="总价">
-                <el-input-number type="number" v-model="formData.totalAmount"></el-input-number>
+                <el-input v-model="formData.totalAmount" readonly></el-input>
             </el-form-item>
             <!--            <el-form-item prop="goodsAmount" label="商品总价">-->
             <!--                <el-input-number type="number" v-model="formData.goodsAmount"></el-input-number>-->
             <!--            </el-form-item>-->
             <el-form-item prop="deliveryAmount" label="配送费">
-                <el-input-number type="number" v-model="formData.deliveryAmount"></el-input-number>
+                <el-input v-model="formData.deliveryAmount" readonly></el-input>
             </el-form-item>
             <el-form-item prop="realAmount" label="实付金额">
-                <el-input-number type="number" v-model="formData.realAmount"></el-input-number>
+                <el-input v-model="formData.realAmount" readonly></el-input>
             </el-form-item>
             <el-form-item prop="payMethod" label="支付方式">
-                <el-select v-model="formData.payMethod" clearable filterable placeholder="请选择">
+                <el-select v-model="formData.payMethod" disabled placeholder="请选择">
                     <el-option
                             v-for="item in payMethodOptions"
                             :key="item.value"
@@ -65,6 +72,7 @@
             </el-form-item>
             <el-form-item prop="orderTime" label="下单时间">
                 <el-date-picker
+                        readonly
                         v-model="formData.orderTime"
                         type="datetime"
                         value-format="yyyy-MM-dd HH:mm:ss"
@@ -89,6 +97,7 @@
             <!--            </el-form-item>-->
             <el-form-item prop="userReceivedTime" label="用户收到时间">
                 <el-date-picker
+                        readonly
                         v-model="formData.userReceivedTime"
                         type="datetime"
                         value-format="yyyy-MM-dd HH:mm:ss"
@@ -113,17 +122,19 @@
 
                     </el-table>
                 </template>
-
             </el-form-item>
 
             <el-form-item>
-                <el-button @click="onSave" :loading="saving"
+                <!--<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="appraisal" v-if="formData.rated"
+                           type="primary">评价
                 </el-button>
-                <el-button @click="$router.go(-1)">取消</el-button>
+                <el-button @click="$router.go(-1)">返回</el-button>
             </el-form-item>
 
 
@@ -139,6 +150,10 @@
                     .get('orderInfo/get/' + this.$route.query.id)
                     .then(res => {
                         this.formData = res;
+                        let add = this.formData.userAddress.split(",");
+                        this.address.name = add[0];
+                        this.address.phone = add[1];
+                        this.address.info = add[2];
                     })
                     .catch(e => {
                         console.log(e);
@@ -174,7 +189,16 @@
                     {"label": "支付宝", "value": "ALI_PAY"},
                     {"label": "货到付款", "value": "CASH_DELIVERY"},
                     {"label": "信用卡", "value": "CREDIT_CARD"}],
+                merchantStatusOptions: [{"label": "接单", "value": "RECEIVED"}, {
+                    "label": "未接单",
+                    "value": "NOT_RECEIVED"
+                }, {"label": "已拒单", "value": "REJECTED"}],
                 goods: [],
+                address: {
+                    name: "",
+                    phone: "",
+                    info: "",
+                }
             }
         },
         methods: {
@@ -233,7 +257,15 @@
                         this.$message.error(e.error);
                     }
                 })
-            }
+            },
+            appraisal() {
+                this.$router.push({
+                    path: "/appraisalEdit",
+                    query: {
+                        id: this.formData.appraisalId
+                    }
+                });
+            },
         }
     }
 </script>

+ 13 - 10
src/main/vue/src/views/OrderInfoList.vue

@@ -32,22 +32,25 @@
                              width="50">
             </el-table-column>
             <el-table-column prop="status" label="状态" :formatter="statusFormatter"></el-table-column>
-            <el-table-column prop="id" label="ID" width="100">
-            </el-table-column>
-            <el-table-column prop="user.nickname" label="用户"
+       <!--     <el-table-column prop="id" label="ID" width="100">
+            </el-table-column>-->
+            <el-table-column prop="nickname" label="用户"
             >
             </el-table-column>
-            <el-table-column prop="userAddress" label="配送地址"
+<!--            <el-table-column prop="userAddress" label="配送地址"
             >
-            </el-table-column>
-            <el-table-column prop="merchantId" label="商户ID"
+            </el-table-column>-->
+            <el-table-column prop="merchantShowName" label="商户名称"
             >
             </el-table-column>
             <el-table-column prop="merchantStatus" label="商家状态"
                              :formatter="merchantStatusFormatter"
             >
             </el-table-column>
-            <el-table-column prop="riderId" label="骑手工号"
+            <el-table-column prop="riderName" label="骑手名称"
+            >
+            </el-table-column>
+            <el-table-column prop="jobNumber" label="骑手工号"
             >
             </el-table-column>
             <el-table-column prop="riderStatus" label="骑手状态"
@@ -91,10 +94,10 @@
                                         :formatter="datetimeFormatter"
             >
                                 </el-table-column> -->
-            <el-table-column prop="userReceivedTime" label="用户收到时间"
+            <!--<el-table-column prop="userReceivedTime" label="用户收到时间"
                              :formatter="datetimeFormatter"
             >
-            </el-table-column>
+            </el-table-column>-->
             <!--                    <el-table-column prop="isCoupon" label="使用优惠券"
             >
                                         <template slot-scope="{row}">
@@ -146,7 +149,7 @@
             return {
                 multipleMode: false,
                 search: "",
-                url: "/orderInfo/all",
+                url: "/orderInfo/blackAll",
                 downloading: false,
                 statusOptions: [{"label": "未支付", "value": "UNPAID"},
                     {"label": "已支付", "value": "PAID"},

+ 16 - 0
src/test/java/com/izouma/dingdong/KsherTest.java

@@ -0,0 +1,16 @@
+package com.izouma.dingdong;
+
+import com.izouma.dingdong.config.KsherPaySdk;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class KsherTest {
+    @Test
+    public void test(){
+       // new KsherPaySdk();
+    }
+}

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

@@ -112,9 +112,9 @@ public class MerchantServiceTest {
         pageQuery.setSearch(null);
         pageQuery.setSort("");
         //118.738275 31.991961
-        List<MerchantDTO> list = merchantService.showAll(pageQuery, 1.0, 1.0, "首单立减", 82L);
+        //List<MerchantDTO> list = merchantService.showAll(pageQuery, 1.0, 1.0, "首单立减", 82L);
 
-        System.out.println(list.size());
+        //System.out.println(list.size());
     }
 
     @Test

+ 84 - 0
src/test/java/com/izouma/dingdong/service/UserSigServiceTest.java

@@ -0,0 +1,84 @@
+package com.izouma.dingdong.service;
+
+import com.tencent.xinge.XingeApp;
+import com.tencent.xinge.bean.AudienceType;
+import com.tencent.xinge.bean.Message;
+import com.tencent.xinge.bean.MessageType;
+import com.tencent.xinge.push.app.PushAppRequest;
+import com.tencentyun.TLSSigAPIv2;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class UserSigServiceTest {
+//    @Autowired
+//    private UserSigService userSigService;
+
+    @Test
+    public void test() {
+//        System.out.println(userSigService.generateUserSig("83"));
+        TLSSigAPIv2 api = new TLSSigAPIv2(1400375593, "7fe225c3b41cf2e7f0c79ebaf0e3b7ec60f6c7188e1561dcfddacb4767654417");
+
+        System.out.println(api.genSig("admin", 30000));
+    }
+
+    @Test
+    public void test1() {
+//        String url1 = "https://console.tim.qq.com/v4/openim/batchsendmsg?random=99999999&contenttype=json";
+//        String url2 = "&sdkappid=1400375593&identifier=administrator&usersig=eJw1jrEOgjAURf*ls4GWV0ogcXFgwmgCRgcWYot5KohtAzXGf7cBvdu9Jye5b1IVZaDcgFqRDKjPap5GpUlGooCSpRt5a4YBJckYpxSSOE5hIShVb7HFWWhkhz0aqxv70H8VL544XZScTdVrd3Z1KKAOT8oIzmyRX8VB7vPnSO*RmTbHdmvWP9Vi52*xOOUJAGP88wUitDTf";
+//        url1 = url1 + url2;
+
+        String url1 = "https://console.tim.qq.com/v4/openim/sendmsg?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json";
+
+        String result = "";
+        try {
+            URL url = new URL(url1);
+            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            conn.setDoOutput(true);
+            // 腾讯地图使用GET
+            conn.setRequestMethod("GET");
+            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
+//            String line;
+//            // 获取地址解析结果
+//            while ((line = in.readLine()) != null) {
+//                result += line + "\n";
+//            }
+            System.out.println(in);
+            in.close();
+        } catch (Exception e) {
+            e.getMessage();
+        }
+        System.out.println(result);
+    }
+
+    @Test
+    public void test2() {
+        XingeApp xingeApp = new XingeApp.Builder()
+                .appId("1400375593")
+                .secretKey("7fe225c3b41cf2e7f0c79ebaf0e3b7ec60f6c7188e1561dcfddacb4767654417")
+                .domainUrl("https://api.tpns.tencent.com/")
+        .build();
+
+        PushAppRequest pushAppRequest = new PushAppRequest();
+        //完善PushAppRequest  消息
+        pushAppRequest.setMessage_type(MessageType.notify);
+        pushAppRequest.setAudience_type(AudienceType.all);
+
+        Message message = new Message();
+        message.setTitle("系统消息");
+        message.setContent("提现成功!!");
+        pushAppRequest.setMessage(message);
+
+        JSONObject ret = xingeApp.pushApp(pushAppRequest);
+        System.out.println(ret);
+    }
+}