Browse Source

批发下单

zoujiajian 2 years ago
parent
commit
ae62be76fa
16 changed files with 654 additions and 14 deletions
  1. 5 0
      netflix-common/src/main/java/com/cyksj/common/constant/Constant.java
  2. 17 0
      netflix-dao/src/main/java/com/cyksj/mapper/GoodsWholesaleUserReturnRecordMapper.java
  3. 43 1
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleOrderDon.java
  4. 13 1
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleUserDeposit.java
  5. 33 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleUserReturnRecord.java
  6. 2 1
      netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java
  7. 2 0
      netflix-dao/src/main/java/com/cyksj/model/request/AlipayOrderDonReq.java
  8. 13 0
      netflix-dao/src/main/resources/mapper/GoodsWholesaleUserReturnRecordMapper.xml
  9. 4 0
      netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java
  10. 1 2
      netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsWholesaleServiceImpl.java
  11. 17 0
      netflix-service/src/main/java/com/cyksj/service/order/GoodsWholesalePayService.java
  12. 302 7
      netflix-service/src/main/java/com/cyksj/service/order/impl/GoodsWholesalePayServiceImpl.java
  13. 5 0
      netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java
  14. 85 0
      netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java
  15. 0 2
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  16. 112 0
      netflix-web/src/main/java/com/cyksj/web/controller/wholesale/GoodsWholesaleWebController.java

+ 5 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -383,4 +383,9 @@ public interface Constant {
 	Long SPECIAL_DISTRIBUTE_USER_ID = 469739l;
 	Long SPECIAL_DISTRIBUTE_USER_ID = 469739l;
 
 
 	Long LUMA_GOODS_ID = 87l;
 	Long LUMA_GOODS_ID = 87l;
+
+	/**
+	 * 批发押金配置key
+	 */
+	String WHOLESALE_DEPOSIT_KEY = "wholesale_deposit_key";
 }
 }

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsWholesaleUserReturnRecordMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GoodsWholesaleUserReturnRecord;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsWholesaleUserReturnRecordMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/8/28 11:40
+ */
+public interface GoodsWholesaleUserReturnRecordMapper extends BaseMapper<GoodsWholesaleUserReturnRecord> {
+	GoodsWholesaleUserReturnRecord selectGoodsWholeReturnBalanceRecordByUserId(@Param("list") List<Long> userIdList);
+}

+ 43 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleOrderDon.java

@@ -1,9 +1,11 @@
 package com.cyksj.model.entity;
 package com.cyksj.model.entity;
 
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.Setter;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Date;
 
 
 /**
 /**
@@ -19,11 +21,16 @@ public class GoodsWholesaleOrderDon extends BaseEntity{
 
 
 	private String orderNo;
 	private String orderNo;
 
 
+	/**
+	 * 批发id
+	 */
+	private Long pid;
+
 	private Long goodsId;
 	private Long goodsId;
 
 
 	private Long skuId;
 	private Long skuId;
 
 
-	private Integer type;
+	private Type type;
 
 
 	private BigDecimal money;
 	private BigDecimal money;
 
 
@@ -37,6 +44,20 @@ public class GoodsWholesaleOrderDon extends BaseEntity{
 
 
 	private Date payTime;
 	private Date payTime;
 
 
+	private String shopId;
+
+	/**
+	 * 是否网页支付
+	 */
+	private Boolean isWebPay;
+
+	private String transactionId;
+
+	/**
+	 * 买家id
+	 */
+	private String buyerId;
+
 	public enum Status {
 	public enum Status {
 		/**
 		/**
 		 * 订单状态
 		 * 订单状态
@@ -58,4 +79,25 @@ public class GoodsWholesaleOrderDon extends BaseEntity{
 			return desc;
 			return desc;
 		}
 		}
 	}
 	}
+
+	@Getter
+	@AllArgsConstructor
+	public enum Type{
+		WeChat("wechat","微信"),
+		ALI_PAY("zfb","支付宝"),
+		EX_CODE("exchange_code","兑换码"),
+		LOTTERY("lottery","抽奖"),
+		EQUIPMENT("equipment", "实物设备分销"),
+		PAY_EQUIPMENT("pay_equipment", "自购设备"),
+		BALANCE("balance", "余额支付"),
+		PAYPAL("paypal","paypal支付"),
+		STRIPE("stripe","stripe支付")
+		;
+		String type;
+		String desc;
+
+		public static GoodsWholesaleOrderDon.Type getType(String type) {
+			return Arrays.stream(GoodsWholesaleOrderDon.Type.values()).filter(tp -> tp.getType().equals(type)).findFirst().orElse(ALI_PAY);
+		}
+	}
 }
 }

+ 13 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleUserDeposit.java

@@ -9,6 +9,7 @@ import lombok.Setter;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Arrays;
+import java.util.Date;
 
 
 /**
 /**
  * 项目名: yhlxj
  * 项目名: yhlxj
@@ -27,7 +28,7 @@ public class GoodsWholesaleUserDeposit extends BaseEntity{
 	private Type type;
 	private Type type;
 
 
 	/**
 	/**
-	 * 抵押状态
+	 * 支付状态
 	 */
 	 */
 	private Status status;
 	private Status status;
 
 
@@ -54,6 +55,17 @@ public class GoodsWholesaleUserDeposit extends BaseEntity{
 
 
 	private String transactionId;
 	private String transactionId;
 
 
+	private Boolean isWebPay;
+
+	/**
+	 * 批发数达标
+	 */
+	private Boolean isGoal;
+
+	private Date payTime;
+
+	private String buyerId;
+
 	public enum Status {
 	public enum Status {
 		/**
 		/**
 		 * 订单状态
 		 * 订单状态

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsWholesaleUserReturnRecord.java

@@ -0,0 +1,33 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: GoodsWholesaleUserReturnRecord
+ * 创建者: JavaZou
+ * 创建时间:2024/8/28 11:36
+ */
+@Getter
+@Setter
+public class GoodsWholesaleUserReturnRecord extends BaseEntity{
+
+	private Long goodsId;
+
+	private Long skuId;
+
+	private Long userId;
+
+	/**
+	 * 批发数目
+	 */
+	private Integer num;
+
+	/**
+	 * 返差价余额
+	 */
+	private BigDecimal returnBalance;
+}

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/entity/UserBalanceSourceRecord.java

@@ -34,7 +34,8 @@ public class UserBalanceSourceRecord extends BaseEntity{
 		rd_comment("实物评论"),
 		rd_comment("实物评论"),
 		price_differ("订单补差价"),
 		price_differ("订单补差价"),
 		compensate("系统补偿"),
 		compensate("系统补偿"),
-		manual("手动扣除")
+		manual("手动扣除"),
+		wholesale_differ("返批发差价")
 		;
 		;
 		String desc;
 		String desc;
 
 

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/request/AlipayOrderDonReq.java

@@ -30,4 +30,6 @@ public class AlipayOrderDonReq {
 	private String payMode;
 	private String payMode;
 
 
 	private String returnUrl;
 	private String returnUrl;
+
+	private Boolean isDeposit = false;
 }
 }

+ 13 - 0
netflix-dao/src/main/resources/mapper/GoodsWholesaleUserReturnRecordMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.cyksj.mapper.GoodsWholesaleUserReturnRecordMapper">
+
+    <select id="selectGoodsWholeReturnBalanceRecordByUserId"
+            resultType="com.cyksj.model.entity.GoodsWholesaleUserReturnRecord">
+        select * from goods_wholesale_user_return_record where user_id in
+        <foreach collection="list" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+        order by num desc limit 1
+    </select>
+</mapper>

+ 4 - 0
netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java

@@ -48,6 +48,10 @@ public class BaseZfbConfig {
 
 
 	public static String zfb_register_notify_url = "applets/register/prepay/zfb/notify";
 	public static String zfb_register_notify_url = "applets/register/prepay/zfb/notify";
 
 
+	public static String wholesaleNotifyUrl = "applet/wholesale/zfb/notify";
+
+	public static String wholesaleDepositNotifyUrl = "applet/wholesale/deposit/zfb/notify";
+
 	/**
 	/**
 	 * qr_pay_mode PC扫码支付的方式。 跳转模式
 	 * qr_pay_mode PC扫码支付的方式。 跳转模式
 	 */
 	 */

+ 1 - 2
netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsWholesaleServiceImpl.java

@@ -57,7 +57,7 @@ public class GoodsWholesaleServiceImpl extends ServiceImpl<GoodsWholesaleMapper,
 		if (goodsWholesaleUserDeposit == null) {
 		if (goodsWholesaleUserDeposit == null) {
 			throw BusinessRuntimeException.getInstance("记录不存在");
 			throw BusinessRuntimeException.getInstance("记录不存在");
 		}
 		}
-		if (!goodsWholesaleUserDeposit.getStatus()) {
+		if (goodsWholesaleUserDeposit.getStatus() == GoodsWholesaleUserDeposit.Status.refund) {
 			throw BusinessRuntimeException.getInstance("押金已退");
 			throw BusinessRuntimeException.getInstance("押金已退");
 		}
 		}
 
 
@@ -150,7 +150,6 @@ public class GoodsWholesaleServiceImpl extends ServiceImpl<GoodsWholesaleMapper,
 		String config = wholesale.getConfig();
 		String config = wholesale.getConfig();
 		List<GoodsWholesale.GoodsWholesaleConfig> configs = Jsons.parseList(config, GoodsWholesale.GoodsWholesaleConfig.class);
 		List<GoodsWholesale.GoodsWholesaleConfig> configs = Jsons.parseList(config, GoodsWholesale.GoodsWholesaleConfig.class);
 		String wholesaleConfig = Jsons.toJson(configs);
 		String wholesaleConfig = Jsons.toJson(configs);
-
 		wholesale.setConfig(wholesaleConfig);
 		wholesale.setConfig(wholesaleConfig);
 		this.saveOrUpdate(wholesale);
 		this.saveOrUpdate(wholesale);
 	}
 	}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/order/GoodsWholesalePayService.java

@@ -1,8 +1,13 @@
 package com.cyksj.service.order;
 package com.cyksj.service.order;
 
 
+import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.entity.GoodsWholesaleOrderDon;
 import com.cyksj.model.entity.GoodsWholesaleOrderDon;
+import com.cyksj.model.entity.GoodsWholesaleUserDeposit;
+import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
 
 
+import java.util.Map;
+
 /**
 /**
  * 项目名: yhlxj
  * 项目名: yhlxj
  * 文件名: GoodsWholesalePayService
  * 文件名: GoodsWholesalePayService
@@ -11,4 +16,16 @@ import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
  */
  */
 public interface GoodsWholesalePayService {
 public interface GoodsWholesalePayService {
 	GoodsWholesaleOrderDon unifiedPay(GoodsWholesaleOrderPayReq payReq);
 	GoodsWholesaleOrderDon unifiedPay(GoodsWholesaleOrderPayReq payReq);
+
+	AliPayParams aliPayWholesale(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
+
+	AliPayParams zfbWholesaleWebQrCode(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
+
+	void aliPayWholesaleNotify(Map<String, String> params) throws Exception;
+
+	GoodsWholesaleUserDeposit submitDeposit(Long userId) throws Exception;
+
+	void aliPayWholesaleDepositNotify(Map<String, String> params) throws Exception;
+
+	void closeWholesaleOrder(Long orderId, long userId);
 }
 }

+ 302 - 7
netflix-service/src/main/java/com/cyksj/service/order/impl/GoodsWholesalePayServiceImpl.java

@@ -1,24 +1,43 @@
 package com.cyksj.service.order.impl;
 package com.cyksj.service.order.impl;
 
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import com.alipay.api.internal.util.AlipaySignature;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.snowflake.Sequence;
-import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.mapper.GoodsWholesaleMapper;
-import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
-import com.cyksj.model.entity.GoodsDonSku;
-import com.cyksj.model.entity.GoodsWholesale;
-import com.cyksj.model.entity.GoodsWholesaleOrderDon;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.mapper.*;
+import com.cyksj.mapper.channel.ShopConfigMapper;
+import com.cyksj.mapper.sys.SysConfigMapper;
+import com.cyksj.model.dto.AliPayParams;
+import com.cyksj.model.dto.GoodsWholesaleUserDepositDto;
+import com.cyksj.model.entity.*;
+import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
+import com.cyksj.model.request.OrderAttach;
 import com.cyksj.service.order.GoodsWholesalePayService;
 import com.cyksj.service.order.GoodsWholesalePayService;
+import com.cyksj.service.order.OrderRefundService;
+import com.cyksj.service.pay.AliPayCommonService;
+import com.cyksj.service.user.UserBenefitsService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserBindRelationService;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * 项目名: yhlxj
  * 项目名: yhlxj
@@ -40,6 +59,20 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 
 
 	private static final Sequence SEQUENCE = new Sequence(0);
 	private static final Sequence SEQUENCE = new Sequence(0);
 
 
+	private final AliPayCommonService aliPayCommonService;
+
+	private final ShopConfigMapper shopConfigMapper;
+
+	private final GoodsWholesaleUserReturnRecordMapper goodsWholesaleUserReturnRecordMapper;
+
+	private final SysConfigMapper sysConfigMapper;
+
+	private final GoodsWholesaleUserDepositMapper depositMapper;
+
+	private final OrderRefundService orderRefundService;
+
+	private UserBenefitsService userBenefitsService;
+
 	@Override
 	@Override
 	public GoodsWholesaleOrderDon unifiedPay(GoodsWholesaleOrderPayReq payReq) {
 	public GoodsWholesaleOrderDon unifiedPay(GoodsWholesaleOrderPayReq payReq) {
 		Long userId = payReq.getUserId();
 		Long userId = payReq.getUserId();
@@ -70,17 +103,279 @@ public class GoodsWholesalePayServiceImpl implements GoodsWholesalePayService {
 			throw BusinessRuntimeException.getInstance("规格已下架");
 			throw BusinessRuntimeException.getInstance("规格已下架");
 		}
 		}
 		//是否交过押金
 		//是否交过押金
-		if (false) {
+		GoodsWholesaleUserDeposit deposit = depositMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleUserDeposit.class)
+				.in(GoodsWholesaleUserDeposit::getUserId, userIdList)
+				.last("limit 1"));
+		//未支付押金 或批发数量未达到且已退款 使用规格单价
+		if (deposit == null || (!deposit.getIsGoal() && deposit.getStatus() == GoodsWholesaleUserDeposit.Status.refund)) {
 			singlePrice = sku.getPrice();
 			singlePrice = sku.getPrice();
 		}
 		}
 		GoodsWholesaleOrderDon orderDon = new GoodsWholesaleOrderDon();
 		GoodsWholesaleOrderDon orderDon = new GoodsWholesaleOrderDon();
 		orderDon.setUserId(userId);
 		orderDon.setUserId(userId);
 		orderDon.setGoodsId(goodsWholesale.getGoodsId());
 		orderDon.setGoodsId(goodsWholesale.getGoodsId());
 		orderDon.setSkuId(goodsWholesale.getSkuId());
 		orderDon.setSkuId(goodsWholesale.getSkuId());
+		//批发id
+		orderDon.setPid(id);
 		orderDon.setMoney(BigDecimal.valueOf(payReq.getNum()).multiply(singlePrice));
 		orderDon.setMoney(BigDecimal.valueOf(payReq.getNum()).multiply(singlePrice));
 		String orderNo = SEQUENCE.nextId().toString();
 		String orderNo = SEQUENCE.nextId().toString();
 		orderDon.setOrderNo(orderNo);
 		orderDon.setOrderNo(orderNo);
 		goodsWholesaleOrderDonMapper.insert(orderDon);
 		goodsWholesaleOrderDonMapper.insert(orderDon);
 		return orderDon;
 		return orderDon;
 	}
 	}
+
+	@Override
+	public AliPayParams aliPayWholesale(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
+		if (!re.getIsDeposit()) {
+			return aliPayCommonService.aliPayUnifiedWholesaleDeposit(re, productCode, qrPayMode);
+		}
+		return aliPayCommonService.aliPayUnifiedWholesale(re, productCode, qrPayMode);
+	}
+
+	@Override
+	public AliPayParams zfbWholesaleWebQrCode(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception {
+		return aliPayCommonService.aliPayUnifiedWholesale(re, productCode, qrPayMode);
+
+	}
+
+	@Override
+	public void aliPayWholesaleNotify(Map<String, String> params) throws Exception {
+		//调用SDK验证签名
+		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
+		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
+		Long oderId = orderAttach.getO();
+		GoodsWholesaleOrderDon orderDon = goodsWholesaleOrderDonMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		String appId = params.get("app_id");
+		boolean signVerified = AlipaySignature.rsaCheckV1(params, shopConfigMapper.getByAppId(appId).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		if (!signVerified) {
+			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
+			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = Optional.ofNullable(params.get("buyer_id")).orElse(params.get("buyer_open_id"));
+		log.info("批发支付宝回调信息:{}", Jsons.toJson(params));
+		if (!orderDon.getStatus().equals(UpgradeOrderDon.Status.noPayment) && !orderDon.getStatus().equals(UpgradeOrderDon.Status.close)) {
+			log.info("批发支付宝已回调,重复修改状态 id:{}", orderDon.getId());
+			return;
+		}
+		Date payTime = DateTime.now();
+		if (StringUtils.isNotBlank(payTimeStr)) {
+			payTime = DateUtil.parse(payTimeStr, "yyyy-MM-dd HH:mm:ss");
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setPayTime(payTime);
+		orderDon.setShopId(appId);
+		orderDon.setType(GoodsWholesaleOrderDon.Type.ALI_PAY);
+		orderDon.setBuyerId(buyerId);
+		goodsWholesaleOrderDonMapper.updateById(orderDon);
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(orderDon.getUserId(), null);
+		//退还押金
+		returnDeposit(orderDon, userIdList);
+		//返批发余额差价
+		returnWholesaleBalanceDiffer(orderDon, userIdList);
+	}
+
+	private void returnWholesaleBalanceDiffer(GoodsWholesaleOrderDon orderDon, List<Long> userIdList) throws Exception {
+		//批发补差价
+		Long skuId = orderDon.getSkuId();
+		GoodsWholesale goodsWholesale = goodsWholesaleMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesale.class)
+				.eq(GoodsWholesale::getSkuId, skuId)
+				.eq(GoodsWholesale::getDeleted, 1)
+				.last("limit 1"));
+		if (goodsWholesale != null && goodsWholesale.getIsReturn()) {
+			//目前购买多少个
+			Integer payNum = goodsWholesaleOrderDonMapper.getUserWholesaleNumByUserIds(userIdList);
+			log.info("目前用户userId:{}购买批发数量:{}", orderDon.getUserId(), payNum);
+			List<GoodsWholesale.GoodsWholesaleConfig> configs = Jsons.parseList(goodsWholesale.getConfig(), GoodsWholesale.GoodsWholesaleConfig.class);
+			GoodsWholesale.GoodsWholesaleConfig firstConfig = configs.get(0);
+			GoodsWholesale.GoodsWholesaleConfig endConfig = configs.get(configs.size() - 1);
+			//移除第一档
+			configs.remove(firstConfig);
+			//移除倒数第一档
+			configs.remove(endConfig);
+			//未超过第一档
+			if (payNum <= firstConfig.getEnd()) {
+				return;
+			}
+			GoodsWholesaleUserReturnRecord goodsWholesaleUserReturnRecord = goodsWholesaleUserReturnRecordMapper.selectGoodsWholeReturnBalanceRecordByUserId(userIdList);
+			//直接买到最高
+			Integer priceDifferNum = null;
+			BigDecimal differPrice = null;
+			if (payNum > endConfig.getEnd()) {
+				//将之前的全部返还余额差价
+				priceDifferNum = endConfig.getStart() - 1;
+				if (goodsWholesaleUserReturnRecord != null) {
+					//减去之前返差价的数目
+					priceDifferNum = priceDifferNum - goodsWholesaleUserReturnRecord.getNum();
+				}
+				differPrice = endConfig.getSingle().subtract(firstConfig.getSingle());
+			}
+			if (goodsWholesaleUserReturnRecord != null) {
+				//寻找符合条件的目前挡位的配置
+				Optional<GoodsWholesale.GoodsWholesaleConfig> first = configs.stream().filter(config -> config.getStart() < goodsWholesaleUserReturnRecord.getNum() && config.getEnd() > goodsWholesaleUserReturnRecord.getNum()).collect(Collectors.toList()).stream().findFirst();
+				if (first.isPresent()) {
+					GoodsWholesale.GoodsWholesaleConfig thisLevel = first.get();
+					log.info("目前批发挡位设置是start:{} ======> end:{}", thisLevel.getStart(), thisLevel.getEnd());
+					priceDifferNum = thisLevel.getStart() - 1;
+					if (goodsWholesaleUserReturnRecord != null) {
+						priceDifferNum = priceDifferNum - goodsWholesaleUserReturnRecord.getNum();
+					}
+					differPrice = thisLevel.getSingle().subtract(firstConfig.getSingle());
+				}
+			}
+			if (priceDifferNum != null && differPrice != null) {
+				BigDecimal returnBalance = differPrice.multiply(BigDecimal.valueOf(priceDifferNum));
+				log.info("返用户userId:{}批发余额:{}分", orderDon.getUserId(), returnBalance);
+				//记录返差价数量
+				GoodsWholesaleUserReturnRecord wholesaleUserReturnRecord = Optional.ofNullable(goodsWholesaleUserReturnRecord).orElseGet(() -> {
+					GoodsWholesaleUserReturnRecord newRecord = new GoodsWholesaleUserReturnRecord();
+					newRecord.setNum(0);
+					newRecord.setGoodsId(orderDon.getGoodsId());
+					newRecord.setSkuId(orderDon.getSkuId());
+					newRecord.setReturnBalance(BigDecimal.ZERO);
+					newRecord.setUserId(orderDon.getUserId());
+					return newRecord;
+				});
+				wholesaleUserReturnRecord.setNum(wholesaleUserReturnRecord.getNum() + priceDifferNum);
+				wholesaleUserReturnRecord.setReturnBalance(wholesaleUserReturnRecord.getReturnBalance().add(returnBalance));
+				if (wholesaleUserReturnRecord.getId() != null) {
+					goodsWholesaleUserReturnRecordMapper.updateById(wholesaleUserReturnRecord);
+				} else {
+					goodsWholesaleUserReturnRecordMapper.insert(wholesaleUserReturnRecord);
+				}
+				//返余额差价
+				userBenefitsService.addUserBalance(orderDon.getUserId(), returnBalance, UserBalanceSourceRecord.Source.wholesale_differ, 0l, orderDon.getId(), UserBalanceSourceRecord.Source.wholesale_differ.getDesc(), true);
+			}
+		}
+	}
+
+	@Override
+	public GoodsWholesaleUserDeposit submitDeposit(Long userId) throws Exception {
+		//是否已支付押金
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+
+		GoodsWholesaleUserDeposit deposit = depositMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleUserDeposit.class).in(GoodsWholesaleUserDeposit::getUserId, userIdList));
+		if (deposit != null && deposit.getStatus() == GoodsWholesaleUserDeposit.Status.hasPayment) {
+			throw BusinessRuntimeException.getInstance("您已支付过押金");
+		}
+
+		if (deposit == null) {
+			deposit = new GoodsWholesaleUserDeposit();
+			deposit.setUserId(userId);
+			String orderNo = SEQUENCE.nextId().toString();
+			deposit.setOrderNo(orderNo);
+			deposit.setType(GoodsWholesaleUserDeposit.Type.ALI_PAY);
+		}
+		deposit.setStatus(GoodsWholesaleUserDeposit.Status.noPayment);
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.WHOLESALE_DEPOSIT_KEY)
+				.last("limit 1"));
+		if (sysConfig == null || StrUtil.isEmpty(sysConfig.getSysValue())) {
+			throw BusinessRuntimeException.getInstance("未配置押金,请联系客服");
+		}
+		GoodsWholesaleUserDepositDto goodsWholesaleUserDepositDto = Jsons.parseObject(sysConfig.getSysValue(), GoodsWholesaleUserDepositDto.class);
+		deposit.setMoney(goodsWholesaleUserDepositDto.getDeposit());
+
+		if (deposit.getId() == null) {
+			depositMapper.insert(deposit);
+		}
+		return deposit;
+	}
+
+	@Override
+	public void aliPayWholesaleDepositNotify(Map<String, String> params) throws Exception {
+		//调用SDK验证签名
+		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
+		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
+		Long oderId = orderAttach.getO();
+		GoodsWholesaleUserDeposit orderDon = depositMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		String appId = params.get("app_id");
+		boolean signVerified = AlipaySignature.rsaCheckV1(params, shopConfigMapper.getByAppId(appId).getPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		if (!signVerified) {
+			log.error("押金支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
+			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+		//买家支付宝账号
+		String buyerId = Optional.ofNullable(params.get("buyer_id")).orElse(params.get("buyer_open_id"));
+		log.info("押金支付宝回调信息:{}", Jsons.toJson(params));
+		if (!orderDon.getStatus().equals(UpgradeOrderDon.Status.noPayment) && !orderDon.getStatus().equals(UpgradeOrderDon.Status.close)) {
+			log.info("押金支付宝已回调,重复修改状态 id:{}", orderDon.getId());
+			return;
+		}
+		Date payTime = DateTime.now();
+		if (StringUtils.isNotBlank(payTimeStr)) {
+			payTime = DateUtil.parse(payTimeStr, "yyyy-MM-dd HH:mm:ss");
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setPayTime(payTime);
+		orderDon.setShopId(appId);
+		orderDon.setType(GoodsWholesaleUserDeposit.Type.ALI_PAY);
+		orderDon.setBuyerId(buyerId);
+		depositMapper.updateById(orderDon);
+	}
+
+	@Override
+	public void closeWholesaleOrder(Long orderId, long userId) {
+		List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+		GoodsWholesaleOrderDon orderDon = goodsWholesaleOrderDonMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleOrderDon.class)
+				.eq(GoodsWholesaleOrderDon::getId, orderId)
+				.in(GoodsWholesaleOrderDon::getUserId, userIdList)
+				.last("limit 1"));
+		if (orderDon == null) {
+			return;
+		}
+		if (orderDon.getStatus() != GoodsWholesaleOrderDon.Status.noPayment) {
+			return;
+		}
+		orderDon.setStatus(GoodsWholesaleOrderDon.Status.close);
+		goodsWholesaleOrderDonMapper.updateById(orderDon);
+	}
+
+
+	/**
+	 * 退还押金
+	 */
+	public void returnDeposit(GoodsWholesaleOrderDon orderDon, List<Long> userIdList) throws Exception {
+		GoodsWholesaleUserDeposit goodsWholesaleUserDeposit = depositMapper.selectOne(Wrappers.lambdaQuery(GoodsWholesaleUserDeposit.class)
+				.in(GoodsWholesaleUserDeposit::getUserId, userIdList)
+				.eq(GoodsWholesaleUserDeposit::getStatus, GoodsWholesaleUserDeposit.Status.hasPayment)
+				.last("limit 1"));
+		if (goodsWholesaleUserDeposit != null) {
+			//是否已满足 批发足够账号
+			SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+					.eq(SysConfig::getSysKey, Constant.WHOLESALE_DEPOSIT_KEY)
+					.last("limit 1"));
+			if (sysConfig == null || StrUtil.isEmpty(sysConfig.getSysValue())) {
+				log.error("押金配置已失效");
+				return;
+			}
+			GoodsWholesaleUserDepositDto goodsWholesaleUserDepositDto = Jsons.parseObject(sysConfig.getSysValue(), GoodsWholesaleUserDepositDto.class);
+			Integer num = goodsWholesaleUserDepositDto.getNum();
+			Integer payNum = goodsWholesaleOrderDonMapper.getUserWholesaleNumByUserIds(userIdList);
+			if (payNum >= num) {
+				//腿还押金
+				try {
+					String outNo = orderRefundService.refundWholesaleUserDeposit(goodsWholesaleUserDeposit);
+					goodsWholesaleUserDeposit.setRefundOutNo(outNo);
+					goodsWholesaleUserDeposit.setStatus(GoodsWholesaleUserDeposit.Status.refund);
+					//批发数量已达
+					goodsWholesaleUserDeposit.setIsGoal(true);
+					depositMapper.updateById(goodsWholesaleUserDeposit);
+				} catch (Exception e) {
+					log.info("押金退款错误:{}", StringUtil.getErrorText(e));
+				}
+			}
+		}
+	}
 }
 }

+ 5 - 0
netflix-service/src/main/java/com/cyksj/service/pay/AliPayCommonService.java

@@ -20,5 +20,10 @@ public interface AliPayCommonService {
 	AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception;
 	AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception;
 
 
 	AliPayParams unifiedPay(AlipayOrderDonReq re, String productCode, String payMode) throws Exception;
 	AliPayParams unifiedPay(AlipayOrderDonReq re, String productCode, String payMode) throws Exception;
+
 	AliPayParams unifiedPayUpgrade(AlipayOrderDonReq re, String productCode, String payMode) throws Exception;
 	AliPayParams unifiedPayUpgrade(AlipayOrderDonReq re, String productCode, String payMode) throws Exception;
+
+	AliPayParams aliPayUnifiedWholesale(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
+
+	AliPayParams aliPayUnifiedWholesaleDeposit(AlipayOrderDonReq re, String productCode, String qrPayMode) throws Exception;
 }
 }

+ 85 - 0
netflix-service/src/main/java/com/cyksj/service/pay/impl/AliPayCommonServiceImpl.java

@@ -66,6 +66,10 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 
 
 	private final UpgradePackageMapper upgradePackageMapper;
 	private final UpgradePackageMapper upgradePackageMapper;
 
 
+	private final GoodsWholesaleOrderDonMapper goodsWholesaleOrderDonMapper;
+
+	private final GoodsWholesaleUserDepositMapper depositMapper;
+
 	@Override
 	@Override
 	public AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
 	public AliPayParams unifiedPayRegister(Long orderId, String productCode, String payMode, String returnUrl) throws Exception {
 		RegisterOrderDon orderDon = registerOrderDonMapper.selectById(orderId);
 		RegisterOrderDon orderDon = registerOrderDonMapper.selectById(orderId);
@@ -296,4 +300,85 @@ public class AliPayCommonServiceImpl implements AliPayCommonService {
 				notifyUrl,
 				notifyUrl,
 				returnUrl);
 				returnUrl);
 	}
 	}
