zoujiajian vor 1 Jahr
Ursprung
Commit
68504cfecd

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

@@ -606,4 +606,9 @@ public interface Constant {
 	 * 会员关联订单
 	 */
 	Long VIP_RELATE_GOODS_ID = 98L;
+
+	/**
+	 * 个人网站批发配置key
+	 */
+	String WEB_WHOLESALE_CONFIG_KEY = "web_wholesale_config_key";
 }

+ 13 - 0
wholesale/src/main/java/com/yhlxj/dao/mapper/GoodsDonMapper.java

@@ -0,0 +1,13 @@
+package com.yhlxj.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.GoodsDon;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/6/5 16:33
+ */
+public interface GoodsDonMapper extends BaseMapper<GoodsDon> {
+}

+ 16 - 0
wholesale/src/main/java/com/yhlxj/dao/mapper/GoodsDonSkuMapper.java

@@ -0,0 +1,16 @@
+package com.yhlxj.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.GoodsDonSku;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: GoodsDonSkuMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/6/5 16:33
+ */
+public interface GoodsDonSkuMapper extends BaseMapper<GoodsDonSku> {
+	String getPayGoodsTitles(List<Long> skuIds);
+}

+ 12 - 0
wholesale/src/main/java/com/yhlxj/dao/mapper/ShopConfigMapper.java

@@ -0,0 +1,12 @@
+package com.yhlxj.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.ShopConfig;
+
+/**
+ * @author chan
+ * @date 2022/12/13 2:25 PM
+ */
+public interface ShopConfigMapper extends BaseMapper<ShopConfig> {
+
+}

+ 13 - 0
wholesale/src/main/java/com/yhlxj/dao/mapper/UserMapper.java

@@ -0,0 +1,13 @@
+package com.yhlxj.dao.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yhlxj.dao.model.entity.User;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: UserMapper
+ * 创建者: JavaZou
+ * 创建时间:2025/6/5 16:28
+ */
+public interface UserMapper extends BaseMapper<User> {
+}

+ 32 - 0
wholesale/src/main/java/com/yhlxj/dao/model/dto/WebWholesaleConfigDto.java

@@ -0,0 +1,32 @@
+package com.yhlxj.dao.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: WebWholesaleConfigDto
+ * 创建者: JavaZou
+ * 创建时间:2025/6/5 16:23
+ */
+@Getter
+@Setter
+public class WebWholesaleConfigDto {
+	/**
+	 * 批发兑换码规格ids
+	 */
+	private List<Long> skuIds;
+
+	/**
+	 * 单价
+	 */
+	private BigDecimal single;
+
+	/**
+	 * 最低批发数量
+	 */
+	private Integer num;
+}

+ 258 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/GoodsDon.java

@@ -0,0 +1,258 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2022/9/26 4:58 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don g",
+        where = ":condition:")
+public class GoodsDon extends BaseEntity {
+
+
+    /**
+     * 商品录入人
+     */
+    private String writer;
+
+    /**
+     * 标签
+     */
+    private String tags;
+
+    /**
+     * 商品名称
+     */
+    private String title;
+
+    /**
+     * 缩略图
+     */
+    private String logo;
+
+    /**
+     * 背景图
+     */
+    private String img;
+
+    /**
+     * 视频封面
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String videoCover;
+
+
+    /**
+     * true 上架 / false 下架
+     */
+    private Boolean status;
+
+    /**
+     * 是否隐藏
+     */
+    private Boolean isHide;
+
+    /**
+     * true 存在 / false 删除
+     */
+    private Boolean deleted;
+
+    /**
+     * 详情
+     */
+    private String detail;
+
+    /**
+     * 描述
+     */
+    private String remark;
+
+    /**
+     * 1.虚拟,2.实物,3.潮玩,4.租赁,5.补差价
+     */
+    private Integer type;
+
+    /**
+     * 分类
+     * 1、AI  2、流媒体
+     */
+    private Long category;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private List<Long> categoryList;
+
+    /**
+     * 二级分类
+     * 虚物品 1邀请制 2非邀请制
+     */
+    private Integer secondType;
+
+    private String banner;
+
+    /**
+     * 商品搭配图
+     */
+    private String matchImg;
+
+
+    /**
+     * 是否贴片 false
+     */
+    private Boolean isPatch;
+
+    /**
+     * H5标签
+     */
+    private String mobileTags;
+
+    /**
+     * 平台分销比例
+     */
+    private Integer rate;
+
+    /**
+     * 第二分销比例 不包含套餐
+     */
+    private Integer secondRate;
+
+    /**
+     * 排序
+     */
+    private Integer sortBy;
+
+    /**
+     * 虚拟销量
+     */
+    private Integer virtualSold;
+
+    /**
+     * 最小规格价格
+     */
+    private BigDecimal minPrice;
+
+    /**
+     * 最小规格价格月份
+     */
+    private Integer minMonths;
+
+    /**
+     * 最小规格 天数
+     */
+    private Integer minDays;
+
+    /**
+     * 最大规格价格
+     */
+    private BigDecimal maxPrice;
+
+    /**
+     * 最大规格价格月份
+     */
+    private Integer maxMonths;
+
+    /**
+     * 最大规格 天数
+     */
+    private Integer maxDays;
+
+    /**
+     * 付款说明
+     */
+    private String payDesc;
+
+    /**
+     * 购买说明
+     */
+    private String buyDesc;
+
+    /**
+     * 特殊类型
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private GoodsDon.SpecialType specialType;
+
+    /**
+     * 视频
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String video;
+
+    /**
+     * 推荐标题
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String recommendTitle;
+
+    @TableField(exist = false)
+    @DbIgnore
+    private List<Long> recommendGoodsList;
+
+    /**
+     * 推荐平台
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String recommendGoods;
+
+    @TableField(exist = false)
+    @DbIgnore
+    private BigDecimal price;
+
+    @TableField(exist = false)
+    @DbIgnore
+    private Integer soldNum;
+
+    @TableField(exist = false)
+    @DbIgnore
+    private Integer accountCount;
+
+    /**
+     * 是否是特定价格 规格平台
+     */
+    private Boolean isSp;
+
+    /**
+     * 是否有专属用户规格属性
+     */
+    private Boolean isOwns;
+
+    /**
+     * 是否参与分销 默认参与
+     */
+    private Boolean isDistribute;
+
+    /**
+     * 是否开启规格分销 默认未开启
+     */
+    private Boolean isSkuDistribute;
+
+    /**
+     * 是否是第三方商品
+     */
+    private Boolean isThirdGoods;
+
+    @AllArgsConstructor
+    @Getter
+    public enum SpecialType {
+        recharge("代充"),
+        courseware("课程"),
+        giftCard("礼品卡")
+        ;
+
+        private String desc;
+
+    }
+}

+ 271 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/GoodsDonSku.java

