licailing před 5 roky
rodič
revize
0bef492511
29 změnil soubory, kde provedl 913 přidání a 376 odebrání
  1. 242 213
      src/main/java/com/izouma/dingdong/config/KsherPaySdk.java
  2. 4 0
      src/main/java/com/izouma/dingdong/domain/FeeRecord.java
  3. 1 1
      src/main/java/com/izouma/dingdong/domain/Verified.java
  4. 3 0
      src/main/java/com/izouma/dingdong/domain/merchant/Merchant.java
  5. 6 40
      src/main/java/com/izouma/dingdong/dto/MerchantDTO.java
  6. 16 0
      src/main/java/com/izouma/dingdong/repo/FeeRecordRepo.java
  7. 31 33
      src/main/java/com/izouma/dingdong/service/ConsumptionService.java
  8. 14 0
      src/main/java/com/izouma/dingdong/service/FeeRecordService.java
  9. 18 9
      src/main/java/com/izouma/dingdong/service/OrderInfoService.java
  10. 3 2
      src/main/java/com/izouma/dingdong/service/OrderRefundApplyService.java
  11. 3 0
      src/main/java/com/izouma/dingdong/service/backstage/BlackListService.java
  12. 5 4
      src/main/java/com/izouma/dingdong/service/merchant/MerchantService.java
  13. 0 1
      src/main/java/com/izouma/dingdong/service/merchant/MerchantSettingsService.java
  14. 24 4
      src/main/java/com/izouma/dingdong/service/rider/RiderService.java
  15. 60 0
      src/main/java/com/izouma/dingdong/web/FeeRecordController.java
  16. 53 15
      src/main/java/com/izouma/dingdong/web/PayConsumptionController.java
  17. 2 2
      src/main/java/com/izouma/dingdong/web/VerifiedController.java
  18. 1 0
      src/main/resources/genjson/FeeRecord.json
  19. 53 0
      src/main/vue/src/components/EmilButton.vue
  20. 2 0
      src/main/vue/src/main.js
  21. 16 0
      src/main/vue/src/router.js
  22. 103 0
      src/main/vue/src/views/FeeRecordEdit.vue
  23. 185 0
      src/main/vue/src/views/FeeRecordList.vue
  24. 17 18
      src/main/vue/src/views/backstage/EmailEdit.vue
  25. 4 1
      src/main/vue/src/views/merchant/MerchantEdit.vue
  26. 6 6
      src/main/vue/src/views/merchant/MerchantList.vue
  27. 23 10
      src/main/vue/src/views/rider/RiderEdit.vue
  28. 5 10
      src/main/vue/src/views/rider/RiderList.vue
  29. 13 7
      src/test/java/com/izouma/dingdong/contorller/VerifiedControllerTest.java

+ 242 - 213
src/main/java/com/izouma/dingdong/config/KsherPaySdk.java

@@ -11,6 +11,7 @@ import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpPost;
 //import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.springframework.beans.factory.annotation.Value;
 
 import java.security.Signature;
 import java.security.KeyFactory;
