Commit b9adbffd by 程裕兵

feat:apply

parent 59644bd9
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.jiejing.paycenter.common.enums.common.OpenStateEnums;
import com.jiejing.paycenter.common.enums.merchant.CardTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.CertTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.CompanyTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.ExpireTypeEnums;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* <p>
* 品牌商户表(只保留最新在用的)
* </p>
*
* @author chengyubing, created on 2024-02-22
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class BrandMerchant implements Serializable {
private static final long serialVersionUID = 8098172448095897767L;
/**
* 备注: ID 是否允许为null: NO
*/
@TableId(value = "id", type = IdType.ID_WORKER)
private Long id;
/**
* 备注: 品牌ID 是否允许为null: YES
*/
private Long brandId;
/**
* 备注: 渠道号 是否允许为null: YES
*/
private String channelNo;
/**
* 备注: paycenter的商户ID 是否允许为null: YES
*/
private Long merchantId;
/**
* 备注: 三方商户号 是否允许为null: YES
*/
private String merchantNo;
/**
* 备注: 商户名称 是否允许为null: YES
*/
private String merchantName;
/**
* 备注: 商户简称 是否允许为null: YES
*/
private String shortName;
/**
* 备注: 企业类型 是否允许为null: YES
*/
private CompanyTypeEnums companyType;
/**
* 备注: 支付宝认证状态 默认值: I 是否允许为null: YES
*/
private OpenStateEnums aliAuthState;
/**
* 备注: 支付宝商户号 是否允许为null: YES
*/
private String aliMerchantNo;
/**
* 备注: 微信线下通道认证状态:I-初始态;S-成功;F-失败 默认值: I 是否允许为null: YES
*/
private OpenStateEnums wxOfflineAuthState;
/**
* 备注: 微信线下通道商户号 是否允许为null: YES
*/
private String wxOfflineMerchantNo;
/**
* 备注: 微信线上通道认证状态:I-初始态;S-成功;F-失败 默认值: I 是否允许为null: YES
*/
private OpenStateEnums wxOnlineAuthState;
/**
* 备注: 微信线上通道商户号 是否允许为null: YES
*/
private String wxOnlineMerchantNo;
/**
* 备注: 经营地址:省 是否允许为null: YES
*/
private String businessProvince;
/**
* 备注: 经营地址:市 是否允许为null: YES
*/
private String businessCity;
/**
* 备注: 经营地址:区 是否允许为null: YES
*/
private String businessDistrict;
/**
* 备注: 商户经营详细地址 是否允许为null: YES
*/
private String businessAddress;
/**
* 备注: 营业执照号 是否允许为null: YES
*/
private String licenseCode;
/**
* 备注: 营业执照有效期类型 是否允许为null: YES
*/
private ExpireTypeEnums licenseExpireType;
/**
* 备注: 营业执照有效期开始日期 是否允许为null: YES
*/
private Date licenseStartDate;
/**
* 备注: 营业执照有效期截止日期 是否允许为null: YES
*/
private Date licenseEndDate;
/**
* 备注: 营业护照规定的经营范围 是否允许为null: YES
*/
private String licenseBusinessScope;
/**
* 备注: 营业执照创办日期 是否允许为null: YES
*/
private Date licenseFoundDate;
/**
* 备注: 注册资本 是否允许为null: YES
*/
private String licenseRegisteredCapital;
/**
* 备注: 商户经营地址:省 是否允许为null: YES
*/
private String licenseProvince;
/**
* 备注: 商户经营地址:市 是否允许为null: YES
*/
private String licenseCity;
/**
* 备注: 商户经营地址:区 是否允许为null: YES
*/
private String licenseDistrict;
/**
* 备注: 营业执照注册详细地址 是否允许为null: NO
*/
private String licenseAddress;
/**
* 备注: 法人姓名 是否允许为null: YES
*/
private String legalName;
/**
* 备注: 法人证件号码 是否允许为null: YES
*/
private String legalCertNo;
/**
* 备注: 法人证件类型 是否允许为null: YES
*/
private CertTypeEnums legalCertType;
/**
* 备注: 法人证件有效期类型 是否允许为null: YES
*/
private ExpireTypeEnums legalCertExpireType;
/**
* 备注: 法人证件有效期开始日期 是否允许为null: YES
*/
private Date legalCertStartDate;
/**
* 备注: 法人证件有效期截止日期 是否允许为null: YES
*/
private Date legalCertEndDate;
/**
* 备注: 法人手机号 是否允许为null: YES
*/
private String legalPhone;
/**
* 备注: 法人证件地址:省 是否允许为null: YES
*/
private String legalProvince;
/**
* 备注: 法人证件地址:市 是否允许为null: YES
*/
private String legalCity;
/**
* 备注: 法人证件地址:区 是否允许为null: YES
*/
private String legalDistrict;
/**
* 备注: 法人证件详细地址 是否允许为null: YES
*/
private String legalAddress;
/**
* 备注: 联系人邮箱 是否允许为null: YES
*/
private String contactEmail;
/**
* 备注: 结算卡类型:对公卡、对私卡 是否允许为null: YES
*/
private CardTypeEnums bankCardType;
/**
* 备注: 结算卡卡号 是否允许为null: YES
*/
private String bankCardNo;
/**
* 备注: 银行卡账户名(对私卡:持卡人姓名;对公卡:营业执照名称) 是否允许为null: YES
*/
private String bankCardName;
/**
* 备注: 持卡人手机号(对私卡必填) 是否允许为null: YES
*/
private String bankPhone;
/**
* 备注: 结算卡证件号码(对私卡:持卡人身份证;对公卡:营业执照号) 是否允许为null: YES
*/
private String bankCertNo;
/**
* 备注: 结算卡持卡人证件类型 是否允许为null: YES
*/
private CertTypeEnums bankCertType;
/**
* 备注: 证件有效期类型,对私卡必填 是否允许为null: YES
*/
private ExpireTypeEnums bankCertExpireType;
/**
* 备注: 持卡人证件有效期开始日期,对私卡必填 是否允许为null: YES
*/
private Date bankCertStartDate;
/**
* 备注: 持卡人证件有效期截止日期 是否允许为null: YES
*/
private Date bankCertEndDate;
/**
* 备注: 基本存款账户编号 是否允许为null: YES
*/
private String bankBaseDepositNo;
/**
* 备注: 银行编码 是否允许为null: YES
*/
private String bankCode;
/**
* 备注: bankName 是否允许为null: YES
*/
private String bankName;
/**
* 备注: 支行名称 是否允许为null: YES
*/
private String bankBranchName;
/**
* 备注: 支行号 是否允许为null: YES
*/
private String bankBranchCode;
/**
* 备注: 结算卡开卡地址:省 是否允许为null: YES
*/
private String bankCardProvince;
/**
* 备注: 结算卡开卡地址:市 是否允许为null: YES
*/
private String bankCardCity;
/**
* 备注: 结算卡开卡地址:区 是否允许为null: YES
*/
private String bankCardDistrict;
/**
* 备注: 结算卡开卡详细地址 是否允许为null: YES
*/
private String bankCardAddress;
/**
* 备注: 资源信息 是否允许为null: YES
*/
private String resourceInfo;
/**
* 备注: 盐 是否允许为null: YES
*/
private String salt;
/**
* 备注: 完成时间 是否允许为null: YES
*/
private Date finishTime;
/**
* 备注: 创建时间 是否允许为null: YES
*/
private Date createTime;
/**
* 备注: 更新时间 是否允许为null: YES
*/
private Date updateTime;
public static final String ID = "id";
public static final String BRAND_ID = "brand_id";
public static final String CHANNEL_NO = "channel_no";
public static final String MERCHANT_ID = "merchant_id";
public static final String MERCHANT_NO = "merchant_no";
public static final String MERCHANT_NAME = "merchant_name";
public static final String SHORT_NAME = "short_name";
public static final String COMPANY_TYPE = "company_type";
public static final String ALI_AUTH_STATE = "ali_auth_state";
public static final String ALI_MERCHANT_NO = "ali_merchant_no";
public static final String WX_OFFLINE_AUTH_STATE = "wx_offline_auth_state";
public static final String WX_OFFLINE_MERCHANT_NO = "wx_offline_merchant_no";
public static final String WX_ONLINE_AUTH_STATE = "wx_online_auth_state";
public static final String WX_ONLINE_MERCHANT_NO = "wx_online_merchant_no";
public static final String BUSINESS_PROVINCE = "business_province";
public static final String BUSINESS_CITY = "business_city";
public static final String BUSINESS_DISTRICT = "business_district";
public static final String BUSINESS_ADDRESS = "business_address";
public static final String LICENSE_CODE = "license_code";
public static final String LICENSE_EXPIRE_TYPE = "license_expire_type";
public static final String LICENSE_START_DATE = "license_start_date";
public static final String LICENSE_END_DATE = "license_end_date";
public static final String LICENSE_BUSINESS_SCOPE = "license_business_scope";
public static final String LICENSE_FOUND_DATE = "license_found_date";
public static final String LICENSE_REGISTERED_CAPITAL = "license_registered_capital";
public static final String LICENSE_PROVINCE = "license_province";
public static final String LICENSE_CITY = "license_city";
public static final String LICENSE_DISTRICT = "license_district";
public static final String LICENSE_ADDRESS = "license_address";
public static final String LEGAL_NAME = "legal_name";
public static final String LEGAL_CERT_NO = "legal_cert_no";
public static final String LEGAL_CERT_TYPE = "legal_cert_type";
public static final String LEGAL_CERT_EXPIRE_TYPE = "legal_cert_expire_type";
public static final String LEGAL_CERT_START_DATE = "legal_cert_start_date";
public static final String LEGAL_CERT_END_DATE = "legal_cert_end_date";
public static final String LEGAL_PHONE = "legal_phone";
public static final String LEGAL_PROVINCE = "legal_province";
public static final String LEGAL_CITY = "legal_city";
public static final String LEGAL_DISTRICT = "legal_district";
public static final String LEGAL_ADDRESS = "legal_address";
public static final String CONTACT_EMAIL = "contact_email";
public static final String BANK_CARD_TYPE = "bank_card_type";
public static final String BANK_CARD_NO = "bank_card_no";
public static final String BANK_CARD_NAME = "bank_card_name";
public static final String BANK_PHONE = "bank_phone";
public static final String BANK_CERT_NO = "bank_cert_no";
public static final String BANK_CERT_TYPE = "bank_cert_type";
public static final String BANK_CERT_EXPIRE_TYPE = "bank_cert_expire_type";
public static final String BANK_CERT_START_DATE = "bank_cert_start_date";
public static final String BANK_CERT_END_DATE = "bank_cert_end_date";
public static final String BANK_BASE_DEPOSIT_NO = "bank_base_deposit_no";
public static final String BANK_CODE = "bank_code";
public static final String BANK_NAME = "bank_name";
public static final String BANK_BRANCH_NAME = "bank_branch_name";
public static final String BANK_BRANCH_CODE = "bank_branch_code";
public static final String BANK_CARD_PROVINCE = "bank_card_province";
public static final String BANK_CARD_CITY = "bank_card_city";
public static final String BANK_CARD_DISTRICT = "bank_card_district";
public static final String BANK_CARD_ADDRESS = "bank_card_address";
public static final String RESOURCE_INFO = "resource_info";
public static final String SALT = "salt";
public static final String FINISH_TIME = "finish_time";
public static final String CREATE_TIME = "create_time";
public static final String UPDATE_TIME = "update_time";
}
...@@ -78,7 +78,12 @@ public class BrandMerchantApply implements Serializable { ...@@ -78,7 +78,12 @@ public class BrandMerchantApply implements Serializable {
private String channelNo; private String channelNo;
/** /**
* 商户号 * 商户ID(pay center提供)
*/
private Long merchantId;
/**
* 三方商户号
*/ */
private String merchantNo; private String merchantNo;
...@@ -113,6 +118,11 @@ public class BrandMerchantApply implements Serializable { ...@@ -113,6 +118,11 @@ public class BrandMerchantApply implements Serializable {
private OpenStateEnums aliOpenState; private OpenStateEnums aliOpenState;
/** /**
* 支付宝认证状态
*/
private OpenStateEnums aliAuthState;
/**
* 支付宝商户号 * 支付宝商户号
*/ */
private String aliMerchantNo; private String aliMerchantNo;
...@@ -420,6 +430,8 @@ public class BrandMerchantApply implements Serializable { ...@@ -420,6 +430,8 @@ public class BrandMerchantApply implements Serializable {
public static final String CHANNEL_NO = "channel_no"; public static final String CHANNEL_NO = "channel_no";
public static final String MERCHANT_ID = "merchant_id";
public static final String MERCHANT_NO = "merchant_no"; public static final String MERCHANT_NO = "merchant_no";
public static final String MERCHANT_NAME = "merchant_name"; public static final String MERCHANT_NAME = "merchant_name";
...@@ -434,6 +446,8 @@ public class BrandMerchantApply implements Serializable { ...@@ -434,6 +446,8 @@ public class BrandMerchantApply implements Serializable {
public static final String ALI_OPEN_STATE = "ali_open_state"; public static final String ALI_OPEN_STATE = "ali_open_state";
public static final String ALI_AUTH_STATE = "ali_auth_state";
public static final String ALI_MERCHANT_NO = "ali_merchant_no"; public static final String ALI_MERCHANT_NO = "ali_merchant_no";
public static final String ALI_OPEN_FAIL_MESSAGE = "ali_open_fail_message"; public static final String ALI_OPEN_FAIL_MESSAGE = "ali_open_fail_message";
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, brand_id, studio_id, apply_no, apply_type, channel_no, merchant_no, merchant_name, short_name, company_type, open_state, open_fail_message, ali_open_state, ali_merchant_no, ali_open_fail_message, wx_offline_open_state, wx_offline_auth_state, wx_offline_merchant_no, wx_offline_open_fail_message, wx_online_open_state, wx_online_auth_state, wx_online_merchant_no, wx_online_open_fail_message, business_province, business_city, business_district, business_address, license_code, license_expire_type, license_start_date, license_end_date, license_business_scope, license_found_date, license_province, license_city, license_district, license_address, legal_name, legal_cert_no, legal_cert_type, legal_cert_expire_type, legal_cert_start_date, legal_cert_end_date, legal_phone, legal_province, legal_city, legal_district, legal_address, contact_email, bank_card_type, bank_card_no, bank_card_name, bank_phone, bank_cert_no, bank_cert_type, bank_cert_expire_type, bank_cert_start_date, bank_cert_end_date, bank_base_deposit_no, bank_code, bank_name, bank_branch_name, bank_branch_code, bank_card_province, bank_card_city, bank_card_district, bank_card_address, resource_info, salt, finish_time, create_time, update_time id, brand_id, studio_id, apply_no, apply_type, channel_no, merchant_id, merchant_no, merchant_name, short_name, company_type, open_state, open_fail_message, ali_open_state, ali_auth_state, ali_merchant_no, ali_open_fail_message, wx_offline_open_state, wx_offline_auth_state, wx_offline_merchant_no, wx_offline_open_fail_message, wx_online_open_state, wx_online_auth_state, wx_online_merchant_no, wx_online_open_fail_message, business_province, business_city, business_district, business_address, license_code, license_expire_type, license_start_date, license_end_date, license_business_scope, license_found_date, license_province, license_city, license_district, license_address, legal_name, legal_cert_no, legal_cert_type, legal_cert_expire_type, legal_cert_start_date, legal_cert_end_date, legal_phone, legal_province, legal_city, legal_district, legal_address, contact_email, bank_card_type, bank_card_no, bank_card_name, bank_phone, bank_cert_no, bank_cert_type, bank_cert_expire_type, bank_cert_start_date, bank_cert_end_date, bank_base_deposit_no, bank_code, bank_name, bank_branch_name, bank_branch_code, bank_card_province, bank_card_city, bank_card_district, bank_card_address, resource_info, salt, finish_time, create_time, update_time
</sql> </sql>
<select id="getLatestOneSuccessByBrandId" <select id="getLatestOneSuccessByBrandId"
......
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.mapper;
import com.jiejing.fitness.finance.repository.entity.BrandMerchant;
import com.jiejing.mbp.inject.XBaseMapper;
/**
* <p>
* 品牌商户表(只保留最新在用的) Mapper 接口
* </p>
*
* @author chengyubing, created on 2024-02-22
*/
public interface BrandMerchantMapper extends XBaseMapper<BrandMerchant> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
~
~ The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
~ Official website: www.xiaomai5.com
~
~
~
~ Copyright © 2024 杭州杰竞科技有限公司 版权所有.
~
~ 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
~ 官网: www.xiaomai5.com
-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jiejing.fitness.finance.repository.mapper.BrandMerchantMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, brand_id, channel_no, merchant_id, merchant_no, merchant_name, short_name, company_type, ali_auth_state, ali_merchant_no, wx_offline_auth_state, wx_offline_merchant_no, wx_online_auth_state, wx_online_merchant_no, business_province, business_city, business_district, business_address, license_code, license_expire_type, license_start_date, license_end_date, license_business_scope, license_found_date, license_registered_capital, license_province, license_city, license_district, license_address, legal_name, legal_cert_no, legal_cert_type, legal_cert_expire_type, legal_cert_start_date, legal_cert_end_date, legal_phone, legal_province, legal_city, legal_district, legal_address, contact_email, bank_card_type, bank_card_no, bank_card_name, bank_phone, bank_cert_no, bank_cert_type, bank_cert_expire_type, bank_cert_start_date, bank_cert_end_date, bank_base_deposit_no, bank_code, bank_name, bank_branch_name, bank_branch_code, bank_card_province, bank_card_city, bank_card_district, bank_card_address, resource_info, salt, finish_time, create_time, update_time
</sql>
</mapper>
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jiejing.fitness.finance.repository.entity.BrandMerchant;
import com.jiejing.fitness.finance.repository.mapper.BrandMerchantMapper;
import com.jiejing.mbp.MapperRepoService;
import org.springframework.stereotype.Service;
/**
* <p>
* 品牌商户表(只保留最新在用的) 服务实现类
* </p>
*
* @author chengyubing, created on 2024-02-22
*/
@Service
public class BrandMerchantRpService extends MapperRepoService<Long, BrandMerchant, BrandMerchantMapper> {
public BrandMerchant getByBrandId(Long brandId) {
QueryWrapper<BrandMerchant> wrapper = new QueryWrapper<>();
wrapper.eq(BrandMerchant.BRAND_ID, brandId);
return this.baseMapper.selectOne(wrapper);
}
}
...@@ -51,7 +51,8 @@ public class GeneratorServiceEntity { ...@@ -51,7 +51,8 @@ public class GeneratorServiceEntity {
*/ */
private String author = "chengyubing"; private String author = "chengyubing";
private String[] tableNames = { private String[] tableNames = {
"brand_merchant_apply" // "brand_merchant_apply",
"brand_merchant"
}; };
/** /**
......
package com.jiejing.fitness.finance.service.enums;
import com.jiejing.common.exception.BaseBizError;
import lombok.Getter;
/**
* @author chengyubing
* @since 2024/2/21 14:54
*/
@Getter
public enum FinanceErrorEnums implements BaseBizError {
/**
* 三方异常
*/
PARAMS_ERROR("【参数错误】${message}"),
THIRD_ERROR("【三方异常】${message}"),
NOT_EXIST("数据不存在"),
NOT_SUPPORT_METHOD("不支持的方法"),
NOT_SUPPORT_TYPE("不支持的类型"),
NOT_SUPPORT_FILE_TYPE("不支持的文件类型"),
;
@Getter
private final String module = "PAY_CENTER";
@Getter
private final String code = name();
@Getter
private final String defaultMessage;
FinanceErrorEnums(String defaultMessage) {
this.defaultMessage = defaultMessage;
}
}
package com.jiejing.fitness.finance.service.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import java.util.Arrays;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 商户业务类型
*
* @author raccoon
* @since 2020-11-06 16:44
*/
@Getter
@AllArgsConstructor
public enum MerchantTypeEnums {
/**
* 未知
*/
UNKNOWN("", ""),
/**
* 品牌
*/
BRAND("BRAND", "品牌"),
;
@EnumValue
private final String code;
private final String desc;
public static MerchantTypeEnums getByCode(String code) {
return Arrays.stream(MerchantTypeEnums.values()).filter(e -> e.getCode().equals(code)).findFirst()
.orElse(UNKNOWN);
}
}
package com.jiejing.fitness.finance.service.event;
import static org.springframework.integration.IntegrationMessageHeaderAccessor.DELIVERY_ATTEMPT;
import com.alibaba.fastjson.JSON;
import com.jiejing.fitness.finance.service.enums.MerchantTypeEnums;
import com.jiejing.fitness.finance.service.merchant.BrandMerchantService;
import com.jiejing.paycenter.common.event.MerchantEvent;
import com.xiaomai.event.annotation.EventHandler;
import java.util.ArrayList;
import java.util.Optional;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Service;
/**
* @author chengyubing
* @since 2024/2/21 14:30
*/
@Slf4j
@Service
public class ListenerService {
private static final int MAX_RETRY = 3;
@Resource
private BrandMerchantService brandMerchantService;
@EventHandler(value = MerchantEvent.class, binder = "biz-kafka", maxAttempts = MAX_RETRY)
public void handleMerchantEvent(MerchantEvent event, @Header(DELIVERY_ATTEMPT) int retryNum) {
try {
log.info("start process merchant event {}, {}, {}", event.getApplyNo(), event.getMerchantId(),
event.getMerchantNo());
event.setSubChannels(Optional.ofNullable(event.getSubChannels()).orElse(new ArrayList<>(1)));
event.setSubChannelAuths(Optional.ofNullable(event.getSubChannelAuths()).orElse(new ArrayList<>(1)));
MerchantTypeEnums merchantType = MerchantTypeEnums.getByCode(event.getBizCode());
switch (merchantType) {
case BRAND:
brandMerchantService.callback(event);
break;
default:
break;
}
} catch (Exception e) {
log.error("merchant event callback process fail {}", JSON.toJSONString(event));
}
}
}
package com.jiejing.fitness.finance.service.merchant; package com.jiejing.fitness.finance.service.merchant;
import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams; import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams;
import com.jiejing.paycenter.common.event.MerchantEvent;
/** /**
* 品牌商户服务 * 品牌商户服务
...@@ -17,4 +18,11 @@ public interface BrandMerchantService { ...@@ -17,4 +18,11 @@ public interface BrandMerchantService {
*/ */
void apply(ApplyBrandMerchantParams params); void apply(ApplyBrandMerchantParams params);
/**
* 进件申请回调
*
* @param event 事件
*/
void callback(MerchantEvent event);
} }
...@@ -2,12 +2,16 @@ package com.jiejing.fitness.finance.service.merchant.convert; ...@@ -2,12 +2,16 @@ package com.jiejing.fitness.finance.service.merchant.convert;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.jiejing.common.utils.convert.BeanUtil;
import com.jiejing.common.utils.crypt.AesUtil; import com.jiejing.common.utils.crypt.AesUtil;
import com.jiejing.filecenter.api.resource.vo.ResourceInfoVO; import com.jiejing.filecenter.api.resource.vo.ResourceInfoVO;
import com.jiejing.fitness.finance.api.enums.ApplyTypeEnums; import com.jiejing.fitness.finance.api.enums.ApplyTypeEnums;
import com.jiejing.fitness.finance.repository.entity.BrandMerchant;
import com.jiejing.fitness.finance.repository.entity.BrandMerchantApply; import com.jiejing.fitness.finance.repository.entity.BrandMerchantApply;
import com.jiejing.fitness.finance.service.enums.MerchantTypeEnums;
import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams; import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams;
import com.jiejing.paycenter.api.merchant.request.ApplyMerchantRequest; import com.jiejing.paycenter.api.merchant.request.ApplyMerchantRequest;
import com.jiejing.paycenter.api.merchant.request.OpenSingleSubChannelRequest;
import com.jiejing.paycenter.api.merchant.request.UploadRequest; import com.jiejing.paycenter.api.merchant.request.UploadRequest;
import com.jiejing.paycenter.common.enums.common.OpenStateEnums; import com.jiejing.paycenter.common.enums.common.OpenStateEnums;
import com.jiejing.paycenter.common.enums.merchant.BusinessTypeEnums; import com.jiejing.paycenter.common.enums.merchant.BusinessTypeEnums;
...@@ -16,17 +20,24 @@ import com.jiejing.paycenter.common.enums.merchant.MccEnums; ...@@ -16,17 +20,24 @@ import com.jiejing.paycenter.common.enums.merchant.MccEnums;
import com.jiejing.paycenter.common.enums.merchant.PaySceneEnums; import com.jiejing.paycenter.common.enums.merchant.PaySceneEnums;
import com.jiejing.paycenter.common.enums.merchant.ResourceTypeEnums; import com.jiejing.paycenter.common.enums.merchant.ResourceTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.SceneTypeEnums; import com.jiejing.paycenter.common.enums.merchant.SceneTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.SubChannelAuthTypeEnums;
import com.jiejing.paycenter.common.event.MerchantEvent;
import com.jiejing.paycenter.common.model.Address; import com.jiejing.paycenter.common.model.Address;
import com.jiejing.paycenter.common.model.BankCard; import com.jiejing.paycenter.common.model.BankCard;
import com.jiejing.paycenter.common.model.BusinessInfo; import com.jiejing.paycenter.common.model.BusinessInfo;
import com.jiejing.paycenter.common.model.Contact; import com.jiejing.paycenter.common.model.Contact;
import com.jiejing.paycenter.common.model.Legal; import com.jiejing.paycenter.common.model.Legal;
import com.jiejing.paycenter.common.model.License; import com.jiejing.paycenter.common.model.License;
import com.jiejing.paycenter.common.model.SubChannelAuthInfo;
import com.jiejing.paycenter.common.model.SubChannelInfo; import com.jiejing.paycenter.common.model.SubChannelInfo;
import com.jiejing.studio.api.studio.vo.StudioVO; import com.jiejing.studio.api.studio.vo.StudioVO;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date; 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;
/** /**
* @author chengyubing * @author chengyubing
...@@ -38,15 +49,19 @@ public class MerchantConvert { ...@@ -38,15 +49,19 @@ public class MerchantConvert {
private final static BigDecimal WX_OFFLINE_FEE_RATE = new BigDecimal("0.38"); private final static BigDecimal WX_OFFLINE_FEE_RATE = new BigDecimal("0.38");
private final static List<SubChannelInfo> DEFAULT_SUB_CHANNELS = Lists.newArrayList( private final static List<OpenSingleSubChannelRequest> DEFAULT_SUB_CHANNELS = Lists.newArrayList(
SubChannelInfo.builder().scene(PaySceneEnums.ALI_OFFLINE).feeRate(ALI_OFFLINE_FEE_RATE).build(), OpenSingleSubChannelRequest.builder().scene(PaySceneEnums.ALI_OFFLINE).feeRate(ALI_OFFLINE_FEE_RATE)
SubChannelInfo.builder().scene(PaySceneEnums.WX_OFFLINE_OFFICIAL).feeRate(WX_OFFLINE_FEE_RATE).build(), .build(),
SubChannelInfo.builder().scene(PaySceneEnums.WX_OFFLINE_MINI).feeRate(WX_OFFLINE_FEE_RATE).build() OpenSingleSubChannelRequest.builder().scene(PaySceneEnums.WX_GZH_OFFLINE).feeRate(WX_OFFLINE_FEE_RATE)
.build(),
OpenSingleSubChannelRequest.builder().scene(PaySceneEnums.WX_XCX_OFFLINE).feeRate(WX_OFFLINE_FEE_RATE)
.build()
); );
public static ApplyMerchantRequest convertRequest(String channelNo, String applyNo, Long partyId, public static ApplyMerchantRequest convertRequest(String channelNo, String applyNo,
ApplyBrandMerchantParams params) { ApplyBrandMerchantParams params) {
return ApplyMerchantRequest.builder() return ApplyMerchantRequest.builder()
.bizCode(MerchantTypeEnums.BRAND.getCode())
.applyNo(applyNo) .applyNo(applyNo)
.channelNo(channelNo) .channelNo(channelNo)
.companyType(params.getCompanyType()) .companyType(params.getCompanyType())
...@@ -225,4 +240,180 @@ public class MerchantConvert { ...@@ -225,4 +240,180 @@ public class MerchantConvert {
.build(); .build();
} }
public static BrandMerchantApply convertApply(BrandMerchantApply apply, MerchantEvent event) {
// 品牌商户规则:微信线下公众号、微信线下小程序、支付宝线下通道全部开通成功才算成功
Map<PaySceneEnums, SubChannelInfo> channelMap = convertSubChannelMap(event.getSubChannels());
OpenStateEnums state = convertOpenState(channelMap);
String openFailMessage = OpenStateEnums.FAIL == state ? convertFailMessage(event.getSubChannels()) : null;
SubChannelInfo ali = channelMap.get(PaySceneEnums.ALI_OFFLINE);
SubChannelInfo wxGzhOffline = channelMap.get(PaySceneEnums.WX_GZH_OFFLINE);
OpenStateEnums wxOfflineState = convertWxOfflineState(channelMap);
String wxOfflineFailMessage = convertWxOfflineFailMessage(channelMap);
return BrandMerchantApply.builder()
.id(apply.getId())
.brandId(apply.getBrandId())
.studioId(apply.getStudioId())
.applyNo(apply.getApplyNo())
.applyType(apply.getApplyType())
.channelNo(apply.getChannelNo())
.merchantId(event.getMerchantId())
.merchantNo(event.getMerchantNo())
.merchantName(event.getMerchantName())
.shortName(event.getShortName())
.companyType(event.getCompanyType())
.openState(state)
.openFailMessage(openFailMessage)
.aliOpenState(ali.getOpenState())
.aliAuthState(convertAliAuthState(event.getSubChannelAuths()))
.aliMerchantNo(JSON.toJSONString(ali.getSubMerchantNos()))
.aliOpenFailMessage(ali.getFailMessage())
.wxOfflineOpenState(wxOfflineState)
.wxOfflineMerchantNo(JSON.toJSONString(wxGzhOffline.getSubMerchantNos()))
.wxOfflineAuthState(convertWxOfflineAuthState(event.getSubChannelAuths()))
.wxOfflineOpenFailMessage(wxOfflineFailMessage)
.businessProvince(event.getBusiness().getBusinessAddress().getProvince())
.businessCity(event.getBusiness().getBusinessAddress().getCity())
.businessDistrict(event.getBusiness().getBusinessAddress().getDistrict())
.businessAddress(event.getBusiness().getBusinessAddress().getAddress())
.licenseCode(event.getLicense().getLicenseCode())
.licenseExpireType(event.getLicense().getLicenseExpireType())
.licenseStartDate(event.getLicense().getLicenseStartDate())
.licenseEndDate(event.getLicense().getLicenseEndDate())
.licenseBusinessScope(event.getLicense().getBusinessScope())
.licenseFoundDate(event.getLicense().getFoundDate())
.licenseProvince(event.getLicense().getLicenseAddress().getProvince())
.licenseCity(event.getLicense().getLicenseAddress().getCity())
.licenseDistrict(event.getLicense().getLicenseAddress().getDistrict())
.licenseAddress(event.getLicense().getLicenseAddress().getAddress())
.legalName(event.getLegal().getLegalName())
.legalCertNo(event.getLegal().getLegalCertNo())
.legalCertType(event.getLegal().getLegalCertType())
.legalCertExpireType(event.getLegal().getLegalCertExpireType())
.legalCertStartDate(event.getLegal().getLegalCertStartDate())
.legalCertEndDate(event.getLegal().getLegalCertEndDate())
.legalPhone(event.getLegal().getLegalPhone())
.legalProvince(event.getLegal().getLegalAddress().getProvince())
.legalCity(event.getLegal().getLegalAddress().getCity())
.legalDistrict(event.getLegal().getLegalAddress().getDistrict())
.legalAddress(event.getLegal().getLegalAddress().getAddress())
.contactEmail(event.getContact().getContactEmail())
.bankCardType(event.getBankCard().getCardType())
.bankCardNo(event.getBankCard().getCardNo())
.bankCardName(event.getBankCard().getCardName())
.bankPhone(event.getBankCard().getPhone())
.bankCertNo(event.getBankCard().getCertNo())
.bankCertType(event.getBankCard().getCertType())
.bankCertExpireType(event.getBankCard().getCertExpireType())
.bankCertStartDate(event.getBankCard().getCertStartDate())
.bankCertEndDate(event.getBankCard().getCertEndDate())
.bankBaseDepositNo(event.getBankCard().getBaseDepositNo())
.bankCode(event.getBankCard().getBankCode())
.bankName(event.getBankCard().getBankName())
.bankBranchName(event.getBankCard().getBranchName())
.bankBranchCode(event.getBankCard().getBranchCode())
.bankCardProvince(event.getBankCard().getCardAddress().getProvince())
.bankCardCity(event.getBankCard().getCardAddress().getCity())
.bankCardDistrict(event.getBankCard().getCardAddress().getDistrict())
.bankCardAddress(event.getBankCard().getCardAddress().getAddress())
.resourceInfo(JSON.toJSONString(event.getResourceMap()))
.finishTime(OpenStateEnums.SUCCESS == state ? new Date() : null)
.updateTime(new Date())
.build();
}
private static OpenStateEnums convertWxOfflineAuthState(List<SubChannelAuthInfo> auths) {
return auths.stream()
.filter(e -> e.getAuthType() == SubChannelAuthTypeEnums.WX_OFFLINE)
.findFirst()
.map(SubChannelAuthInfo::getAuthState)
.orElse(null);
}
private static OpenStateEnums convertAliAuthState(List<SubChannelAuthInfo> auths) {
return auths.stream()
.filter(e -> e.getAuthType() == SubChannelAuthTypeEnums.ALI_OFFLINE)
.findFirst()
.map(SubChannelAuthInfo::getAuthState)
.orElse(null);
}
private static String convertWxOfflineFailMessage(Map<PaySceneEnums, SubChannelInfo> channelMap) {
SubChannelInfo wxGzhOffline = channelMap.get(PaySceneEnums.WX_GZH_OFFLINE);
SubChannelInfo wxXcxOffline = channelMap.get(PaySceneEnums.WX_XCX_OFFLINE);
if (OpenStateEnums.FAIL == wxGzhOffline.getOpenState()) {
return wxGzhOffline.getFailMessage();
}
if (OpenStateEnums.FAIL == wxXcxOffline.getOpenState()) {
return wxXcxOffline.getFailMessage();
}
return null;
}
private static OpenStateEnums convertWxOfflineState(Map<PaySceneEnums, SubChannelInfo> channelMap) {
SubChannelInfo wxGzhOffline = channelMap.get(PaySceneEnums.WX_GZH_OFFLINE);
SubChannelInfo wxXcxOffline = channelMap.get(PaySceneEnums.WX_XCX_OFFLINE);
if (OpenStateEnums.SUCCESS == wxGzhOffline.getOpenState()
&& OpenStateEnums.SUCCESS == wxXcxOffline.getOpenState()) {
return OpenStateEnums.SUCCESS;
}
if (OpenStateEnums.FAIL == wxGzhOffline.getOpenState()) {
return OpenStateEnums.FAIL;
}
if (OpenStateEnums.FAIL == wxXcxOffline.getOpenState()) {
return OpenStateEnums.FAIL;
}
return OpenStateEnums.PROCESS;
}
private static String convertFailMessage(List<SubChannelInfo> subChannels) {
return subChannels.stream()
.filter(e -> OpenStateEnums.FAIL == e.getOpenState())
.map(SubChannelInfo::getFailMessage)
.findFirst()
.orElse(null);
}
private static OpenStateEnums convertOpenState(Map<PaySceneEnums, SubChannelInfo> channelMap) {
List<PaySceneEnums> sceneList = getDefaultScene();
OpenStateEnums state = OpenStateEnums.SUCCESS;
for (PaySceneEnums scene : sceneList) {
SubChannelInfo subChannel = channelMap.get(scene);
if (OpenStateEnums.PROCESS == subChannel.getOpenState()) {
state = OpenStateEnums.PROCESS;
}
if (OpenStateEnums.FAIL == subChannel.getOpenState()) {
return OpenStateEnums.FAIL;
}
}
return state;
}
private static Map<PaySceneEnums, SubChannelInfo> convertSubChannelMap(List<SubChannelInfo> subChannels) {
Map<PaySceneEnums, SubChannelInfo> map = subChannels.stream()
.collect(Collectors.toMap(SubChannelInfo::getScene, e -> e));
for (OpenSingleSubChannelRequest defaultSubChannel : DEFAULT_SUB_CHANNELS) {
if (null == map.get(defaultSubChannel.getScene())) {
map.put(defaultSubChannel.getScene(),
SubChannelInfo.builder().scene(defaultSubChannel.getScene()).openState(OpenStateEnums.PROCESS)
.build());
}
}
return map;
}
public static List<PaySceneEnums> getDefaultScene() {
return DEFAULT_SUB_CHANNELS.stream().map(OpenSingleSubChannelRequest::getScene)
.collect(Collectors.toList());
}
public static BrandMerchant convertMerchant(BrandMerchantApply apply) {
BrandMerchant merchant = BeanUtil.map(apply, BrandMerchant.class);
merchant.setId(apply.getMerchantId());
merchant.setCreateTime(new Date());
merchant.setUpdateTime(new Date());
return merchant;
}
} }
package com.jiejing.fitness.finance.service.merchant.impl; package com.jiejing.fitness.finance.service.merchant.impl;
import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.jiejing.common.exception.BizException;
import com.jiejing.filecenter.api.resource.vo.ResourceInfoVO; import com.jiejing.filecenter.api.resource.vo.ResourceInfoVO;
import com.jiejing.fitness.finance.repository.entity.BrandMerchant;
import com.jiejing.fitness.finance.repository.entity.BrandMerchantApply; import com.jiejing.fitness.finance.repository.entity.BrandMerchantApply;
import com.jiejing.fitness.finance.repository.service.BrandMerchantApplyRpService; import com.jiejing.fitness.finance.repository.service.BrandMerchantApplyRpService;
import com.jiejing.fitness.finance.repository.service.BrandMerchantRpService;
import com.jiejing.fitness.finance.service.enums.FinanceErrorEnums;
import com.jiejing.fitness.finance.service.merchant.BrandMerchantService; import com.jiejing.fitness.finance.service.merchant.BrandMerchantService;
import com.jiejing.fitness.finance.service.merchant.convert.MerchantConvert; import com.jiejing.fitness.finance.service.merchant.convert.MerchantConvert;
import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams; import com.jiejing.fitness.finance.service.merchant.params.ApplyBrandMerchantParams;
...@@ -11,6 +15,7 @@ import com.jiejing.fitness.finance.service.rpc.MerchantRpcService; ...@@ -11,6 +15,7 @@ import com.jiejing.fitness.finance.service.rpc.MerchantRpcService;
import com.jiejing.fitness.finance.service.rpc.ResourceRpcService; import com.jiejing.fitness.finance.service.rpc.ResourceRpcService;
import com.jiejing.fitness.finance.service.rpc.StudioRpcService; import com.jiejing.fitness.finance.service.rpc.StudioRpcService;
import com.jiejing.paycenter.common.enums.common.OpenStateEnums; import com.jiejing.paycenter.common.enums.common.OpenStateEnums;
import com.jiejing.paycenter.common.event.MerchantEvent;
import com.jiejing.paycenter.common.model.ResourceInfo; import com.jiejing.paycenter.common.model.ResourceInfo;
import com.jiejing.studio.api.studio.vo.StudioVO; import com.jiejing.studio.api.studio.vo.StudioVO;
import java.util.List; import java.util.List;
...@@ -22,6 +27,8 @@ import lombok.extern.slf4j.Slf4j; ...@@ -22,6 +27,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 品牌商户服务 * 品牌商户服务
...@@ -48,6 +55,10 @@ public class BrandMerchantServiceImpl implements BrandMerchantService { ...@@ -48,6 +55,10 @@ public class BrandMerchantServiceImpl implements BrandMerchantService {
@Resource @Resource
private BrandMerchantApplyRpService brandMerchantApplyRpService; private BrandMerchantApplyRpService brandMerchantApplyRpService;
@Resource
private BrandMerchantRpService brandMerchantRpService;
@Async(value = "financeThreadPool") @Async(value = "financeThreadPool")
@Override @Override
public void apply(ApplyBrandMerchantParams params) { public void apply(ApplyBrandMerchantParams params) {
...@@ -63,15 +74,52 @@ public class BrandMerchantServiceImpl implements BrandMerchantService { ...@@ -63,15 +74,52 @@ public class BrandMerchantServiceImpl implements BrandMerchantService {
try { try {
this.upload(params); this.upload(params);
merchantRpcService.apply(MerchantConvert.convertRequest(channel, apply.getApplyNo(), merchantRpcService.apply(MerchantConvert.convertRequest(channel, apply.getApplyNo(), params));
studio.getBrandId(), params));
} catch (Exception e) { } catch (Exception e) {
brandMerchantApplyRpService.updateById( log.error("apply brand merchant fail {}, brand id = {}, studio id = {}", id, studio.getBrandId(),
BrandMerchantApply.builder().id(id).openState(OpenStateEnums.FAIL) params.getStudioId(), e);
.openFailMessage(e.getMessage()).build()); this.doOpenMerchantFail(id, e.getMessage());
return;
} }
this.doOpenMerchantProcess(id);
}
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Override
public void callback(MerchantEvent event) {
switch (event.getState()) {
case PROCESS:
this.doOpenMerchantProcess(Long.parseLong(event.getApplyNo()));
break;
case FAIL:
this.doOpenMerchantFail(Long.parseLong(event.getApplyNo()), event.getFailMessage());
break;
case SUCCESS:
this.doOpenMerchantSuccess(event);
break;
default:
break;
}
}
private void doOpenMerchantSuccess(MerchantEvent event) {
BrandMerchantApply apply = brandMerchantApplyRpService.getByIdForUpdate(
Long.parseLong(event.getApplyNo())).orElseThrow(() -> new BizException(FinanceErrorEnums.NOT_EXIST));
BrandMerchantApply applyToModify = MerchantConvert.convertApply(apply, event);
if (OpenStateEnums.SUCCESS == applyToModify.getOpenState()) {
// 所有子通道全部开通成功
BrandMerchant exist = brandMerchantRpService.getByBrandId(apply.getBrandId());
if (null == exist) {
brandMerchantRpService.insert(MerchantConvert.convertMerchant(apply));
} else {
brandMerchantRpService.updateById(MerchantConvert.convertMerchant(apply));
}
}
brandMerchantApplyRpService.updateById(applyToModify);
} }
private void upload(ApplyBrandMerchantParams params) { private void upload(ApplyBrandMerchantParams params) {
...@@ -96,4 +144,15 @@ public class BrandMerchantServiceImpl implements BrandMerchantService { ...@@ -96,4 +144,15 @@ public class BrandMerchantServiceImpl implements BrandMerchantService {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private void doOpenMerchantFail(Long id, String failMessage) {
brandMerchantApplyRpService.updateById(
BrandMerchantApply.builder().id(id).openState(OpenStateEnums.FAIL)
.openFailMessage(failMessage).build());
}
private void doOpenMerchantProcess(Long id) {
brandMerchantApplyRpService.updateById(
BrandMerchantApply.builder().id(id).openState(OpenStateEnums.PROCESS).build());
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment