入驻代理商的增强

This commit is contained in:
Jack 2025-10-15 01:18:10 +08:00
parent abb9d189d9
commit a81711fa25
8 changed files with 169 additions and 18 deletions

View File

@ -41,6 +41,7 @@ public class LklLedgerReceiver implements Serializable {
private String contact_mobile;
private String license_no;
private String license_name;
private String license_district_id;
private String legal_person_name;
private String legal_person_certificate_type;
private String legal_person_certificate_no;
@ -55,6 +56,8 @@ public class LklLedgerReceiver implements Serializable {
private String attach_list;
private String settle_type;
private Long platform_id;
private Long parent_id;
private String supplier_id;
private Integer level;
private BigDecimal split_ratio;
private Integer shipping_fee;

View File

@ -44,7 +44,7 @@ public class EsignController extends BaseControllerImpl {
@RequestMapping(value = "/testcase", method = RequestMethod.POST)
public Object testCase() {
//return esignContractFillingFileService.fillDocTemplate("13128997057", "91450881MADEQ92533");
return esignPlatformInfoService.getDistributorAndPlatformByIds(1L);
return esignPlatformInfoService.selectAgentAndPlatformByMchId(1L);
}
@ApiOperation(value = "管理员发起签署电子合同流程", notes = "基于文件发起签署电子合同")

View File

@ -32,7 +32,7 @@ public interface EsignPlatformInfoService {
* @param mchId
* @return
*/
List<EsignPlatformInfo> getDistributorAndPlatformByIds(Long mchId);
List<EsignPlatformInfo> selectAgentAndPlatformByMchId(Long mchId);
/**
* 根据分类和营业执照号获取平台方信息

View File

@ -70,7 +70,7 @@ public class EsignPlatformInfoServiceImpl extends BaseServiceImpl<EsignPlatformI
* @return List<EsignPlatformInfo> 平台方和代理商信息列表
*/
@Override
public List<EsignPlatformInfo> getDistributorAndPlatformByIds(Long mchId) {
public List<EsignPlatformInfo> selectAgentAndPlatformByMchId(Long mchId) {
// 获取平台方记录
QueryWrapper<EsignPlatformInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("level", 0)

View File

@ -99,4 +99,20 @@ public interface LklLedgerReceiverService extends IBaseService<LklLedgerReceiver
* @return
*/
Long countByCondition(String LicenseNo, String ContactMobile, Long platformId);
/**
* 根据入驻编号获取平台和代理商接收方信息
*
* @param mchId
* @return
*/
List<LklLedgerReceiver> selectAgentAndPlatformByMchId(Long mchId);
/**
* 根据入驻编号获取商户的二级代理接收方信息
*
* @param mchId
* @return
*/
LklLedgerReceiver getMch2ndAgent(Long mchId);
}

View File

@ -1503,7 +1503,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
* <p>参考https://o.lakala.com/#/home/document/detail?id=386
* 为商户绑定分账接收方包括平台方和代理商如有
*
* @param paramsJSON 包含绑定参数的JSON对象 {merCupNo}
* @param paramsJSON 包含绑定参数的JSON对象 {merCupNo, merInnerNo}
* @return Pair对象第一个元素表示操作是否成功第二个元素为操作结果信息
*/
public Pair<Boolean, String> innerApplyLedgerMerReceiverBind(JSONObject paramsJSON) {
@ -1532,6 +1532,8 @@ public class LakalaApiServiceImpl implements LakalaApiService {
return Pair.of(false, "商户入驻记录不存在");
}
Long mchId = shopMchEntry.getId();
// 进件记录
log.debug("开始查询分账业务申请记录,商户号: {}", merCupNo);
LklLedgerMember lklLedgerMember = lklLedgerMemberService.getByMerCupNo(merCupNo);
@ -1548,7 +1550,7 @@ public class LakalaApiServiceImpl implements LakalaApiService {
// 分账接收方列表
log.debug("开始查询分账接收方列表");
List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.selectPlatformAnDistributorList();
List<LklLedgerReceiver> receiverList = lklLedgerReceiverService.selectAgentAndPlatformByMchId(mchId);
if (CollectionUtil.isEmpty(receiverList)) {
log.warn("商家绑定分账接收方申请失败:分账接收方信息为空");
return Pair.of(false, "分账接收方信息为空");
@ -1652,7 +1654,11 @@ public class LakalaApiServiceImpl implements LakalaApiService {
paramsJSON.set("ret_url", retUrl);
paramsJSON.set("remark", respJson.getStr("retMsg"));
paramsJSON.set("platform_id", receiver.getPlatform_id());
paramsJSON.set("mch_id", shopMchEntry.getId());
paramsJSON.set("mch_id", mchId);
paramsJSON.set("level", receiver.getLevel());
paramsJSON.set("split_ratio", receiver.getSplit_ratio());
paramsJSON.set("shipping_fee", receiver.getShipping_fee());
// 转换JSON键名格式并保存
String snakeJson = StringUtils.convertCamelToSnake(paramsJSON.toString());

View File

@ -19,6 +19,8 @@ import com.suisung.mall.common.api.ResultCode;
import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.modules.esign.EsignPlatformInfo;
import com.suisung.mall.common.modules.lakala.LklLedgerReceiver;
import com.suisung.mall.common.modules.store.ShopMchEntry;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.esign.service.EsignPlatformInfoService;
import com.suisung.mall.shop.lakala.mapper.LklLedgerReceiverMapper;
@ -32,6 +34,7 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
@Slf4j
@ -143,7 +146,7 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
public JSONArray buildApplyLedgerReceiverReqParams(Long mchId) {
// 获取平台记录和代理商记录
List<EsignPlatformInfo> esignPlatformInfoList = esignPlatformInfoService.getDistributorAndPlatformByIds(mchId);
List<EsignPlatformInfo> esignPlatformInfoList = esignPlatformInfoService.selectAgentAndPlatformByMchId(mchId);
if (CollectionUtil.isEmpty(esignPlatformInfoList)) {
return null;
}
@ -166,6 +169,11 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
reqParam.put("legalPersonCertificateType", "17");
reqParam.put("legalPersonCertificateNo", esignPlatformInfo.getLegal_person_id_card());
reqParam.put("level", esignPlatformInfo.getLevel());
reqParam.put("splitRatio", esignPlatformInfo.getSplit_ratio());
reqParam.put("shippingFee", esignPlatformInfo.getShipping_fee());
reqParam.put("parentId", CheckUtil.isEmpty(esignPlatformInfo.getParent_id()) ? 0L : esignPlatformInfo.getParent_id());
reqParam.put("acctNo", esignPlatformInfo.getRec_acc_card_no());
reqParam.put("acctName", esignPlatformInfo.getRec_acc_bank_name());
reqParam.put("acctTypeCode", "57");
@ -218,18 +226,20 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
*/
@Override
public Boolean innerApplyLedgerReceiver(Long mchId, String merCupNo) {
// 接收方至少有一个平台方
JSONArray buildApplyLedgerReceiverReqParams = buildApplyLedgerReceiverReqParams(mchId);
// 商户的分账接收方平台+代理商
JSONArray platformAndAgentReceiver = buildApplyLedgerReceiverReqParams(mchId);
if (buildApplyLedgerReceiverReqParams == null || buildApplyLedgerReceiverReqParams.isEmpty()) {
if (platformAndAgentReceiver == null || platformAndAgentReceiver.isEmpty()) {
log.error("先新增平台或代理商信息");
return false;
}
int successCnt = 0;
for (JSONObject reqParam : buildApplyLedgerReceiverReqParams.jsonIter()) {
log.debug("申请分账接收方参数:{}", reqParam.toString());
reqParam.put("mchId", mchId); // 附加入驻商户自增ID
for (JSONObject reqParam : platformAndAgentReceiver.jsonIter()) {
log.debug("申请分账接收方参数:{}", reqParam);
reqParam.put("mchId", mchId); // 附加入驻商户编号
// 向拉卡拉申请分账接收方
CommonResult result = lakalaApiService.applyLedgerReceiver(reqParam);
if (result == null || result.getStatus() != ResultCode.SUCCESS.getStatus()) {
log.error("申请分账接收方失败:{}", result.getMsg());
@ -355,4 +365,121 @@ public class LklLedgerReceiverServiceImpl extends BaseServiceImpl<LklLedgerRecei
return count(queryWrapper);
}
/**
* 根据入驻编号获取平台和代理商接收方信息
*
* @param mchId
* @return
*/
@Override
public List<LklLedgerReceiver> selectAgentAndPlatformByMchId(Long mchId) {
// 获取平台方记录
QueryWrapper<LklLedgerReceiver> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("level", 0)
.eq("status", CommonConstant.Enable).orderByAsc("id");
List<LklLedgerReceiver> list = list(queryWrapper);
if (CollectionUtil.isEmpty(list)) {
log.error("[获取平台和代理商信息] 未找到平台方记录, mchId={}", mchId);
return Collections.emptyList();
}
// 获取商户的二级代理
LklLedgerReceiver agent2nd = getMch2ndAgent(mchId);
if (agent2nd == null) {
log.debug("[获取平台和代理商信息] 未找到二级代理商或无需二级代理商, mchId={}", mchId);
return list;
}
list.add(agent2nd);
// 获取一级代理如果存在
if (CheckUtil.isEmpty(agent2nd.getParent_id())) {
log.debug("[获取平台和代理商信息] 二级代理商无上级代理, mchId={}", mchId);
return list;
}
try {
queryWrapper.clear();
queryWrapper.eq("parent_id", agent2nd.getParent_id())
.eq("status", CommonConstant.Enable)
.orderByAsc("id");
LklLedgerReceiver agent1st = findOne(queryWrapper);
if (agent1st != null) {
list.add(agent1st);
} else {
log.warn("[获取平台和代理商信息] 未找到一级代理商, parent_id: {}, mchId: {}", agent2nd.getParent_id(), mchId);
}
} catch (Exception e) {
log.error("[获取平台和代理商信息] 获取一级代理商时发生异常parent_id: {}, mchId: {}", agent2nd.getParent_id(), mchId, e);
}
return list;
}
/**
* 根据入驻编号获取商户的二级代理接收方信息
*
* @param mchId
* @return
*/
@Override
public LklLedgerReceiver getMch2ndAgent(Long mchId) {
// 参数校验
if (CheckUtil.isEmpty(mchId)) {
log.warn("[获取二级代理] 参数校验失败:商户入驻编号为空");
return null;
}
try {
// 获取商户入驻信息
ShopMchEntry shopMchEntry = shopMchEntryService.shopMerchEntryById(mchId);
if (shopMchEntry == null) {
log.warn("[获取二级代理] 未找到商户入驻信息mchId={}", mchId);
return null;
}
// 检查是否有指定的分销商ID或区域信息
if (CheckUtil.isEmpty(shopMchEntry.getDistributor_id()) && StrUtil.isBlank(shopMchEntry.getStore_district())) {
log.debug("[获取二级代理] 商户未指定分销商且无区域信息mchId={}", mchId);
return null;
}
// 构建查询条件
QueryWrapper<LklLedgerReceiver> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("level", CommonConstant.Agent_Level_2nd)
.eq("status", CommonConstant.Enable)
.orderByAsc("id");
// 优先使用指定的分销商ID查询否则使用区域信息查询
if (CheckUtil.isNotEmpty(shopMchEntry.getDistributor_id())) {
queryWrapper.eq("platform_id", shopMchEntry.getDistributor_id());
log.debug("[获取二级代理] 使用指定分销商ID查询distributorId={}", shopMchEntry.getDistributor_id());
} else if (StrUtil.isNotBlank(shopMchEntry.getStore_district())) {
// 运费代理商
queryWrapper.clear();
queryWrapper.eq("level", CommonConstant.Agent_Level_2nd)
.eq("status", CommonConstant.Enable)
.eq("license_district_id", shopMchEntry.getStore_district())
.gt("shipping_fee", 0).ne("supplier_id", "")
.orderByAsc("id");
log.debug("[获取二级代理] 使用区域信息查询districtId={}", shopMchEntry.getStore_district());
}
LklLedgerReceiver result = findOne(queryWrapper);
if (result == null) {
log.info("[获取二级代理] 未找到匹配的二级代理信息mchId={}", mchId);
} else {
log.debug("[获取二级代理] 成功获取二级代理信息receiverNo={}, id={}", result.getReceiver_no(), result.getId());
}
return result;
} catch (Exception e) {
log.error("[获取二级代理] 查询过程中发生异常mchId=" + mchId, e);
return null;
}
}
}

View File

@ -365,7 +365,7 @@ public class LklTkServiceImpl {
&& !StrUtil.hasBlank(shopMchEntry.getLkl_mer_cup_no(), shopMchEntry.getLkl_term_no())) {
// 已经进件过了执行下一步操作
logger.info("商户已进件执行后续操作商户ID: {}", mchId);
registrationMerchantAfterHook(mchId, shopMchEntry.getLkl_mer_cup_no(), shopMchEntry.getDistributor_id());
registrationMerchantAfterHook(mchId, shopMchEntry.getLkl_mer_cup_no());
return Pair.of(true, "请勿重复提交,拉卡拉已进件成功了,准备提交分账业务申请!");
}
@ -709,7 +709,7 @@ public class LklTkServiceImpl {
//密集操作进件审核通过之后要下一步流程操作申请分账业务创建分账接收方
logger.info("开始执行进件后续操作商户ID: {},拉卡拉商户号: {}", mchId, merCupNo);
registrationMerchantAfterHook(mchId, merCupNo, shopMchEntry.getDistributor_id());
registrationMerchantAfterHook(mchId, merCupNo);
logger.info("拉卡拉进件异步通知处理完成商户ID: {}", mchId);
return new JSONObject().set("code", "200").set("message", "处理成功");
@ -725,9 +725,8 @@ public class LklTkServiceImpl {
*
* @param mchId
* @param merCupNo
* @param distributorId
*/
private void registrationMerchantAfterHook(Long mchId, String merCupNo, Long distributorId) {
private void registrationMerchantAfterHook(Long mchId, String merCupNo) {
logger.info("商家进件已成功,下一步申请拉卡拉分账业务,再创建分账接收方!");
// 重要给商家申请分账业务务必检查是否申请过申请过忽略
@ -740,7 +739,7 @@ public class LklTkServiceImpl {
logger.info("申请分账业务已成功,等待拉卡拉审核,准备创建分账接收方!");
}
// 2新增一个接收方记录起码要一个平台方代理商根据入驻信息新增
// 2新增一个接收方记录起码要一个平台方代理商根据入驻商家由哪个代理商邀请而确定是否新增
Boolean genSuccess = lklLedgerReceiverService.innerApplyLedgerReceiver(mchId, merCupNo);
if (!genSuccess) {
logger.error("进件、申请分账业务成功已成功,等待拉卡拉审核分账业务请求,但创建分账接收方失败了,请管理员补偿流程");