@@ -0,0 +1,271 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.cyksj.model.views.DistributeSearchView;
+import com.cyksj.model.views.GoodsDiscountPlusPurchaseRelationFrontView;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2022/9/26 4:58 PM
+ */
+@Getter
+@Setter
+@SearchBean(tables = "goods_don_sku",
+		where = ":condition:")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class GoodsDonSku extends BaseEntity {
+
+    private Long goodsId;
+
+
+    private String subTitle;
+
+    /**
+     * 商品规格 ids
+     */
+    private String specIds;
+
+    /**
+     * 重复校验规格ids
+     */
+    private String dupSpecIds;
+
+    /**
+     * 商品规格 value
+     */
+    private String specVal;
+
+    /**
+     * 商品规格 json
+     */
+    private String specJson;
+
+    /**
+     * 规格说明信息
+     */
+    private String notifyText;
+
+    /**
+     * H5标签
+     */
+    private String mobileTags;
+
+    /**
+     * 规格背景图
+     */
+    private String img;
+
+    /**
+     * 规格框提示
+     */
+    private String smallMsg;
+
+    /**
+     * 双重验证码次数
+     */
+    private Integer codeNum;
+
+    /**
+     * 商品预览图
+     */
+    private String picture;
+
+    /**
+     * 商品详情图
+     */
+    private String detail;
+
+    /**
+     * 标签
+     */
+    private String tags;
+
+
+    /**
+     * true 上架 / false 下架
+     */
+    private Boolean status;
+
+
+    /**
+     * 车位数
+     */
+    private Integer num;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 专属用户规格
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String userOwns;
+
+    /**
+     * 专属用户列表
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private List<DistributeSearchView> userOwnsList;
+
+    /**
+     * 是否开启实物车票时长权益
+     */
+    private Boolean isBenefits;
+
+    /**
+     * 权益列表
+     */
+    private String benefitsList;
+
+    /**
+     * 月数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer months;
+
+    /**
+     * 天数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer days;
+
+//    @DbField("case when spec_val like '%月%' and spec_val not like '%年%' then 0 when spec_val like '%季%' then 1 when spec_val like '%半年%' then 2 when spec_val like '%年%' then 3 else 66 end")
+//    @TableField(exist = false)
+//    private Integer orderBy;
+
+    /**
+     * 加购规格
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private List<GoodsDiscountPlusPurchaseRelation> dpSku;
+
+    /**
+     * 是否是优惠加购规格
+     */
+    private Boolean isDp;
+
+    /**
+     * 是否是镜像服务
+     */
+    private Boolean isMirror;
+
+    /**
+     * 是否是车队形式
+     */
+    private Boolean isCar;
+
+    /**
+     * 限制次数
+     */
+    private Integer gptLimitNum;
+
+    /**
+     * 限制时间
+     */
+    private Long gptLimitTime;
+
+    /**
+     * mj fast次数
+     */
+    private Integer mjFastNum;
+
+    /**
+     * mj relax次数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer mjRelaxNum;
+
+    /**
+     * luma次数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer lumaNum;
+
+    /**
+     * deepseek限制次数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer dsLimitNum;
+
+    /**
+     * deepseek限制时间
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long dsLimitTime;
+
+    /**
+     * 其他模型限制次数
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer otherLimitNum;
+
+    /**
+     * 其他模型限制时间
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Long otherLimitTime;
+
+    /**
+     * 特定价格
+     */
+    private BigDecimal specificPrice;
+
+    /**
+     * 特定平台购买用户人群
+     */
+    private String specificGoodsIds;
+
+    /**
+     * 优惠加购商品规格展示
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    private List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuList;
+
+    /**
+     * 前端展示
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    @JsonProperty("gname")
+    private String gName;
+
+    /**
+     * 前端展示
+     */
+    @DbIgnore
+    @TableField(exist = false)
+    @JsonProperty("sname")
+    private String sName;
+
+    @DbIgnore
+    @TableField(exist = false)
+    private BigDecimal yhShopSkuPrice;
+
+    /**
+     * 排序
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private Integer sorted;
+
+    /**
+     * 备注
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String remark;
+}

+ 128 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/User.java

@@ -0,0 +1,128 @@
+package com.yhlxj.dao.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.yhlxj.dao.model.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2021/10/10 下午2:53
+ */
+@Getter
+@Setter
+@Accessors(chain = true)
+public class User extends BaseEntity implements Serializable{
+    /** 手机号;手机号 */
+    private String phone ;
+    /** 手机号登录 */
+    private String loginPhone;
+    /**
+     * 邮箱登录
+     */
+    private String email;
+    /** 昵称;昵称 */
+    private String nickname ;
+    /** 头像;头像 */
+    private String headimgurl ;
+
+    private String showId;
+
+    /** 开放平台唯一id;开放平台唯一id */
+    private String unionid ;
+
+    /**
+     * openid
+     */
+    private String openId;
+
+    /** 省份;省份 */
+    private String province ;
+    /** 国家;国家 */
+    private String country ;
+
+    /**
+     * 城市
+     */
+    private String city ;
+
+    /** 性别;性别 */
+    private Integer sex ;
+
+    private BigDecimal points;
+
+    private BigDecimal activePoints;
+
+    /**
+     * 余额 分
+     */
+    private BigDecimal balance;
+
+    /**
+     * 用户店铺提成金额
+     */
+    private BigDecimal yhsMoney;
+
+    /**
+     * 用户下级渠道提成金额
+     */
+    private BigDecimal subApplyMoney;
+
+    /**
+     * 镜像加盟商提成金额
+     */
+    private BigDecimal mpMoney;
+
+    /**
+     * 推广id
+     */
+    private Long popularizeId;
+
+    /**
+     * 用户是否被拉黑 true是
+     */
+    private Boolean isBlack;
+
+    /**
+     * 注册环境
+     * h5:移动端浏览器登录
+     * 微信:公众号h5授权登录
+     * pc:浏览器登录,包括微信扫码在浏览器登录
+     */
+    private String registerEnv;
+
+    /**
+     * 最后登录时间
+     */
+    private Date lastTime;
+
+    @TableField(exist = false)
+    private Long emailUserId;
+
+    @TableField(exist = false)
+    private Long phoneUserId;
+
+    /**
+     * 是否是谷歌授权登录
+     */
+    private Boolean isGoogle;
+
+    @Getter
+    public enum RegisterEnv{
+        wx("公众号h5授权登录"),
+        h5("移动端浏览器登录"),
+        pc("浏览器登录,包括微信扫码在浏览器登录"),
+        ;
+        String desc;
+
+        RegisterEnv(String desc) {
+            this.desc = desc;
+        }
+    }
+}
+

+ 7 - 0
wholesale/src/main/java/com/yhlxj/dao/model/entity/WebWholesaleOrderDon.java

@@ -21,6 +21,8 @@ import java.util.Date;
 public class WebWholesaleOrderDon extends BaseEntity {
 	private Long userId;
 
+	private Integer num;
+
 	private BigDecimal money;
 
 	private BigDecimal refundMoney;
@@ -53,6 +55,11 @@ public class WebWholesaleOrderDon extends BaseEntity {
 	 */
 	private String payTitle;
 
+	/**
+	 * 批发规格ids
+	 */
+	private String skuIds;
+
 	public enum Status {
 		/**
 		 * 订单状态

+ 5 - 0
wholesale/src/main/java/com/yhlxj/dao/model/request/WebOrderPayRequest.java

@@ -21,4 +21,9 @@ public class WebOrderPayRequest {
 	private BigDecimal price;
 
 	private Long userId;
+
+	/**
+	 * 支付类型
+	 */
+	private String type;
 }

+ 3 - 3
wholesale/src/main/java/com/yhlxj/service/order/WebWholesaleOrderDonService.java

@@ -14,9 +14,9 @@ import java.util.Map;
  * 创建时间:2025/6/5 14:04
  */
 public interface WebWholesaleOrderDonService {
-	AliPayParams zfbUnifiedPay(AlipayOrderDonReq re) throws Exception;
+	WebWholesaleOrderDon submit(WebOrderPayRequest payRequest) throws Exception;
 
-	WebWholesaleOrderDon submit(WebOrderPayRequest payRequest);
+	AliPayParams zfbUnifiedPay(AlipayOrderDonReq re) throws Exception;
 
-	void aliPayNotify(Map<String, String> params);
+	void aliPayNotify(Map<String, String> params) throws Exception;
 }

+ 120 - 0
wholesale/src/main/java/com/yhlxj/service/order/impl/WebWholesaleOrderDonServiceImpl.java

@@ -1,15 +1,38 @@
 package com.yhlxj.service.order.impl;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.snowflake.Sequence;
+import com.cyksj.common.util.Codec;
+import com.cyksj.common.util.Jsons;
+import com.cyksj.enums.GatewayApiCode;
+import com.yhlxj.dao.mapper.*;
 import com.yhlxj.dao.model.dto.AliPayParams;
+import com.yhlxj.dao.model.dto.WebWholesaleConfigDto;
+import com.yhlxj.dao.model.entity.ShopConfig;
+import com.yhlxj.dao.model.entity.SysConfig;
+import com.yhlxj.dao.model.entity.User;
+import com.yhlxj.dao.model.entity.WebWholesaleOrderDon;
 import com.yhlxj.dao.model.request.AlipayOrderDonReq;
+import com.yhlxj.dao.model.request.OrderAttach;
+import com.yhlxj.dao.model.request.WebOrderPayRequest;
 import com.yhlxj.service.order.WebWholesaleOrderDonService;
 import com.yhlxj.service.pay.AliPayCommonService;
+import com.yhlxj.service.zfb.BaseZfbConfig;
 import com.yhlxj.service.zfb.ZfbProductCode;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
 /**
  * 项目名: yhlxj2
  * 文件名: WebWholesaleOrderDonServiceImpl
@@ -21,6 +44,58 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class WebWholesaleOrderDonServiceImpl implements WebWholesaleOrderDonService {
 	private final AliPayCommonService aliPayCommonService;
+
+	private final SysConfigMapper sysConfigMapper;
+
+	private final UserMapper userMapper;
+
+	private static final Sequence SEQUENCE = new Sequence(0);
+
+	private final WebWholeSaleOrderDonMapper orderDonMapper;
+
+	private final ShopConfigMapper shopConfigMapper;
+
+	private final GoodsDonSkuMapper skuMapper;
+
+	@Override
+	public WebWholesaleOrderDon submit(WebOrderPayRequest payRequest) throws Exception {
+		Long userId = payRequest.getUserId();
+		Integer payNum = payRequest.getNum();
+		SysConfig sysConfig = sysConfigMapper.selectOne(Wrappers.lambdaQuery(SysConfig.class)
+				.eq(SysConfig::getSysKey, Constant.WEB_WHOLESALE_CONFIG_KEY)
+				.last("limit 1"));
+		if (sysConfig == null || StrUtil.isEmpty(sysConfig.getSysValue())) {
+			throw BusinessRuntimeException.getInstance("特价批发异常");
+		}
+		WebWholesaleConfigDto webWholesaleConfigDto = Jsons.parseObject(sysConfig.getSysValue(), WebWholesaleConfigDto.class);
+		Integer minNum = webWholesaleConfigDto.getNum();
+		if (payNum < minNum) {
+			throw BusinessRuntimeException.getInstance("起批数量最低为{0}", minNum);
+		}
+		//批发规格ids
+		List<Long> skuIds = webWholesaleConfigDto.getSkuIds();
+		BigDecimal singlePrice = webWholesaleConfigDto.getSingle();
+		WebWholesaleOrderDon orderDon = new WebWholesaleOrderDon();
+		orderDon.setNum(payNum);
+
+		User user = userMapper.selectById(userId);
+		if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
+		if (user.getIsBlack()) throw BusinessRuntimeException.getInstance("系统检测操作异常,请稍后再试");
+		/* 生成订单 */
+		String donNo = SEQUENCE.nextId().toString();
+		orderDon.setOrderNo(donNo);
+		orderDon.setMoney(singlePrice.multiply(BigDecimal.valueOf(orderDon.getNum())));
+		orderDon.setStatus(WebWholesaleOrderDon.Status.noPayment);
+		orderDon.setUserId(userId);
+		orderDon.setType(WebWholesaleOrderDon.Type.getType(payRequest.getType()));
+		//设置订单支付商品信息
+		String payTitle = skuMapper.getPayGoodsTitles(skuIds);
+		orderDon.setPayTitle(payTitle);
+		orderDon.setSkuIds(skuIds.toString());
+		orderDonMapper.insert(orderDon);
+		return orderDon;
+	}
+
 	@Override
 	public AliPayParams zfbUnifiedPay(AlipayOrderDonReq re) throws Exception {
 		String productCode = StrUtil.EMPTY;
@@ -32,4 +107,49 @@ public class WebWholesaleOrderDonServiceImpl implements WebWholesaleOrderDonServ
 		}
 		return aliPayCommonService.unifiedPayWebWholesale(re.getOrderId(), productCode, re.getPayMode(), re.getReturnUrl());
 	}
+
+	@Override
+	public void aliPayNotify(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();
+		WebWholesaleOrderDon orderDon = orderDonMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		String appId = params.get("app_id");
+		ShopConfig shopConfig = shopConfigMapper.selectOne(Wrappers.lambdaQuery(ShopConfig.class)
+				.eq(ShopConfig::getAppId, appId)
+				.last("limit 1"));
+		boolean signVerified = AlipaySignature.rsaCheckV1(params, shopConfig.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"));
+		if (!orderDon.getStatus().equals(WebWholesaleOrderDon.Status.noPayment) && !orderDon.getStatus().equals(WebWholesaleOrderDon.Status.close)) {
+			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
+			return;
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setStatus(WebWholesaleOrderDon.Status.complete);
+		if (StrUtil.isNotBlank(payTimeStr)) {
+			orderDon.setPayTime(DateUtil.parse(payTimeStr, "yyyy-MM-dd HH:mm:ss"));
+		}
+		orderDon.setBuyerId(buyerId);
+		orderDon.setShopId(appId);
+		orderDon.setType(WebWholesaleOrderDon.Type.ALI_PAY);
+		orderDonMapper.updateById(orderDon);
+		//回调
+		unifiedHandlerOrderNotify(orderDon);
+	}
+
+	private void unifiedHandlerOrderNotify(WebWholesaleOrderDon orderDon) {
+		//订单关联兑换码 TODO
+	}
 }

+ 10 - 0
wholesale/src/main/resources/mapper/AccountBlockedReplaceRecordMapper.xml

@@ -0,0 +1,10 @@
+<?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.yhlxj.dao.mapper.GoodsDonSkuMapper">
+
+
+    <select id="getPayGoodsTitles" resultType="java.lang.String">
+       select GROUP_CONCAT(title SEPARATOR '/') from goods_don where id in (select goods_id from goods_don_sku where id in
+        <foreach collection="skuIds" item="item" open="(" separator="," close=")">#{item}</foreach>)
+    </select>
+</mapper>