@@ -35,16 +36,20 @@ import java.util.*;
  */
 public class KsherPaySdk {
 
-    private String appid;
-    private String privateKey;
-    private String PayDomain = "https://api.mch.ksher.net/KsherPay";
-    private String GateDomain = "https://gateway.ksher.com/api";
+    private       String                     appid;
+    private       String                     privateKey;
+    private       String                     PayDomain         = "https://api.mch.ksher.net/KsherPay";
+    private       String                     GateDomain        = "https://gateway.ksher.com/api";
     //定义加密方式
-    private final String KEY_RSA = "RSA";
+    private final String                     KEY_RSA           = "RSA";
     //定义签名算法
-    private final String KEY_RSA_SIGNATURE = "MD5withRSA";
-    private final java.text.SimpleDateFormat timeStampFormat = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
-    private final String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7955OCuN4I8eYNL/mixZWIXIgCvIVEivlxqdpiHPcOLdQ2RPSx/pORpsUu/E9wz0mYS2PY7hNc2mBgBOQT+wUCAwEAAQ==";
+    private final String                     KEY_RSA_SIGNATURE = "MD5withRSA";
+    private final java.text.SimpleDateFormat timeStampFormat   = new java.text.SimpleDateFormat("yyyyMMddHHmmss");
+    private final String                     publicKey         = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL7955OCuN4I8eYNL/mixZWIXIgCvIVEivlxqdpiHPcOLdQ2RPSx/pORpsUu/E9wz0mYS2PY7hNc2mBgBOQT+wUCAwEAAQ==";
+
+    //回调
+    @Value("${general.notify-url}")
+    private String notifyUrl;
 
     public KsherPaySdk(String appid, String privateKey) {
         this.appid = appid;
@@ -53,6 +58,7 @@ public class KsherPaySdk {
 
     /**
      * sign byte to hex
+     *
      * @param bytes
      * @return
      */
@@ -66,6 +72,7 @@ public class KsherPaySdk {
 
     /**
      * hex string to byte
+     *
      * @param sign
      * @return
      */
@@ -79,11 +86,11 @@ public class KsherPaySdk {
 
     /**
      * 请求参数排序
+     *
      * @param params
      * @return
      */
-    public byte[] getParamsSort(Map params)
-    {
+    public byte[] getParamsSort(Map params) {
         TreeMap<String, String> sortParas = new TreeMap<String, String>();
         sortParas.putAll(params);
         Iterator<String> it = sortParas.keySet().iterator();
@@ -97,6 +104,7 @@ public class KsherPaySdk {
 
     /**
      * 签名
+     *
      * @param params
      * @return
      */
@@ -119,8 +127,10 @@ public class KsherPaySdk {
         //String sing_str = new String(Base64.encodeBase64(signature.sign()));
         return bytesToHex(sign_byte);
     }
+
     /**
      * 校验数字签名
+     *
      * @param data
      * @param sign
      * @return 校验成功返回true,失败返回false
@@ -161,7 +171,7 @@ public class KsherPaySdk {
         params.put("time_stamp", timeStampFormat.format(new Date()));
 
         //回调
-        params.put("notify_url","");
+        params.put("notify_url", notifyUrl);
 
         List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
         for (Iterator iter = params.keySet().iterator(); iter.hasNext(); ) {
@@ -184,21 +194,22 @@ public class KsherPaySdk {
 
         JSONObject json = JSONObject.parseObject(result.toString());
         boolean isVerify = KsherVerify(json.getJSONObject("data"), json.getString("sign"));
-        if(isVerify){
+        if (isVerify) {
             return result.toString();
-        }else{
+        } else {
             throw new Exception("verify signature failed");
         }
     }
 
     /**
      * 商户扫用户(B扫C)
+     *
      * @param mchOrderNo 商户订单号
-     * @param feeType 支付币种 'THB'泰铢 'CNY'人民币
-     * @param authCode 支付条码
-     * @param channel 支付通道 wechat aplipay
+     * @param feeType    支付币种 'THB'泰铢 'CNY'人民币
+     * @param authCode   支付条码
+     * @param channel    支付通道 wechat aplipay
      * @param operatorId 操作员编号 可选
-     * @param totalFee 支付金额
+     * @param totalFee   支付金额
      * @return
      */
     public String QuickPay(String mchOrderNo, String feeType, String authCode, String channel, String operatorId, Integer totalFee) {
@@ -220,18 +231,19 @@ public class KsherPaySdk {
     /**
      * C扫B支付
      * 必传参数
-     * 	mch_order_no
-     * 	total_fee
-     * 	fee_type
-     * 	channel
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel
      * 选传参数
-     * 	redirect_url
-     * 	notify_url
-     * 	paypage_title
-     * 	operator_id
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * operator_id
+     *
      * @return
      */
-    public String JsApiPay(String mchOrderNo,String feeType,String channel,Integer totalFee){
+    public String JsApiPay(String mchOrderNo, String feeType, String channel, Integer totalFee) {
         try {
             Map<String, String> paras = new HashMap<String, String>();
             paras.put("mch_order_no", mchOrderNo);
@@ -244,26 +256,27 @@ public class KsherPaySdk {
             return ex.getMessage();
         }
     }
+
     /**
-    动态码支付
-    :param kwargs:
-    必传参数
-        mch_order_no
-        total_fee
-        fee_type
-        channel
-    选传参数
-        redirect_url
-        notify_url
-        paypage_title
-        product
-        attach
-        operator_id
-        device_id
-        img_type
-    :return:
-    **/
-    public String NativePay(String mchOrderNo, String feeType, String channel,Integer totalFee) throws Exception {
+     * 动态码支付
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel
+     * 选传参数
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * product
+     * attach
+     * operator_id
+     * device_id
+     * img_type
+     * :return:
+     **/
+    public String NativePay(String mchOrderNo, String feeType, String channel, Integer totalFee) throws Exception {
         Map<String, String> paras = new HashMap<>();
         paras.put("mch_order_no", mchOrderNo);
         paras.put("total_fee", totalFee.toString());
@@ -271,25 +284,27 @@ public class KsherPaySdk {
         paras.put("channel", channel);
         return KsherPost(PayDomain + "/native_pay", paras);
     }
+
     /**
-    小程序支付
-    :param kwargs:
-    必传参数
-        mch_order_no
-        total_fee
-        fee_type
-        channel
-        sub_openid
-        channel_sub_appid
-    选传参数
-        redirect_url
-        notify_url
-        paypage_title
-        product
-        operator_id
-    :return:
-    **/
-    public String MiniproPay(String mchOrderNo, String feeType, String channel, String subOpenid, String channelSubAppId, Integer totalFee) throws Exception{
+     * 小程序支付
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel
+     * sub_openid
+     * channel_sub_appid
+     * 选传参数
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * product
+     * operator_id
+     * :return:
+     **/
+    public String MiniproPay(String mchOrderNo, String feeType, String channel, String subOpenid, String channelSubAppId,
+                             Integer totalFee, String attach) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         paras.put("total_fee", totalFee.toString());
@@ -297,29 +312,32 @@ public class KsherPaySdk {
         paras.put("channel", channel);
         paras.put("sub_openid", subOpenid);
         paras.put("channel_sub_appid", channelSubAppId);
+        paras.put("attach", attach);
         return KsherPost(PayDomain + "/mini_program_pay", paras);
     }
+
     /**
-    app支付
-    :param kwargs:
-    必传参数
-        mch_order_no
-        total_fee
-        fee_type
-        channel wechat/alipay
-        sub_openid
-        channel_sub_appid
-    选传参数
-        redirect_url
-        notify_url
-        paypage_title
-        product
-        attach
-        operator_id
-        refer_url 仅当channel为alipay时需要
-    :return:
-    **/
-    public String AppPay(String mchOrderNo,String feeType,String channel,String subOpenid,String channelSubAppId, Integer totalFee) throws Exception {
+     * app支付
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel wechat/alipay
+     * sub_openid
+     * channel_sub_appid
+     * 选传参数
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * product
+     * attach
+     * operator_id
+     * refer_url 仅当channel为alipay时需要
+     * :return:
+     **/
+    public String AppPay(String mchOrderNo, String feeType, String channel, String subOpenid, String channelSubAppId,
+                         Integer totalFee, String attach) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         paras.put("total_fee", totalFee.toString());
@@ -327,28 +345,30 @@ public class KsherPaySdk {
         paras.put("channel", channel);
         paras.put("sub_openid", subOpenid);
         paras.put("channel_sub_appid", channelSubAppId);
+        paras.put("attach", attach);
         return KsherPost(PayDomain + "/app_pay", paras);
     }
+
     /**
-    H5支付,仅支持channel=alipay
-    :param kwargs:
-    必传参数
-        mch_order_no
-        total_fee
-        fee_type
-        channel
-    选传参数
-        redirect_url
-        notify_url
-        paypage_title
-        product
-        attach
-        operator_id
-        device_id
-        refer_url
-    :return:
-    **/
-    public String WapPay(String mchOrderNo,String feeType,String channel, Integer totalFee) throws Exception {
+     * H5支付,仅支持channel=alipay
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel
+     * 选传参数
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * product
+     * attach
+     * operator_id
+     * device_id
+     * refer_url
+     * :return:
+     **/
+    public String WapPay(String mchOrderNo, String feeType, String channel, Integer totalFee) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         paras.put("total_fee", totalFee.toString());
@@ -356,26 +376,27 @@ public class KsherPaySdk {
         paras.put("channel", channel);
         return KsherPost(PayDomain + "/wap_pay", paras);
     }
+
     /**
-    PC网站支付,仅支持channel=alipay
-    :param kwargs:
-    必传参数
-        mch_order_no
-        total_fee
-        fee_type
-        channel
-    选传参数
-        redirect_url
-        notify_url
-        paypage_title
-        product
-        attach
-        operator_id
-        device_id
-        refer_url
-    :return:
-    **/
-    public String WepPay(String mchOrderNo,String feeType,String channel,Integer totalFee)throws Exception{
+     * PC网站支付,仅支持channel=alipay
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * total_fee
+     * fee_type
+     * channel
+     * 选传参数
+     * redirect_url
+     * notify_url
+     * paypage_title
+     * product
+     * attach
+     * operator_id
+     * device_id
+     * refer_url
+     * :return:
+     **/
+    public String WepPay(String mchOrderNo, String feeType, String channel, Integer totalFee) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         paras.put("total_fee", totalFee.toString());
@@ -383,60 +404,65 @@ public class KsherPaySdk {
         paras.put("channel", channel);
         return KsherPost(PayDomain + "/wap_pay", paras);
     }
+
     /**
-    订单查询
-    :param kwargs:
-    必传参数
-        mch_order_no、ksher_order_no、channel_order_no三选一
-    :return:
-    **/
-    public String OrderQuery(String mchOrderNo) throws Exception{
+     * 订单查询
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no、ksher_order_no、channel_order_no三选一
+     * :return:
+     **/
+    public String OrderQuery(String mchOrderNo) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         return KsherPost(PayDomain + "/order_query", paras);
     }
+
     /**
-    订单关闭
-    :param kwargs:
-    必传参数
-        mch_order_no、ksher_order_no、channel_order_no三选一
-    选传参数
-        operator_id
-    :return:
-    **/
+     * 订单关闭
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no、ksher_order_no、channel_order_no三选一
+     * 选传参数
+     * operator_id
+     * :return:
+     **/
     public String OrderClose(String mchOrderNo) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         return KsherPost(PayDomain + "/order_close", paras);
     }
+
     /**
-    订单撤销
-    :param kwargs:
-    必传参数
-        mch_order_no、ksher_order_no、channel_order_no三选一
-    选传参数
-        operator_id
-    :return:
-    **/
-    public String OrderReverse(String mchOrderNo) throws Exception{
+     * 订单撤销
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no、ksher_order_no、channel_order_no三选一
+     * 选传参数
+     * operator_id
+     * :return:
+     **/
+    public String OrderReverse(String mchOrderNo) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mchOrderNo);
         return KsherPost(PayDomain + "/order_reverse", paras);
     }
+
     /**
-    订单退款
-    :param kwargs:
-    必传参数
-        total_fee
-        fee_type
-        refund_fee
-        mch_refund_no
-        mch_order_no、ksher_order_no、channel_order_no三选一
-    选传参数
-        operator_id
-    :return:
-    **/
-    public String OrderRefund(String mchRefundNo,String feeType,String mchOrderNo,Integer refundFee,Integer totalFee) throws Exception {
+     * 订单退款
+     * :param kwargs:
+     * 必传参数
+     * total_fee
+     * fee_type
+     * refund_fee
+     * mch_refund_no
+     * mch_order_no、ksher_order_no、channel_order_no三选一
+     * 选传参数
+     * operator_id
+     * :return:
+     **/
+    public String OrderRefund(String mchRefundNo, String feeType, String mchOrderNo, Integer refundFee,
+                              Integer totalFee) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_refund_no", mchRefundNo);
         paras.put("fee_type", feeType);
@@ -445,29 +471,31 @@ public class KsherPaySdk {
         paras.put("total_fee", totalFee.toString());
         return KsherPost(PayDomain + "/order_refund", paras);
     }
+
     /**
-    退款查询
-    :param kwargs:
-        必传参数
-            mch_refund_no、ksher_refund_no、channel_refund_no三选一
-            mch_order_no、ksher_order_no、channel_order_no三选一
-    **/
-    public String RefundQuery(String mchRefundNo, String mchOrderNo) throws Exception{
+     * 退款查询
+     * :param kwargs:
+     * 必传参数
+     * mch_refund_no、ksher_refund_no、channel_refund_no三选一
+     * mch_order_no、ksher_order_no、channel_order_no三选一
+     **/
+    public String RefundQuery(String mchRefundNo, String mchOrderNo) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_refund_no", mchRefundNo);
         paras.put("mchOrderNo", mchOrderNo);
         return KsherPost(PayDomain + "/refund_query", paras);
     }
+
     /**
-    汇率查询
-    :param kwargs:
-        必传参数
-        channel
-        fee_type
-        date
-    :return:
-    **/
-    public String RateQuery(String channel, String feeType,String  date) throws Exception{
+     * 汇率查询
+     * :param kwargs:
+     * 必传参数
+     * channel
+     * fee_type
+     * date
+     * :return:
+     **/
+    public String RateQuery(String channel, String feeType, String date) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("channel", channel);
         paras.put("fee_type", feeType);
@@ -476,50 +504,50 @@ public class KsherPaySdk {
     }
 
     /**
-    聚合支付商户查询订单支付状态
-    :param kwargs:
-	    必传参数
-		mch_order_no
-    :return:
-    **/
-    public String GatewayOrderQuery(String mch_order_no) throws Exception{
+     * 聚合支付商户查询订单支付状态
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no
+     * :return:
+     **/
+    public String GatewayOrderQuery(String mch_order_no) throws Exception {
         Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mch_order_no);
         return KsherPost(GateDomain + "gateway_order_query", paras);
     }
 
     /**
-    聚合支付商户通过API提交数据
-    :param kwargs:
-	    必传参数
-		mch_order_no: 商户订单号 str
-		total_fee: 金额(分) int
-		fee_type: 货币种类 str
-		channel_list: 支付通道 str
-		mch_code: 商户订单code str
-		mch_redirect_url: 商户通知url str
-		mch_redirect_url_fail: 失败回调网址 str
-		product_name: 商品描述 str
-		refer_url: 商家refer str
-		device: 设备名称(PC or H5) str
-	    选传参数
-		color: 横幅颜色 str
-		background: 横幅背景图片 str
-		payment_color: 支付按钮颜色 str
-		ksher_explain: 最下方文案 str
-		hide_explain: 是否显示最下方文案(1显示 0不显示) int
-		expire_time: 订单过期时间(min) int
-		hide_exp_time: 是否显示过期时间(1显示 0不显示) int
-		logo: 横幅logo str
-		lang: 语言(en,cn,th) str
-		shop_name: logo旁文案 str
-		attach: 商户附加信息 str
-    :return:
-	{'pay_content': 'https://gateway.ksher.com/mindex?order_uuid=订单uuid'}
-	**/
-	public String GatewayPay(String mch_order_no, String fee_type, String channel_list, String mch_code, String mch_redirect_url,
-	String mch_redirect_url_fail, String product_name, String refer_url, String device, Integer total_fee) throws Exception{
-	    Map<String, String> paras = new HashMap<String, String>();
+     * 聚合支付商户通过API提交数据
+     * :param kwargs:
+     * 必传参数
+     * mch_order_no: 商户订单号 str
+     * total_fee: 金额(分) int
+     * fee_type: 货币种类 str
+     * channel_list: 支付通道 str
+     * mch_code: 商户订单code str
+     * mch_redirect_url: 商户通知url str
+     * mch_redirect_url_fail: 失败回调网址 str
+     * product_name: 商品描述 str
+     * refer_url: 商家refer str
+     * device: 设备名称(PC or H5) str
+     * 选传参数
+     * color: 横幅颜色 str
+     * background: 横幅背景图片 str
+     * payment_color: 支付按钮颜色 str
+     * ksher_explain: 最下方文案 str
+     * hide_explain: 是否显示最下方文案(1显示 0不显示) int
+     * expire_time: 订单过期时间(min) int
+     * hide_exp_time: 是否显示过期时间(1显示 0不显示) int
+     * logo: 横幅logo str
+     * lang: 语言(en,cn,th) str
+     * shop_name: logo旁文案 str
+     * attach: 商户附加信息 str
+     * :return:
+     * {'pay_content': 'https://gateway.ksher.com/mindex?order_uuid=订单uuid'}
+     **/
+    public String GatewayPay(String mch_order_no, String fee_type, String channel_list, String mch_code, String mch_redirect_url,
+                             String mch_redirect_url_fail, String product_name, String refer_url, String device, Integer total_fee, String attach) throws Exception {
+        Map<String, String> paras = new HashMap<String, String>();
         paras.put("mch_order_no", mch_order_no);
         paras.put("fee_type", fee_type);
         paras.put("channel_list", channel_list);
@@ -530,6 +558,7 @@ public class KsherPaySdk {
         paras.put("refer_url", refer_url);
         paras.put("device", device);
         paras.put("total_fee", total_fee.toString());
+        paras.put("attach", attach);
         return KsherPost(GateDomain + "gateway_pay", paras);
-	}
+    }
 }

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

@@ -39,6 +39,10 @@ public class FeeRecord extends BaseEntity {
      */
     private Boolean isPay;
 
+    private LocalDateTime dateTime;
+
+    private String orderId;
+
     @Column(nullable = false)
     private Boolean enabled = true;
 

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

@@ -37,7 +37,7 @@ public class Verified extends BaseEntity {
 
     @Column(nullable = false)
     @ApiModelProperty(value = "可修改", name = "canEdit")
-    private Boolean canEdit = true;
+    private Boolean canEdit;
 
     @Builder.Default
     @Column(nullable = false)

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

@@ -96,6 +96,9 @@ public class Merchant extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "推广语", name = "promo")
     private String promo;
 
+    @ApiModelProperty(value = "不通过原因", name = "failure")
+    private String failure;
+
     /**
      * 都不是 0
      * 新商家 1

+ 6 - 40
src/main/java/com/izouma/dingdong/dto/MerchantDTO.java

@@ -67,50 +67,13 @@ public class MerchantDTO implements Serializable {
         goodNum = merchant.getGoodNum();
         badNum = merchant.getBadNum();
         tag = merchant.getTag();
+        failure = merchant.getFailure();
     }
 
     //包含距离
     public MerchantDTO(Merchant merchant, MerchantSettings merchantSettings, Double distance) {
-        address = merchant.getAddress();
-        aliAccount = merchant.getAliAccount();
-        aliName = merchant.getAliName();
-        blacklist = merchant.getBlacklist();
-        merchantNatureId = merchantSettings.getMerchantNatureId();
-        category = merchantSettings.getCategory();
-        enabled = merchant.getEnabled();
-        endTime = merchantSettings.getEndTime();
-        firstOrder = merchantSettings.getFirstOrder();
-        mid = merchant.getId();
-        img = merchantSettings.getImg();
-        introduction = merchantSettings.getIntroduction();
-        name = merchant.getName();
-        /*    newUser = merchantSettings.getNewUser();*/
-        phone = merchant.getPhone();
-        qualification = merchantSettings.getQualification();
-        showName = merchant.getShowName();
-        startTime = merchantSettings.getStartTime();
-        isPass = merchant.getIsPass();
-        status = merchant.getStatus();
-        establishTime = merchant.getEstablishTime();
-        week = merchantSettings.getWeek();
-        banner = merchantSettings.getBanner();
-        logo = merchant.getLogo();
-        proclamation = merchantSettings.getProclamation();
-        userId = merchant.getUserId();
-        merchantNature = merchantSettings.getMerchantNature();
-        startingAmount = merchantSettings.getStartingAmount();
-        preparationTime = merchantSettings.getPreparationTime();
-        isOpening = merchantSettings.getIsOpening();
-        automaticOrder = merchantSettings.getAutomaticOrder();
-        doorHeadImg = merchantSettings.getDoorHeadImg();
-        promo = merchant.getPromo();
-        buyAlliance = merchantSettings.getBuyAlliance();
-        monthSales = merchant.getMonthSales();
+        this(merchant, merchantSettings);
         this.distance = distance;
-        priority = merchantSettings.getPriority();
-        goodNum = merchant.getGoodNum();
-        badNum = merchant.getBadNum();
-        tag = merchant.getTag();
     }
 
     private Long mid;
@@ -261,6 +224,9 @@ public class MerchantDTO implements Serializable {
      * 新商家 1
      * 明星商家 2
      */
-    @ApiModelProperty(value = "商家标签",name = "tag")
+    @ApiModelProperty(value = "商家标签", name = "tag")
     private Integer tag;
+
+    @ApiModelProperty(value = "不通过原因", name = "failure")
+    private String failure;
 }

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

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

+ 31 - 33
src/main/java/com/izouma/dingdong/service/ConsumptionService.java

@@ -37,12 +37,16 @@ public class ConsumptionService {
         this.properties = properties;
     }
 
+    private KsherPaySdk getSdk() {
+        return new KsherPaySdk(appid, privateKey);
+    }
+
     /*
     app支付 只能微信和支付宝
     */
-    public void appPay(OrderInfo orderInfo) {
+    public String appPay(OrderInfo orderInfo) {
         //ksher支付SDK
-        KsherPaySdk ksherPaySdk = new KsherPaySdk(appid, privateKey);
+        KsherPaySdk ksherPaySdk = getSdk();
         //商家产生的唯一no
         String mchOrderNo = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
         //总数 分为单位
@@ -57,22 +61,26 @@ public class ConsumptionService {
         if (orderInfo.getUser().getOpenId() != null) {
             subOpenid = orderInfo.getUser().getOpenId();
         }
+        String request = "";
         try {
             //调app支付
-            ksherPaySdk.AppPay(mchOrderNo, feeType, channel, subOpenid, properties.getAppId(), total);
-//            success(mchOrderNo, channel, total, request);
+            request = ksherPaySdk.AppPay(mchOrderNo, feeType, channel, subOpenid, properties.getAppId(), total, orderInfo
+                    .getId()
+                    .toString());
+            // success(mchOrderNo, channel, total, request);
         } catch (Exception e) {
             log.info("支付异常", e);
             throw new BusinessException(e.getMessage());
         }
+        return request;
     }
 
     /*
     聚合支付
      */
-    public void cardPay(OrderInfo orderInfo) {
+    public String cardPay(OrderInfo orderInfo) {
         //ksher支付SDK
-        KsherPaySdk ksherPaySdk = new KsherPaySdk(appid, privateKey);
+        KsherPaySdk ksherPaySdk = getSdk();
         //商家产生的唯一no
         String mchOrderNo = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
         //支付方式
@@ -85,22 +93,28 @@ public class ConsumptionService {
         String device = "H5";
         //内容
         String productName = "购买商品";
+
+        String request = "";
         try {
-            ksherPaySdk.GatewayPay(mchOrderNo, feeType, channelList, mchCode, null, null, productName, null, device, total);
+            request = ksherPaySdk.GatewayPay(mchOrderNo, feeType, channelList, mchCode, null,
+                    null, productName, null, device, total, orderInfo
+                            .getId()
+                            .toString());
 //            success(mchOrderNo, channelList, total, request);
         } catch (Exception e) {
             log.info("支付异常", e);
             throw new BusinessException(e.getMessage());
         }
+        return request;
     }
 
 
     /*
     小程序支付 只能微信和支付宝
     */
-    public void miniproPay(OrderInfo orderInfo) {
+    public String miniproPay(OrderInfo orderInfo) {
         //ksher支付SDK
-        KsherPaySdk ksherPaySdk = new KsherPaySdk(appid, privateKey);
+        KsherPaySdk ksherPaySdk = getSdk();
         //商家产生的唯一no
         String mchOrderNo = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
         //总数 分为单位
@@ -117,14 +131,19 @@ public class ConsumptionService {
         } else {
             throw new BusinessException("openId为空");
         }
+
+        String request = "";
         try {
             //调小程序支付
-            ksherPaySdk.MiniproPay(mchOrderNo, feeType, channel, subOpenid, properties.getAppId(), total);
+            request = ksherPaySdk.MiniproPay(mchOrderNo, feeType, channel, subOpenid, properties.getAppId(), total, orderInfo
+                    .getId()
+                    .toString());
 //            success(mchOrderNo, channel, total, request);
         } catch (Exception e) {
             log.info("支付异常", e);
             throw new BusinessException(e.getMessage());
         }
+        return request;
     }
 
     /*
@@ -132,11 +151,11 @@ public class ConsumptionService {
      */
     public void refund(FeeRecord feeRecord) {
         //ksher支付SDK
-        KsherPaySdk ksherPaySdk = new KsherPaySdk(appid, privateKey);
+        KsherPaySdk ksherPaySdk = getSdk();
         String mchRefundNo = String.valueOf(new SnowflakeIdWorker(1, 1).nextId());
         try {
             //全部退款
-            ksherPaySdk.OrderRefund(mchRefundNo, feeType, feeRecord.getMchNo(), feeRecord.getTotalFee(), feeRecord
+            String request = ksherPaySdk.OrderRefund(mchRefundNo, feeType, feeRecord.getMchNo(), feeRecord.getTotalFee(), feeRecord
                     .getTotalFee());
 //            success(mchRefundNo, feeRecord.getChannel(), feeRecord.getTotalFee(), request);
         } catch (Exception e) {
@@ -144,25 +163,4 @@ public class ConsumptionService {
             throw new BusinessException(e.getMessage());
         }
     }
-
-/*    private void success(String mchOrderNo, String channel, Integer total, String request) {
-        JSONObject json = JSONObject.parseObject(request);
-        String result = json.getJSONObject("data").getString("result");
-        if ("SUCCESS".equals(result)) {
-            FeeRecord.builder()
-                    .channel(channel)
-                    .feeType(feeType)
-                    .isRefund(false)
-                    .totalFee(total)
-                    .isPay(true)
-                    .mchNo(mchOrderNo)
-                    .enabled(true)
-                    .build();
-
-        } else {
-            throw new BusinessException("支付失败");
-        }
-    }*/
-
-
 }

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

@@ -0,0 +1,14 @@
+package com.izouma.dingdong.service;
+
+import com.izouma.dingdong.domain.FeeRecord;
+import com.izouma.dingdong.repo.FeeRecordRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class FeeRecordService {
+
+    private FeeRecordRepo feeRecordRepo;
+
+}

+ 18 - 9
src/main/java/com/izouma/dingdong/service/OrderInfoService.java

@@ -168,10 +168,6 @@ public class OrderInfoService {
             }
         }
 
-
-        //设置状态已支付
-        orderInfo.setStatus(OrderStatus.PAID);
-
         OrderInfo save = orderInfoRepo.save(orderInfo);
 
         cart.getOrderGoodsSpecs().forEach(s -> {
@@ -191,16 +187,29 @@ public class OrderInfoService {
                 }
         );
 
+        return save;
+
+    }
+
+    /*
+    订单支付完成后
+     */
+    public void toCompleted(Long orderId) {
+        OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        //设置状态已支付
+        orderInfo.setStatus(OrderStatus.PAID);
+        orderInfoRepo.save(orderInfo);
+
+        //商家
+        MerchantSettings merchantSettings = merchantSettingsRepo.findByMerchantId(orderInfo.getMerchantId())
+                .orElseThrow(new BusinessException("无商家"));
         //商家是否自动接单
         if (merchantSettings.getAutomaticOrder()) {
-            merReceiveOrder(save.getId(), true);
+            merReceiveOrder(orderInfo.getId(), true);
         }
 
         //购物车删除
-        shoppingCartRepo.deleteById(cart.getId());
-
-        return save;
-
+        shoppingCartRepo.deleteById(orderInfo.getId());
     }
 
 

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

@@ -262,12 +262,13 @@ public class OrderRefundApplyService {
         //如果是货到付款
         if (PayMethod.CASH_DELIVERY.equals(orderInfo.getPayMethod())){
             //从骑手账户减去金额
-//            riderService.income(orderInfo.getRiderId());
+            riderService.income(orderInfo.getRiderId(),orderInfo.getUserId(),orderInfo.getRealAmount(),FinancialType.EXPENDITURE,"货到付款抵扣",RiderMoneyType.CASH_ON_DELIVERY_DEDUCTION);
+
         }
     }
 
     /*
-    打款
+    确认已打款
      */
     public void payment(Long applyId) {
         OrderRefundApply apply = orderRefundApplyRepo.findById(applyId).orElseThrow(new BusinessException("无退款申请"));

+ 3 - 0
src/main/java/com/izouma/dingdong/service/backstage/BlackListService.java

@@ -95,6 +95,9 @@ public class BlackListService {
         }
     }
 
+    /*
+    加入黑名单
+     */
     public BlackList move1(Long id, String reason) {
         //是否已存在黑名单且未移出
         BlackList blackList = blackListRepo.findByOtherIdAndRemoveFalse(id);

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

@@ -218,13 +218,14 @@ public class MerchantService {
             }
             verified.setCanEdit(false);
             verifiedRepo.save(verified);
+            merchantRepo.save(merchant);
+            return;
 
-        } else {
-            merchant.setStatus(ApplyStatus.DENY);
-            merchant.setIsPass(false);
         }
+        merchant.setStatus(ApplyStatus.DENY);
+        merchant.setIsPass(false);
+        merchant.setFailure(promo);
         merchantRepo.save(merchant);
-
     }
 
     /**

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

@@ -13,7 +13,6 @@ import com.izouma.dingdong.domain.merchant.Merchant;
 import com.izouma.dingdong.domain.merchant.MerchantSettings;
 import com.izouma.dingdong.domain.merchant.Sales;
 import com.izouma.dingdong.domain.user.UserCoupon;
-import com.izouma.dingdong.dto.FilterDTO;
 import com.izouma.dingdong.dto.MerchantDTO;
 import com.izouma.dingdong.dto.PageQuery;
 import com.izouma.dingdong.enums.ApplyStatus;

+ 24 - 4
src/main/java/com/izouma/dingdong/service/rider/RiderService.java

@@ -14,6 +14,7 @@ import com.izouma.dingdong.exception.BusinessException;
 import com.izouma.dingdong.repo.MoneyRecordRepo;
 import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.repo.UserRepo;
+import com.izouma.dingdong.repo.VerifiedRepo;
 import com.izouma.dingdong.repo.rider.RiderLocationRepo;
 import com.izouma.dingdong.repo.rider.RiderRepo;
 import com.izouma.dingdong.repo.rider.RiderSignRepo;
@@ -41,7 +42,7 @@ public class RiderService {
     private RiderSignRepo           riderSignRepo;
     private RiderLocationRepo       riderLocationRepo;
     private SysConfigService        sysConfigService;
-
+    private VerifiedRepo            verifiedRepo;
 
     /*
     骑手注册
@@ -69,6 +70,15 @@ public class RiderService {
         if (pass) {
             rider.setStatus(ApplyStatus.PASS);
             //boolean i = true;
+
+            //审核通过后无法修改实名信息
+            Verified verified = verifiedRepo.findByUserId(rider.getUserId());
+            if (verified == null) {
+                throw new BusinessException("无法人信息");
+            }
+            verified.setCanEdit(false);
+            verifiedRepo.save(verified);
+
             while (true) {
                 //随机生成骑手工号 一个首字母+四个数字
                 String jobNumber1 = RandomStringUtils.randomAlphabetic(1).toUpperCase();
@@ -123,9 +133,19 @@ public class RiderService {
      * @param remark     备注
      */
     public void income(Long riderId, Long fromUserId, BigDecimal amount, FinancialType type, String remark, RiderMoneyType moneyType) {
-        //骑手应得  riderRepo.findUserIdById(riderId)
-        User riderUser = userRepo.findById(riderId).orElseThrow(new BusinessException("无用户"));
-        riderUser.setMoney(riderUser.getMoney().add(amount));
+        //骑手应得
+        Rider rider = riderRepo.findById(riderId).orElseThrow(new BusinessException("无骑手"));
+        User riderUser = userRepo.findById(rider.getUserId()).orElseThrow(new BusinessException("无用户"));
+        switch (type) {
+            case INCOME:
+                riderUser.setMoney(riderUser.getMoney().add(amount));
+                break;
+            case EXPENDITURE:
+                riderUser.setMoney(riderUser.getMoney().subtract(amount));
+                break;
+        }
+//        riderUser.setMoney(riderUser.getMoney().add(amount));
+
         userRepo.save(riderUser);
 
         String avatar = "";

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

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

+ 53 - 15
src/main/java/com/izouma/dingdong/web/PayConsumptionController.java

@@ -3,17 +3,20 @@ package com.izouma.dingdong.web;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.izouma.dingdong.domain.FeeRecord;
+import com.izouma.dingdong.domain.OrderInfo;
+import com.izouma.dingdong.exception.BusinessException;
+import com.izouma.dingdong.repo.FeeRecordRepo;
+import com.izouma.dingdong.repo.OrderInfoRepo;
 import com.izouma.dingdong.service.ConsumptionService;
+import com.izouma.dingdong.service.OrderInfoService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -26,15 +29,19 @@ import static com.alibaba.fastjson.serializer.SerializerFeature.PrettyFormat;
 @Slf4j
 public class PayConsumptionController {
     private ConsumptionService consumptionService;
+    private FeeRecordRepo      feeRecordRepo;
+    private OrderInfoService   orderInfoService;
+    private OrderInfoRepo      orderInfoRepo;
 
     /**
      * 支付回调
+     *
      * @param request
      * @param response
      * @return
      */
-    @PostMapping(value = "/notify",produces = "application/json; charset=utf-8")
-    public Map<?,?> notify(HttpServletRequest request, HttpServletResponse response) {
+    @PostMapping(value = "/notify", produces = "application/json; charset=utf-8")
+    public Map<?, ?> notify(HttpServletRequest request, HttpServletResponse response) {
         Map<String, String> params = new HashMap<>();
         Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
 
@@ -56,24 +63,55 @@ public class PayConsumptionController {
             }
         }
         log.info("ksher支付回调 {}", JSON.toJSONString(params, PrettyFormat));
+
+        Map<String, String> result = new HashMap<>();
+
         if (MapUtils.getString(params, "result").equals("SUCCESS")) {
             JSONObject body = JSON.parseObject(params.get("data"));
-/*            FeeRecord.builder()
-                    .channel(channel)
-                    .feeType(feeType)
+            //保存到流水
+            feeRecordRepo.save(FeeRecord.builder()
+                    .channel(body.getString("channel"))
+                    .feeType(body.getString("fee_type"))
                     .isRefund(false)
-                    .totalFee(total)
+                    .totalFee(body.getInteger("total_fee"))
                     .isPay(true)
-                    .mchNo(mchOrderNo)
+                    .mchNo(body.getString("mch_order_no"))
+                    .orderId(body.getString("attach"))
+                    .dateTime(LocalDateTime.now())
                     .enabled(true)
-                    .build();*/
-        }
+                    .build());
 
+            orderInfoService.toCompleted(Long.parseLong(body.getString("mch_order_no")));
+            result.put("result", "SUCCESS");
+            result.put("msg", "OK");
+            return result;
+        }
 
         // 注意:必须按这个结构返回
-        Map<String, String> result = new HashMap<>();
-        result.put("result", "SUCCESS");
+        result.put("result", "FAIL");
         result.put("msg", "OK");
         return result;
     }
+
+    /**
+     * 订单支付
+     *
+     * @param orderId
+     */
+    @GetMapping(value = "/payOrder")
+    public void payOrder(@RequestParam Long orderId) {
+        OrderInfo orderInfo = orderInfoRepo.findById(orderId).orElseThrow(new BusinessException("无订单"));
+        switch (orderInfo.getPayMethod()) {
+            case CASH_DELIVERY:
+                orderInfoService.toCompleted(orderId);
+            case ALI_PAY:
+            case WE_CHAT:
+                consumptionService.appPay(orderInfo);
+                break;
+            case CREDIT_CARD:
+                consumptionService.cardPay(orderInfo);
+                break;
+        }
+
+    }
 }

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

@@ -21,7 +21,7 @@ import java.util.List;
 @AllArgsConstructor
 public class VerifiedController extends BaseController {
     private VerifiedService verifiedService;
-    private VerifiedRepo verifiedRepo;
+    private VerifiedRepo    verifiedRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -38,7 +38,7 @@ public class VerifiedController extends BaseController {
         if (ObjectUtil.isNotNull(verified)) {
             throw new BusinessException("此用户实名信息已存在");
         }
-
+        record.setCanEdit(true);
         return verifiedRepo.save(record);
     }
 

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

@@ -0,0 +1 @@
+{"tableName":"FeeRecord","className":"FeeRecord","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":"mchNo","modelName":"mchNo","remark":"商家订单号","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"totalFee","modelName":"totalFee","remark":"总金额","showInList":true,"showInForm":true,"formType":"number"},{"name":"channel","modelName":"channel","remark":"支付方式","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"feeType","modelName":"feeType","remark":"币种","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"isRefund","modelName":"isRefund","remark":"是否退款","showInList":true,"showInForm":true,"formType":"switch"},{"name":"isPay","modelName":"isPay","remark":"支付订单","showInList":true,"showInForm":true,"formType":"switch"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.dingdong","tablePackage":"com.izouma.dingdong.domain.FeeRecord"}

+ 53 - 0
src/main/vue/src/components/EmilButton.vue

@@ -0,0 +1,53 @@
+<template>
+    <el-button @click="showDislog=true"
+               type="danger">发送邮件
+    </el-button>
+
+
+</template>
+<script>
+
+    export default {
+        data() {
+            return {
+                formData: {
+                    receiveUserId: this.$route.query.id
+                },
+                showDislog:false
+            }
+        },
+        mounted() {
+
+        },
+        methods: {
+            onSave() {
+                this.$refs.form.validate((valid) => {
+                    if (valid) {
+                        this.submit();
+                    } else {
+                        return false;
+                    }
+                });
+            },
+            submit() {
+                let data = {...this.formData};
+
+                this.saving = true;
+                this.$http
+                    .post('/rider/save', data, {body: 'json'})
+                    .then(res => {
+                        this.saving = false;
+                        this.$message.success('成功');
+                        this.$router.go(-1);
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.saving = false;
+                        this.$message.error(e.error);
+                    });
+            },
+        }
+    }
+</script>
+<style lang="less" scoped>
+</style>

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

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

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

@@ -478,6 +478,22 @@ const router = new Router({
                     meta: {
                        title: '商家投诉表',
                     },
+               },
+                {
+                    path: '/feeRecordEdit',
+                    name: 'FeeRecordEdit',
+                    component: () => import(/* webpackChunkName: "feeRecordEdit" */ '@/views/FeeRecordEdit.vue'),
+                    meta: {
+                       title: '线上金额流水编辑',
+                    },
+                },
+                {
+                    path: '/feeRecordList',
+                    name: 'FeeRecordList',
+                    component: () => import(/* webpackChunkName: "feeRecordList" */ '@/views/FeeRecordList.vue'),
+                    meta: {
+                       title: '线上金额流水',
+                    },
                }
                 /**INSERT_LOCATION**/,
                 {

+ 103 - 0
src/main/vue/src/views/FeeRecordEdit.vue

@@ -0,0 +1,103 @@
+<template>
+    <div class="edit-view">
+        <el-form :model="formData" :rules="rules" ref="form" label-width="94px" label-position="right" size="small"
+                 style="max-width: 500px;">
+                <el-form-item prop="mchNo" label="商家订单号">
+                            <el-input v-model="formData.mchNo"></el-input>
+                </el-form-item>
+                <el-form-item prop="totalFee" label="总金额">
+                            <el-input-number type="number" v-model="formData.totalFee"></el-input-number>
+                </el-form-item>
+                <el-form-item prop="channel" label="支付方式">
+                            <el-input v-model="formData.channel"></el-input>
+                </el-form-item>
+                <el-form-item prop="feeType" label="币种">
+                            <el-input v-model="formData.feeType"></el-input>
+                </el-form-item>
+                <el-form-item prop="isRefund" label="是否退款">
+                            <el-switch v-model="formData.isRefund"></el-switch>
+                </el-form-item>
+                <el-form-item prop="isPay" label="支付订单">
+                            <el-switch v-model="formData.isPay"></el-switch>
+                </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving"
+                           type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving"
+                           type="danger" v-if="formData.id">删除
+                </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+    export default {
+        name: 'FeeRecordEdit',
+        created() {
+            if (this.$route.query.id) {
+                this.$http
+                    .get('feeRecord/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('/feeRecord/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(`/feeRecord/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>

+ 185 - 0
src/main/vue/src/views/FeeRecordList.vue

@@ -0,0 +1,185 @@
+<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="mchNo" label="商家订单号"
+            >
+            </el-table-column>
+            <el-table-column prop="totalFee" label="总金额"
+            >
+            </el-table-column>
+            <el-table-column prop="channel" label="支付方式"
+            >
+            </el-table-column>
+            <el-table-column prop="feeType" label="币种"
+            >
+            </el-table-column>
+            <el-table-column prop="dateTime" label="支付时间"
+            >
+            </el-table-column>
+            <el-table-column prop="isRefund" label="是否退款"
+            >
+                <template slot-scope="{row}">
+                    <el-tag :type="row.isRefund?'':'info'">{{row.isRefund}}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="isPay" label="支付订单"
+            >
+                <template slot-scope="{row}">
+                    <el-tag :type="row.isPay?'':'info'">{{row.isPay}}</el-tag>
+                </template>
+            </el-table-column>
+            <!--            <el-table-column
+                                label="操作"
+                                align="center"
+                                fixed="right"
+                                min-width="150">
+                            <template slot-scope="{row}">
+                                <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                                <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                            </template>
+                        </el-table-column>-->
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination background @size-change="onSizeChange"
+                           @current-change="onCurrentChange" :current-page="page"
+                           :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize"
+                           layout="total, sizes, prev, pager, next, jumper"
+                           :total="totalElements">
+            </el-pagination>
+        </div>
+
+    </div>
+</template>
+<script>
+    import {mapState} from "vuex";
+    import pageableTable from "@/mixins/pageableTable";
+
+    export default {
+        name: 'FeeRecordList',
+        mixins: [pageableTable],
+        created() {
+            this.getData();
+        },
+        data() {
+            return {
+                multipleMode: false,
+                search: "",
+                url: "/feeRecord/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: "/feeRecordEdit",
+                    query: {
+                        ...this.$route.query
+                    }
+                });
+            },
+            editRow(row) {
+                this.$router.push({
+                    path: "/feeRecordEdit",
+                    query: {
+                        id: row.id
+                    }
+                });
+            },
+            download() {
+                this.downloading = true;
+                this.$axios
+                    .get("/feeRecord/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(`/feeRecord/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>

+ 17 - 18
src/main/vue/src/views/backstage/EmailEdit.vue

@@ -2,21 +2,22 @@
     <div class="edit-view">
         <el-form :model="formData" :rules="rules" ref="form" label-width="66px" label-position="right" size="small"
                  style="max-width: 500px;">
-                <el-form-item prop="sendUserId" label="发件人">
-                            <el-input-number type="number" v-model="formData.sendUserId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="receiveUserId" label="收件人">
-                            <el-input-number type="number" v-model="formData.receiveUserId"></el-input-number>
-                </el-form-item>
-                <el-form-item prop="title" label="标题">
-                            <el-input v-model="formData.title"></el-input>
-                </el-form-item>
-                <el-form-item prop="content" label="内容">
-                            <el-input v-model="formData.content"></el-input>
-                </el-form-item>
+            <el-form-item prop="sendUserId" label="发件人">
+                <el-input v-model="formData.sendUserId"></el-input>
+            </el-form-item>
+            <el-form-item prop="receiveUserId" label="收件人">
+                <el-input v-model="formData.receiveUserId"></el-input>
+            </el-form-item>
+            <el-form-item prop="title" label="标题">
+                <el-input v-model="formData.title"></el-input>
+            </el-form-item>
+            <el-form-item prop="content" label="内容">
+                <el-input type="textarea" v-model="formData.content"></el-input>
+            </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>
@@ -31,7 +32,7 @@
         created() {
             if (this.$route.query.id) {
                 this.$http
-                    .get('email/get/'+this.$route.query.id)
+                    .get('email/get/' + this.$route.query.id)
                     .then(res => {
                         this.formData = res;
                     })
@@ -44,10 +45,8 @@
         data() {
             return {
                 saving: false,
-                formData: {
-                },
-                rules: {
-                },
+                formData: {},
+                rules: {},
             }
         },
         methods: {

+ 4 - 1
src/main/vue/src/views/merchant/MerchantEdit.vue

@@ -116,9 +116,12 @@
             <el-form-item prop="aliAccount" label="支付宝账户">
                 <el-input v-model="formData.aliAccount"></el-input>
             </el-form-item>-->
-            <el-form-item prop="promo" label="推广语">
+            <el-form-item prop="promo" label="推广语" v-if="formData.status==='SUCCESS'">
                 <el-input v-model="formData.promo"></el-input>
             </el-form-item>
+            <el-form-item prop="failure" label="失败原因"  v-if="formData.status==='DENY'">
+                <el-input type="textarea" v-model="formData.failure" readonly></el-input>
+            </el-form-item>
             <el-form-item prop="priority" label="优先级">
                 <el-input-number v-model="formData.priority" :max="5" :min="1"
                 ></el-input-number>

+ 6 - 6
src/main/vue/src/views/merchant/MerchantList.vue

@@ -180,9 +180,9 @@
                 <div class="info-item">电话:{{formData.phone}}</div>
                 <div class="info-item">简介:{{formData.introduction}}</div>
                 <div class="info-item">图片: {{formData.img}}
-                    <!--<el-image style="width: 60px; height: 30px"
-                              :src="picList(formData.img)" fit="cover"
-                              :preview-src-list="picList(formData.img)"/>-->
+                    <el-image style="width: 30px; height: 30px"
+                              :src="picList(formData.img)[0]" fit="fit"
+                              :preview-src-list="picList(formData.img)?picList(formData.img):[]"/>
                 </div>
                 <div class="info-item">地址:{{formData.address}}</div>
                 <div class="info-item">成立时间:{{formData.establishTime}}</div>
@@ -247,7 +247,7 @@
                 formData: {
                     // category: []
                 },
-                showSetLogistics: false,
+                //showSetLogistics: false,
                 dateRange: [],
                 verified: {},
 
@@ -458,7 +458,7 @@
                     .then(res => {
                         // console.log(res);
                         if (res.value) {
-                            this.$alert('确定通过?', '提示', {
+                            this.$alert('此操作不可撤回,确定?', '提示', {
                                 showCancelButton: true
                             })
                                 .then(() => {
@@ -471,7 +471,7 @@
                                 })
                                 .then(res => {
                                     this.$message.success('成功');
-                                    this.$router.go(-1);
+                                    this.$router.go(0);
                                 })
                                 .catch(() => {
                                     this.$message.error(res.error || '失败');

+ 23 - 10
src/main/vue/src/views/rider/RiderEdit.vue

@@ -3,22 +3,26 @@
         <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-input v-model="formData.userId"></el-input>
             </el-form-item>
             <el-form-item prop="jobNumber" label="工号">
-                <el-input-number type="number" v-model="formData.jobNumber"></el-input-number>
+                <el-input v-model="formData.jobNumber"></el-input>
             </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 prop="transportation" label="交通工具">
+                <el-input v-model="formData.transportation"></el-input>
             </el-form-item>
-            <el-form-item prop="licensePlateImg" label="车牌照片">
-                <el-input v-model="formData.licensePlateImg"></el-input>
+            <el-form-item prop="transportationImg" label="交通工具图片">
+                <el-image style="width: 100px; height: 100px"
+                          :src="formData.transportationImg" fit="cover"
+                          :preview-src-list="[formData.transportationImg]"></el-image>
             </el-form-item>
             <el-form-item prop="driverLicenseImg" label="驾照照片">
-                <el-input v-model="formData.driverLicenseImg"></el-input>
+                <el-image style="width: 100px; height: 100px"
+                          :src="formData.driverLicenseImg" fit="cover"
+                          :preview-src-list="[formData.driverLicenseImg]"></el-image>
             </el-form-item>
             <!--               <el-form-item prop="money" label="货币">
                                         <el-input-number type="number" v-model="formData.user.money"></el-input-number>
@@ -38,9 +42,9 @@
             <!--            <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 prop="blacklist" label="黑名单">
+                            <el-switch v-model="formData.blacklist"></el-switch>
+                        </el-form-item>-->
 
             <el-form-item>
                 <el-button @click="onSave" :loading="saving"
@@ -51,9 +55,12 @@
                 </el-button>
 
                 <black-button></black-button>
+
+                <emil-button></emil-button>
                 <el-button @click="$router.go(-1)">取消</el-button>
             </el-form-item>
         </el-form>
+
     </div>
 </template>
 <script>
@@ -120,6 +127,12 @@
                     }
                 })
             },
+            addEmil(row) {
+                this.$router.push({
+                    path: "/emailEdit",
+                    query: {}
+                });
+            },
         }
     }
 </script>

+ 5 - 10
src/main/vue/src/views/rider/RiderList.vue

@@ -51,22 +51,17 @@
             <!--                    <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 prop="transportation" label="交通工具">
             </el-table-column>
-            <el-table-column prop="licensePlateImg" label="车牌照片"
+            <el-table-column prop="transportationImg" label="交通工具图片"
             >
                 <template slot-scope="{row}">
                     <el-image style="width: 30px; height: 30px"
-                              :src="row.licensePlateImg" fit="cover"
-                              :preview-src-list="[row.licensePlateImg]"></el-image>
+                              :src="row.transportationImg" fit="cover"
+                              :preview-src-list="[row.transportationImg]"></el-image>
                 </template>
             </el-table-column>
+
             <el-table-column prop="driverLicenseImg" label="驾照照片"
             >
                 <template slot-scope="{row}">

+ 13 - 7
src/test/java/com/izouma/dingdong/contorller/VerifiedControllerTest.java

@@ -16,16 +16,22 @@ public class VerifiedControllerTest {
     private VerifiedController verifiedController;
 
     @Test
-    public void test(){
+    public void test() {
         Verified build = Verified.builder()
-                .userId(44L)
+//                .userId(44L)
                 .realName("张三")
-                .idNo("111111")
-                .idNoImg("https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg,https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg")
-                .handheldIdNo("https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg")
-                .canEdit(false)
-                .build();
+//                .idNo("111111")
+//                .idNoImg("https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg,https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg")
+//                .handheldIdNo("https://idingdong.oss-cn-hangzhou.aliyuncs.com/image/2020-05-27-11-19-02VdOmcIju.jpg")
+//                .canEdit(false)
 
+                .build();
+        build.setId(2107L);
         System.out.println(verifiedController.save(build));
     }
+
+    @Test
+    public void testMy(){
+        System.out.println(verifiedController.my(2105L));
+    }
 }