+
+	@Override
+	public AliPayParams aliPayUnifiedWholesale(AlipayOrderDonReq re, String productCode, String payMode) throws Exception {
+		Long orderId = re.getOrderId();
+		String returnUrl = re.getReturnUrl();
+		GoodsWholesaleOrderDon orderDon = goodsWholesaleOrderDonMapper.selectById(orderId);
+		//获取支付宝默认商户
+		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
+		if (GoodsWholesaleOrderDon.Type.ALI_PAY != orderDon.getType()) {
+			orderDon.setType(GoodsWholesaleOrderDon.Type.ALI_PAY);
+		}
+		orderDon.setShopId(appId);
+		if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
+			orderDon.setIsWebPay(true);
+		}
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
+			orderDon.setIsWebPay(false);
+		}
+		goodsWholesaleOrderDonMapper.updateById(orderDon);
+		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+		String subject = goodsDon.getTitle();
+		//回调地址
+		String host = envCommonService.getHost();
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.wholesaleNotifyUrl);
+		//是否在微信内支付 微信内支付宝支付后 支付宝回调页面不跳转
+		Boolean isWx = Optional.ofNullable(re.getIsWx()).orElse(false);
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode) && !isWx) {
+			//默认跳转页
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.DEFAULT_URL);
+		}
+		return builderPayParams(orderDon.getId(),
+				orderDon.getOrderNo(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getCreatedTime(),
+				subject,
+				productCode,
+				payMode,
+				notifyUrl,
+				returnUrl);
+	}
+
+	@Override
+	public AliPayParams aliPayUnifiedWholesaleDeposit(AlipayOrderDonReq re, String productCode, String payMode) throws Exception {
+		Long orderId = re.getOrderId();
+		String returnUrl = re.getReturnUrl();
+		GoodsWholesaleUserDeposit orderDon = depositMapper.selectById(orderId);
+		//获取支付宝默认商户
+		String appId = sysConfigService.getDefaultShopConfigByType("zfb");
+		if (GoodsWholesaleUserDeposit.Type.ALI_PAY != orderDon.getType()) {
+			orderDon.setType(GoodsWholesaleUserDeposit.Type.ALI_PAY);
+		}
+		orderDon.setShopId(appId);
+		if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
+			orderDon.setIsWebPay(true);
+		}
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
+			orderDon.setIsWebPay(false);
+		}
+		depositMapper.updateById(orderDon);
+		String subject = "押金";
+		//回调地址
+		String host = envCommonService.getHost();
+		String notifyUrl = String.format("%s%s", host, BaseZfbConfig.wholesaleDepositNotifyUrl);
+		//是否在微信内支付 微信内支付宝支付后 支付宝回调页面不跳转
+		Boolean isWx = Optional.ofNullable(re.getIsWx()).orElse(false);
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode) && !isWx) {
+			//默认跳转页
+			returnUrl = String.format("%s%s", envCommonService.getDomain(), BaseZfbConfig.DEFAULT_URL);
+		}
+		return builderPayParams(orderDon.getId(),
+				orderDon.getOrderNo(),
+				orderDon.getShopId(),
+				orderDon.getMoney(),
+				orderDon.getCreatedTime(),
+				subject,
+				productCode,
+				payMode,
+				notifyUrl,
+				returnUrl);
+	}
 }
 }

+ 0 - 2
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -325,7 +325,6 @@ public class OrderController {
      * 手机支付
      * 手机支付
 	 */
 	 */
 	@PostMapping("/post/pay/zfb")
 	@PostMapping("/post/pay/zfb")
-    @Deprecated
     public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
     public Result<String> aliPay(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
         AliPayParams aliPayParams = orderDonService.aliPay(re, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
         AliPayParams aliPayParams = orderDonService.aliPay(re, ZfbProductCode.MOBILE_WEB.getProductCode(), null);
 //        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
 //        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
@@ -340,7 +339,6 @@ public class OrderController {
      * 套餐支付宝支付
      * 套餐支付宝支付
      */
      */
     @PostMapping("/post/pay/upgrade/zfb")
     @PostMapping("/post/pay/upgrade/zfb")
-    @Deprecated
     public Result<String> aliPayUpgrade(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
     public Result<String> aliPayUpgrade(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
         AliPayParams aliPayParams = orderDonService.aliPayUpgrade(re, ZfbProductCode.MOBILE_WEB.getProductCode(),null);
         AliPayParams aliPayParams = orderDonService.aliPayUpgrade(re, ZfbProductCode.MOBILE_WEB.getProductCode(),null);
         return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
         return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());

+ 112 - 0
netflix-web/src/main/java/com/cyksj/web/controller/wholesale/GoodsWholesaleWebController.java

@@ -1,13 +1,18 @@
 package com.cyksj.web.controller.wholesale;
 package com.cyksj.web.controller.wholesale;
 
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
 import com.cyksj.mapper.GoodsWholesaleOrderDonMapper;
 import com.cyksj.mapper.GoodsWholesaleUserDepositMapper;
 import com.cyksj.mapper.GoodsWholesaleUserDepositMapper;
+import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.entity.GoodsWholesaleOrderDon;
 import com.cyksj.model.entity.GoodsWholesaleOrderDon;
 import com.cyksj.model.entity.GoodsWholesaleUserDeposit;
 import com.cyksj.model.entity.GoodsWholesaleUserDeposit;
+import com.cyksj.model.request.AlipayOrderDonReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
 import com.cyksj.model.request.GoodsWholesaleOrderPayReq;
+import com.cyksj.model.response.AliPayTradeStatus;
 import com.cyksj.model.views.GoodsWholesaleFrontView;
 import com.cyksj.model.views.GoodsWholesaleFrontView;
 import com.cyksj.redis.RedisService;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.order.GoodsWholesalePayService;
 import com.cyksj.service.order.GoodsWholesalePayService;
@@ -16,11 +21,15 @@ import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.util.MapUtils;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 /**
 /**
  * 项目名: yhlxj
  * 项目名: yhlxj
@@ -31,6 +40,7 @@ import java.util.List;
 @RestController
 @RestController
 @RequestMapping("/applet/wholesale")
 @RequestMapping("/applet/wholesale")
 @RequiredArgsConstructor
 @RequiredArgsConstructor
+@Slf4j
 public class GoodsWholesaleWebController {
 public class GoodsWholesaleWebController {
 	private final BeanSearcher beanSearcher;
 	private final BeanSearcher beanSearcher;
 
 
@@ -46,6 +56,8 @@ public class GoodsWholesaleWebController {
 
 
 	private final GoodsWholesalePayService goodsWholesalePayService;
 	private final GoodsWholesalePayService goodsWholesalePayService;
 
 
+	private final GoodsWholesaleOrderDonMapper goodsWholesaleOrderDonMapper;
+
 
 
 	/**
 	/**
 	 * 平台批发列表
 	 * 平台批发列表
@@ -83,6 +95,12 @@ public class GoodsWholesaleWebController {
 	/**
 	/**
 	 * 支付押金
 	 * 支付押金
 	 */
 	 */
+	@PostMapping("/post/submit/deposit")
+	public Result<GoodsWholesaleUserDeposit> submitDeposit() throws Exception {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		GoodsWholesaleUserDeposit deposit = goodsWholesalePayService.submitDeposit(userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(deposit);
+	}
 
 
 	/**
 	/**
 	 * 下单批发
 	 * 下单批发
@@ -95,4 +113,98 @@ public class GoodsWholesaleWebController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
 	}
 	}
 
 
+	/**
+	 * 取消批发订单
+	 */
+	@PutMapping("/close/order/{orderId}")
+	public Result<String> closeWholesaleOrder(@PathVariable Long orderId) {
+		long userId = StpUserUtil.getLoginIdAsLong();
+		goodsWholesalePayService.closeWholesaleOrder(orderId, userId);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+	/**
+	 * 批发支付宝支付
+	 * 手机
+	 */
+	@PostMapping("/post/pay/wholesale/zfb")
+	public Result<String> aliPayWholesale(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = goodsWholesalePayService.aliPayWholesale(re, ZfbProductCode.MOBILE_WEB.getProductCode(),null);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 批发支付宝web支付
+	 * pc网页内嵌二维码
+	 */
+	@PostMapping("/post/pay/wholesale/web/zfb")
+	public Result<String> zfbWholesaleWebQrCode(@RequestBody @Validated AlipayOrderDonReq re) throws Exception {
+		AliPayParams aliPayParams = goodsWholesalePayService.zfbWholesaleWebQrCode(re, ZfbProductCode.PC_WEB.getProductCode(), BaseZfbConfig.qrPayMode_orderCode);
+		return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+	}
+
+	/**
+	 * 批发支付宝回调
+	 */
+	@PostMapping("/zfb/notify")
+	public String aliPayWholesaleNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = convertRequestParamsToMap(request);
+		String tradeStatus = params.get("trade_status");
+		String orderNo = params.get("out_trade_no");
+		if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
+			log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus);
+			goodsWholesalePayService.aliPayWholesaleNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
+			return "fail";
+		}
+		return "success";
+	}
+
+	/**
+	 * 批发押金支付宝回调
+	 */
+	@PostMapping("/deposit/zfb/notify")
+	public String aliPayWholesaleDepositNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = convertRequestParamsToMap(request);
+		String tradeStatus = params.get("trade_status");
+		String orderNo = params.get("out_trade_no");
+		if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
+			log.info("支付宝商家订单号orderNo:{},status:{}开始回调", orderNo, tradeStatus);
+			goodsWholesalePayService.aliPayWholesaleDepositNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, orderNo);
+			return "fail";
+		}
+		return "success";
+	}
+
+
+	/**
+	 * 获取支付宝回调参数
+	 */
+	private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
+		Map<String, String> retMap = new HashMap<>();
+		Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
+		for (Map.Entry<String, String[]> entry : entrySet) {
+			String name = entry.getKey();
+			String[] values = entry.getValue();
+			int valLen = values.length;
+			if (valLen == 1) {
+				retMap.put(name, values[0]);
+			} else if (valLen > 1) {
+				StringBuilder sb = new StringBuilder();
+				for (String val : values) {
+					sb.append(",").append(val);
+				}
+				retMap.put(name, sb.substring(1));
+			} else {
+				retMap.put(name, "");
+			}
+		}
+		return retMap;
+	}
+
 }
 }