Explorar el Código

1、转账查询

billisme hace 4 años
padre
commit
792873486c
Se han modificado 56 ficheros con 1221 adiciones y 108 borrados
  1. 16 0
      src/main/java/org/springblade/common/constant/SystemConstant.java
  2. 12 0
      src/main/java/org/springblade/modules/guosen/bankcode/controller/BankCodeController.java
  3. 4 0
      src/main/java/org/springblade/modules/guosen/bankcode/service/IBankCodeService.java
  4. 11 0
      src/main/java/org/springblade/modules/guosen/bankcode/service/impl/BankCodeServiceImpl.java
  5. 4 2
      src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessBonusRecordsController.java
  6. 30 1
      src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessController.java
  7. 17 0
      src/main/java/org/springblade/modules/guosen/bussiness/entity/Bussiness.java
  8. 3 0
      src/main/java/org/springblade/modules/guosen/bussiness/mapper/BussinessMapper.xml
  9. 3 0
      src/main/java/org/springblade/modules/guosen/bussiness/service/IBussinessService.java
  10. 10 4
      src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessDebitRequestServiceImpl.java
  11. 10 0
      src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessServiceImpl.java
  12. 4 0
      src/main/java/org/springblade/modules/guosen/bussinessInfo/controller/BussinessInfoController.java
  13. 3 0
      src/main/java/org/springblade/modules/guosen/bussinessInfo/entity/BussinessInfo.java
  14. 1 0
      src/main/java/org/springblade/modules/guosen/bussinessInfo/mapper/BussinessInfoMapper.xml
  15. 2 0
      src/main/java/org/springblade/modules/guosen/bussinessInfo/service/IBussinessInfoService.java
  16. 7 0
      src/main/java/org/springblade/modules/guosen/bussinessInfo/service/impl/BussinessInfoServiceImpl.java
  17. 4 2
      src/main/java/org/springblade/modules/guosen/bussinessRateStrategy/controller/BussinessRateStrategyController.java
  18. 2 2
      src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/controller/BussinessRegisterRequestController.java
  19. 3 2
      src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/service/IBussinessRegisterRequestService.java
  20. 35 29
      src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/service/impl/BussinessRegisterRequestServiceImpl.java
  21. 5 3
      src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/IBussinessTransferOrderService.java
  22. 48 6
      src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/impl/BussinessTransferOrderServiceImpl.java
  23. 7 2
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/controller/BussinessUserInfoController.java
  24. 6 2
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/entity/BussinessUserInfo.java
  25. 2 0
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/mapper/BussinessUserInfoMapper.xml
  26. 2 0
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/IBussinessUserInfoService.java
  27. 7 0
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/impl/BussinessUserInfoServiceImpl.java
  28. 58 1
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/controller/BussinessUserWithdrawController.java
  29. 15 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/dto/WithdrawTransferOrder.java
  30. 4 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/entity/BussinessUserWithdraw.java
  31. 5 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/IBussinessUserWithdrawService.java
  32. 114 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/impl/BussinessUserWithdrawServiceImpl.java
  33. 169 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/controller/ProductRateStrategyController.java
  34. 12 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/dto/ProductRateDTO.java
  35. 38 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/dto/ProductRateStrategyDTO.java
  36. 58 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/entity/ProductRateStrategy.java
  37. 42 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/mapper/ProductRateStrategyMapper.java
  38. 25 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/mapper/ProductRateStrategyMapper.xml
  39. 45 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/service/IProductRateStrategyService.java
  40. 80 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/service/impl/ProductRateStrategyServiceImpl.java
  41. 41 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/vo/ProductRateStrategyVO.java
  42. 44 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/vo/SimpleProductRateStrategyVO.java
  43. 49 0
      src/main/java/org/springblade/modules/guosen/productratestrategy/wrapper/ProductRateStrategyWrapper.java
  44. 1 1
      src/main/java/org/springblade/modules/guosen/userActivityStatistical/service/impl/UserActivityStatisticalServiceImpl.java
  45. 6 1
      src/main/java/org/springblade/modules/time/TimeTask.java
  46. 1 0
      src/main/java/org/springblade/yeePay/common/YeePayConst.java
  47. 7 2
      src/main/java/org/springblade/yeePay/controller/BussinessPayController.java
  48. 2 2
      src/main/java/org/springblade/yeePay/controller/YeePayController.java
  49. 24 0
      src/main/java/org/springblade/yeePay/entity/TransferQueryDto.java
  50. 9 2
      src/main/java/org/springblade/yeePay/listener/RechargeOrderNotifyListener.java
  51. 6 1
      src/main/java/org/springblade/yeePay/listener/RechargeServiceFeeTransferNotifyListener.java
  52. 68 17
      src/main/java/org/springblade/yeePay/listener/TransferOrderNotifyListener.java
  53. 1 1
      src/main/java/org/springblade/yeePay/listener/UserRegisterNotifyListener.java
  54. 10 10
      src/main/java/org/springblade/yeePay/service/BussinessPayService.java
  55. 27 14
      src/main/java/org/springblade/yeePay/service/YeePayService.java
  56. 2 1
      src/main/resources/payConfig.properties

+ 16 - 0
src/main/java/org/springblade/common/constant/SystemConstant.java

@@ -333,4 +333,20 @@ public interface SystemConstant {
 			this.value = value;
 		}
 	}
+
+	/**
+	 * 商户类型
+	 */
+	@Getter
+	enum BussinessType{
+		PLATFORM_MERCHANT("平台商", 10),
+		SETTLED_MERCHANT("入驻商", 20);
+
+		String name;
+		Integer value;
+		BussinessType(String name, Integer value){
+			this.name = name;
+			this.value = value;
+		}
+	}
 }

+ 12 - 0
src/main/java/org/springblade/modules/guosen/bankcode/controller/BankCodeController.java

@@ -34,6 +34,7 @@ import org.springblade.modules.guosen.bankcode.vo.BankCodeVO;
 import org.springblade.modules.guosen.bankcode.service.IBankCodeService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -124,5 +125,16 @@ public class BankCodeController extends BladeController {
 		return R.status(bankCodeService.removeByIds(Func.toLongList(ids)));
 	}
 
+	/**
+	 * 删除
+	 */
+	@GetMapping("/listBankCode")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "获取银行编号列表")
+	public R listBankCode(@RequestParam String name) {
+		List<BankCode> bankCodes = bankCodeService.listBankCode(name);
+		return R.data(bankCodes);
+	}
+
 
 }

+ 4 - 0
src/main/java/org/springblade/modules/guosen/bankcode/service/IBankCodeService.java

@@ -21,6 +21,8 @@ import org.springblade.modules.guosen.bankcode.vo.BankCodeVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.List;
+
 /**
  *  服务类
  *
@@ -38,4 +40,6 @@ public interface IBankCodeService extends IService<BankCode> {
 	 */
 	IPage<BankCodeVO> selectBankCodePage(IPage<BankCodeVO> page, BankCodeVO bankCode);
 
+	List<BankCode> listBankCode(String name);
+
 }

+ 11 - 0
src/main/java/org/springblade/modules/guosen/bankcode/service/impl/BankCodeServiceImpl.java

@@ -16,6 +16,8 @@
  */
 package org.springblade.modules.guosen.bankcode.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.guosen.bankcode.entity.BankCode;
 import org.springblade.modules.guosen.bankcode.vo.BankCodeVO;
 import org.springblade.modules.guosen.bankcode.mapper.BankCodeMapper;
@@ -24,6 +26,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.List;
+
 /**
  *  服务实现类
  *
@@ -38,4 +42,11 @@ public class BankCodeServiceImpl extends ServiceImpl<BankCodeMapper, BankCode> i
 		return page.setRecords(baseMapper.selectBankCodePage(page, bankCode));
 	}
 
+	@Override
+	public List<BankCode> listBankCode(String name) {
+		LambdaQueryWrapper<BankCode> lambda = new LambdaQueryWrapper();
+		lambda.like(StringUtil.isNotBlank(name), BankCode::getName, name);
+		return baseMapper.selectList(lambda);
+	}
+
 }

+ 4 - 2
src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessBonusRecordsController.java

@@ -216,7 +216,9 @@ public class BussinessBonusRecordsController extends BladeController {
 			return R.fail("可分润金额不足以抵扣手续费");
 		}
 		PayOrderDto payOrderDto = this.recordToPayOrder(record);
-		R result = yeePayService.bonusOrder(payOrderDto);
+		Long userInfoId = record.getUserInfoId();
+		BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
+		R result = yeePayService.bonusOrder(payOrderDto, userInfo.getParentMerchantNo());
 		JSONObject data = JSONUtil.parseObj(result.getData());
 		String returnCode = data.getStr("returnCode");
 		String returnMsg = data.getStr("returnMsg");
@@ -363,7 +365,7 @@ public class BussinessBonusRecordsController extends BladeController {
 			return R.fail("该用户未完成进件");
 		}
 
-		R<BussinessTransferOrder> transferOrderR = this.transferOrderService.transferOrder(record.getPrice().add(withdrawFee), yeePayConst.getParentMerchantNo(), userInfo.getMerchantNo(), "FR", "feeChargeSide", SystemConstant.TransferScene.FOR_BONUS_TRANSFER.getValue());
+		R<BussinessTransferOrder> transferOrderR = this.transferOrderService.transferOrder(record.getPrice().add(withdrawFee), yeePayConst.getParentMerchantNo(), userInfo.getMerchantNo(), "FR", "feeChargeSide", SystemConstant.TransferScene.FOR_BONUS_TRANSFER.getValue(), userInfo.getParentMerchantNo());
 		record.setTransferOrderId(transferOrderR.getData().getId());
 		record.setFailReason(transferOrderR.getData().getReturnMsg());
 		if(transferOrderR.isSuccess()){

+ 30 - 1
src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessController.java

@@ -49,6 +49,7 @@ import org.springblade.modules.guosen.bussiness.service.IBussinessService;
 import org.springblade.core.boot.ctrl.BladeController;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -105,11 +106,18 @@ public class BussinessController extends BladeController {
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入bussiness")
 	public R<IPage<BussinessVO>> page(BussinessVO bussiness, Query query) {
+		BladeUser user = AuthUtil.getUser();
+		IPage<Bussiness> pages = null;
 		LambdaQueryWrapper<Bussiness> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.like(StringUtil.isNotBlank(bussiness.getName()), Bussiness::getName, bussiness.getName());
 		lambdaQueryWrapper.eq(bussiness.getEnable() != null, Bussiness::getEnable, bussiness.getEnable());
 		lambdaQueryWrapper.eq(bussiness.getRegisterStatus() != null, Bussiness::getRegisterStatus, bussiness.getRegisterStatus());
-		IPage<Bussiness> pages = bussinessService.page(Condition.getPage(query), lambdaQueryWrapper);
+		lambdaQueryWrapper.eq(Bussiness::getAccountId,user.getUserId());
+		if(Objects.equals(user.getRoleId(), SystemConstant.BUSSINESS_ROLE_ID)){
+			pages= bussinessService.page(Condition.getPage(query), lambdaQueryWrapper);
+		}else{
+			pages = bussinessService.page(Condition.getPage(query), Condition.getQueryWrapper(bussiness));
+		}
 		return R.data(BussinessWrapper.build().pageVO(pages));
 	}
 
@@ -281,4 +289,25 @@ public class BussinessController extends BladeController {
 		return R.status(bussinessService.testSaveOrUpdate(bussiness));
 	}
 
+	/**
+	 * 体验商户新增或修改
+	 */
+	@GetMapping("/getByBussinessType")
+	@ApiOperationSupport(order = 15)
+	@ApiOperation(value = "根据商户类型获取商户", notes = "传入bussiness")
+	public R<List<SimpleBussinessVO>> getByBussinessType(@RequestParam(value = "bussinessType", required = true) Integer bussinessType) {
+		List<Bussiness> list = this.bussinessService.getByBussinessType(bussinessType);
+		List<SimpleBussinessVO> simpleBussinessVOList = list.stream().map(item -> {
+			SimpleBussinessVO vo = new SimpleBussinessVO();
+			vo.setId(item.getId());
+			vo.setName(item.getName());
+			return vo;
+		}).collect(Collectors.toList());
+		if(simpleBussinessVOList != null && simpleBussinessVOList.size() > 0){
+			return R.data(simpleBussinessVOList);
+		}else{
+			return R.data(new ArrayList<>());
+		}
+	}
+
 }

+ 17 - 0
src/main/java/org/springblade/modules/guosen/bussiness/entity/Bussiness.java

@@ -18,6 +18,7 @@ package org.springblade.modules.guosen.bussiness.entity;
 
 import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiOperation;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -145,6 +146,22 @@ public class Bussiness extends BaseEntity {
 	@ApiModelProperty(value = "进件状态")
 	private Integer registerStatus;
 
+	@ApiModelProperty(value = "上级商户")
+	private Long parentBussinessId;
+
+	/**
+	 * 10 平台商
+	 * 20 入驻商
+	 */
+	@ApiModelProperty(value = "商户类型")
+	private Integer bussinessType;
+
+	/**
+	 * 产品策略ID
+	 */
+	@ApiModelProperty(value = "产品策略ID")
+	private Long rateStrategyId;
+
 
 
 

+ 3 - 0
src/main/java/org/springblade/modules/guosen/bussiness/mapper/BussinessMapper.xml

@@ -27,6 +27,9 @@
         <result column="enable" property="enable"/>
         <result column="merchant_no" property="merchantNo"/>
         <result column="register_status" property="registerStatus"/>
+        <result column="parent_bussiness_id" property="parentBussinessId"/>
+        <result column="bussiness_type" property="bussinessType"/>
+        <result column="rate_strategy_id" property="rateStrategyId"/>
     </resultMap>
 
 

+ 3 - 0
src/main/java/org/springblade/modules/guosen/bussiness/service/IBussinessService.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.yeePay.entity.PayOrderDto;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  *  服务类
@@ -67,4 +68,6 @@ public interface IBussinessService extends BaseService<Bussiness> {
 	 */
 	boolean testSaveOrUpdate(Bussiness bussiness);
 
+	List<Bussiness> getByBussinessType(Integer bussinessType);
+
 }

+ 10 - 4
src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessDebitRequestServiceImpl.java

@@ -37,6 +37,8 @@ import org.springblade.modules.guosen.bussiness.vo.BussinessDebitRequestVO;
 import org.springblade.modules.guosen.bussiness.mapper.BussinessDebitRequestMapper;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitRequestService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
 import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
 import org.springblade.modules.guosen.debtDaliyStat.entity.BusinessDeptDaliyStat;
@@ -93,6 +95,8 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 	private IBussinessTransferOrderService bussinessTransferOrderService;
 	@Autowired
 	private BussinessPayService bussinessPayService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 	@Override
 	public IPage<BussinessDebitRequestVO> selectBussinessDebitRequestPage(IPage<BussinessDebitRequestVO> page, BussinessDebitRequestVO bussinessDebitRequest) {
@@ -143,6 +147,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 				}
 			}
 		}
+		BussinessInfo bussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getId());
 		//1、先发起批量子商户转账到平台商户
 		R<BigDecimal> bussinessRemainR = bussinessService.queryBalance(bussiness.getMerchantNo());
 		BigDecimal remain = bussinessRemainR.getData();
@@ -197,7 +202,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 			);
 
 			//从批量中拆分一笔笔代付
-			singlePayByBatch(bussinessDebits, bussiness);
+			singlePayByBatch(bussinessDebits, bussiness, bussinessInfo.getParentMerchantNo());
 
 			return R.status(true);
 		}else{
@@ -217,7 +222,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 		"bankAccountType": "DEBIT_CARD",
 		"bussinessOrderId":"0494843884543"
 	}*/
-	private void singlePayByBatch(List<BussinessDebit> bussinessDebits, Bussiness bussiness){
+	private void singlePayByBatch(List<BussinessDebit> bussinessDebits, Bussiness bussiness, String parentMerchantNo){
 		if(bussinessDebits != null && bussinessDebits.size() > 0) {
 			for (BussinessDebit debit : bussinessDebits) {
 				BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
@@ -231,7 +236,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 				bussinessTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
 				boolean transferSave = bussinessTransferOrderService.save(bussinessTransferOrder);
 				if(transferSave){
-					R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder);
+					R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder, parentMerchantNo);
 					if(transferResult.isSuccess()){
 						debit.setTransferOrderId(bussinessTransferOrder.getId());
 						bussinessDebitService.updateById(debit);
@@ -292,6 +297,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 				}
 			}
 		}
+		BussinessInfo bussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getId());
 		//保存采购商单笔分佣请求对象
 		BussinessDebitRequest bussinessDebitRequest = new BussinessDebitRequest();
 		bussinessDebitRequest.setBussinessId(bussiness.getId());
@@ -308,7 +314,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 			debit.setRequestNo(requestNo);
 			payOrderDto.setRequestNo(requestNo);
 			if(this.bussinessDebitService.save(debit)){
-				R result = this.yeePayService.payOrder(payOrderDto);
+				R result = this.yeePayService.payOrder(payOrderDto, bussinessInfo.getParentMerchantNo());
 				if(result.isSuccess()){
 					JSONObject data = JSONUtil.parseObj(result.getData());
 					String returnCode = data.getStr("returnCode");

+ 10 - 0
src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessServiceImpl.java

@@ -143,6 +143,9 @@ public class BussinessServiceImpl extends BaseServiceImpl<BussinessMapper, Bussi
 			oldEntity.setServiceRate(bussiness.getServiceRate());
 			oldEntity.setMaxLimit(bussiness.getMaxLimit());
 			oldEntity.setLeastPrice(bussiness.getLeastPrice());
+			oldEntity.setBussinessType(bussiness.getBussinessType());
+			oldEntity.setParentBussinessId(bussiness.getParentBussinessId());
+			oldEntity.setRateStrategyId(bussiness.getRateStrategyId());
 			return this.updateById(oldEntity);
 		}
 
@@ -306,6 +309,13 @@ public class BussinessServiceImpl extends BaseServiceImpl<BussinessMapper, Bussi
 		return false;
 	}
 
+	@Override
+	public List<Bussiness> getByBussinessType(Integer bussinessType) {
+		LambdaQueryWrapper<Bussiness> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bussiness::getBussinessType, bussinessType);
+		return baseMapper.selectList(lambdaQueryWrapper);
+	}
+
 
 	private  String generateSecret(){
 		String uuid = UUID.randomUUID().toString();

+ 4 - 0
src/main/java/org/springblade/modules/guosen/bussinessInfo/controller/BussinessInfoController.java

@@ -137,6 +137,10 @@ public class BussinessInfoController extends BladeController {
 		if(StringUtil.isBlank(bussinessInfo.getBusinessRole())){
 			bussinessInfo.setBusinessRole("SETTLED_MERCHANT");
 		}
+		if(bussiness.getParentBussinessId() != null){
+			BussinessInfo parentBussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getParentBussinessId());
+			bussinessInfo.setParentMerchantNo(parentBussinessInfo.getMerchantNo());
+		}
 		boolean save = bussinessInfoService.save(bussinessInfo);
 		if(!save){
 			return R.fail("保存失败");

+ 3 - 0
src/main/java/org/springblade/modules/guosen/bussinessInfo/entity/BussinessInfo.java

@@ -49,6 +49,9 @@ public class BussinessInfo extends BaseEntity {
 	@ApiModelProperty(value = "第三方商户号")
 	private String merchantNo;
 
+	@ApiModelProperty(value = "上级商户号")
+	private String parentMerchantNo;
+
 	/**
 	 * ORDINARY_MERCHANT:标准商户
 	 * PLATFORM_MERCHANT:平台商

+ 1 - 0
src/main/java/org/springblade/modules/guosen/bussinessInfo/mapper/BussinessInfoMapper.xml

@@ -33,6 +33,7 @@
         <result column="agreement_photo_url" property="agreementPhotoUrl"/>
         <result column="system_screenshot_url" property="systemScreenshotUrl"/>
         <result column="special_permit_process_url" property="specialPermitProcessUrl"/>
+        <result column="parent_merchant_no" property="parentMerchantNo"/>
     </resultMap>
 
 

+ 2 - 0
src/main/java/org/springblade/modules/guosen/bussinessInfo/service/IBussinessInfoService.java

@@ -42,4 +42,6 @@ public interface IBussinessInfoService extends BaseService<BussinessInfo> {
 
 	BussinessInfo getByBussinessId(Long bussinessId);
 
+	BussinessInfo getByMerchantNo(String merchantNo);
+
 }

+ 7 - 0
src/main/java/org/springblade/modules/guosen/bussinessInfo/service/impl/BussinessInfoServiceImpl.java

@@ -55,4 +55,11 @@ public class BussinessInfoServiceImpl extends BaseServiceImpl<BussinessInfoMappe
 		return baseMapper.selectOne(lambdaQueryWrapper);
 	}
 
+	@Override
+	public BussinessInfo getByMerchantNo(String merchantNo) {
+		LambdaQueryWrapper<BussinessInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(BussinessInfo::getMerchantNo, merchantNo);
+		return baseMapper.selectOne(lambdaQueryWrapper);
+	}
+
 }

+ 4 - 2
src/main/java/org/springblade/modules/guosen/bussinessRateStrategy/controller/BussinessRateStrategyController.java

@@ -29,6 +29,7 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
 import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -39,6 +40,8 @@ import org.springblade.modules.guosen.bussinessRateStrategy.wrapper.BussinessRat
 import org.springblade.modules.guosen.bussinessRateStrategy.service.IBussinessRateStrategyService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.List;
+
 /**
  *  控制器
  *
@@ -125,7 +128,7 @@ public class BussinessRateStrategyController extends BladeController {
 
 	
 	/**
-	 * 删除 
+	 * 删除
 	 */
 	@PostMapping("/remove")
 	@ApiOperationSupport(order = 7)
@@ -133,6 +136,5 @@ public class BussinessRateStrategyController extends BladeController {
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
 		return R.status(bussinessRateStrategyService.deleteLogic(Func.toLongList(ids)));
 	}
-
 	
 }

+ 2 - 2
src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/controller/BussinessRegisterRequestController.java

@@ -150,7 +150,7 @@ public class BussinessRegisterRequestController extends BladeController {
 		Assert.notNull(dbLegal, "商户法人信息不存在,请先完善法人信息");
 		BussinessContactInfo dbContact = bussinessContactInfoService.getByBussinessInfoId(bussinessRegisterRequest.getBussinessInfoId(), SystemConstant.BussinessContactType.CONTACT.getValue());
 		Assert.notNull(dbContact, "商户联系人信息不存在,请先完善联系人信息");
-		R merchantRegister = bussinessRegisterRequestService.merchantRegister(dbInfo, dbLegal, dbContact, bussinessRegisterRequest);
+		R merchantRegister = bussinessRegisterRequestService.merchantRegister(bussiness, dbInfo, dbLegal, dbContact);
 		return merchantRegister;
 	}
 	
@@ -234,7 +234,7 @@ public class BussinessRegisterRequestController extends BladeController {
 		Assert.notNull(dbLegal, "商户法人信息不存在,请先完善法人信息");
 		BussinessContactInfo dbContact = bussinessContactInfoService.getByBussinessInfoId(bussinessRegisterRequest.getBussinessInfoId(), SystemConstant.BussinessContactType.CONTACT.getValue());
 		Assert.notNull(dbContact, "商户联系人信息不存在,请先完善联系人信息");
-		R merchantRegister = bussinessRegisterRequestService.testMerchantRegister(dbInfo, dbLegal, dbContact, bussinessRegisterRequest);
+		R merchantRegister = bussinessRegisterRequestService.testMerchantRegister(bussiness, dbInfo, dbLegal, dbContact);
 		return merchantRegister;
 	}
 }

+ 3 - 2
src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/service/IBussinessRegisterRequestService.java

@@ -17,6 +17,7 @@
 package org.springblade.modules.guosen.bussinessRegisterRequest.service;
 
 import org.springblade.core.tool.api.R;
+import org.springblade.modules.guosen.bussiness.entity.Bussiness;
 import org.springblade.modules.guosen.bussinessContactInfo.entity.BussinessContactInfo;
 import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
 import org.springblade.modules.guosen.bussinessRegisterRequest.dto.BussinessRegisterProductInfoDTO;
@@ -44,7 +45,7 @@ public interface IBussinessRegisterRequestService extends BaseService<BussinessR
 
     BussinessRegisterRequest getByRequestNo(String requestNo);
 
-    R merchantRegister(BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo, BussinessRegisterRequest bussinessRegisterRequest);
+    R merchantRegister(Bussiness bussiness, BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo);
 
     R userRegister(Long registerRequestId, Long userInfoId);
 
@@ -52,5 +53,5 @@ public interface IBussinessRegisterRequestService extends BaseService<BussinessR
 
 	R productFeeModify(BussinessInfo bussinessInfo, BussinessRegisterProductInfoDTO bussinessRegisterProductInfoDTO);
 
-	R testMerchantRegister(BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo, BussinessRegisterRequest bussinessRegisterRequest);
+	R testMerchantRegister(Bussiness bussiness, BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo);
 }

+ 35 - 29
src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/service/impl/BussinessRegisterRequestServiceImpl.java

@@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springblade.common.constant.SystemConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.modules.guosen.bussiness.entity.Bussiness;
 import org.springblade.modules.guosen.bussinessContactInfo.entity.BussinessContactInfo;
 import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
 import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
@@ -37,6 +38,8 @@ import org.springblade.modules.guosen.bussinessRegisterRequest.service.IBussines
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.modules.guosen.bussinessuserinfo.entity.BussinessUserInfo;
 import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserInfoService;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.service.IProductRateStrategyService;
 import org.springblade.modules.system.entity.DictBiz;
 import org.springblade.modules.system.service.IDictBizService;
 import org.springblade.modules.system.service.IParamService;
@@ -76,6 +79,8 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	private IDictBizService dictBizService;
 	@Autowired
 	private IBussinessUserInfoService userInfoService;
+	@Autowired
+	private IProductRateStrategyService productRateStrategyService;
 
 	@Override
 	public IPage<BussinessRegisterRequestVO> selectBussinessRegisterRequestPage(IPage<BussinessRegisterRequestVO> page, BussinessRegisterRequestVO bussinessRegisterRequest) {
@@ -90,8 +95,10 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	}
 
 	@Override
-	public R merchantRegister(BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo, BussinessRegisterRequest bussinessRegisterRequest) {
+	public R merchantRegister(Bussiness bussiness, BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo) {
 		//上传商户证件照片到第三方、上传商户手持照片到第三方、上传商户开户照片到第三方、上传法人身份证件正面照片、上传法人身份证反面照片
+		BussinessRegisterRequest bussinessRegisterRequest = new BussinessRegisterRequest();
+		ProductRateStrategy rateStrategy = null;
 		try{
 			R licenceUrlR = yeePayService.qualUpload(bussinessInfo.getLicenceUrl());
 			if(licenceUrlR.isSuccess()){
@@ -124,19 +131,16 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 				return R.fail("法人证件反面照上传失败");
 			}
 			//产品资质信息
-			this.handleBussinessInfoProductQual(bussinessRegisterRequest, bussinessInfo);
+			rateStrategy = this.productRateStrategyService.getById(bussiness.getRateStrategyId());
+			this.handleBussinessInfoProductQual(bussinessRegisterRequest, bussinessInfo, rateStrategy.getPaymentScene());
 		}catch (Exception e){
 			bussinessInfo.setRegisterStatus(SystemConstant.BussinessRegisterStatus.SUBMIT_FAIL.getValue());
 			bussinessInfoService.updateById(bussinessInfo);
 			e.printStackTrace();
 			return R.fail("图片上传失败");
 		}
-		List<DictBiz> rateList = dictBizService.getList("yee_product_rate");
-		if(bussinessInfo.getBusinessRole().equals("SETTLED_MERCHANT")){
-			bussinessRegisterRequest.setProductInfo(this.getProductInfo(rateList, false));
-		}else if(bussinessInfo.getBusinessRole().equals("PLATFORM_MERCHANT")){
-			bussinessRegisterRequest.setProductInfo(this.getProductInfo(rateList, true));
-		}
+		bussinessRegisterRequest.setBussinessInfoId(bussinessInfo.getId());
+		bussinessRegisterRequest.setProductInfo(rateStrategy.getProductRateJson());
 		bussinessRegisterRequest.setMerchantSubjectInfo(bussinessInfo.toBusinessInfoString());
 		bussinessRegisterRequest.setMerchantCorporationInfo(legalInfo.toLegalString());
 		bussinessRegisterRequest.setMerchantContactInfo(contactInfo.toContactString());
@@ -149,7 +153,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 
 		if(save){
 			try {
-				R result = yeePayService.merchantRegister(bussinessRegisterRequest);
+				R result = yeePayService.merchantRegister(bussinessRegisterRequest, bussinessInfo.getParentMerchantNo());
 				JSONObject resultData = JSONUtil.parseObj(result.getData());
 				String returnCode = resultData.getStr("returnCode");
 				bussinessRegisterRequest.setApplicationNo(resultData.getStr("applicationNo"));
@@ -190,6 +194,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	@Override
 	public R userRegister(Long registerRequestId, Long userInfoId) {
 		BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
+		ProductRateStrategy rateStrategy = this.productRateStrategyService.getById(userInfo.getRateStrategyId());
 		if(userInfo == null){
 			return R.fail("用户不存在");
 		}else {
@@ -203,13 +208,12 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 			BussinessRegisterRequest bussinessRegisterRequest = this.getById(registerRequestId);
 			bussinessRegisterRequest.setMerchantSubjectInfo(userInfo.toMerchantSubjectInfo());
 			bussinessRegisterRequest.setBusinessAddressInfo(userInfo.toBusinessAddressInfo());
-			this.handleUserProductInfo(userInfo);
 			bussinessRegisterRequest.setMerchantCorporationInfo(userInfo.toMerchantCorporationInfo());
 			bussinessRegisterRequest.setAccountInfo(userInfo.toAccountInfo());
-			List<DictBiz> rateList = dictBizService.getList("yee_product_rate");
-			bussinessRegisterRequest.setProductInfo(this.getUserProductInfo(rateList));
+			bussinessRegisterRequest.setProductInfo(rateStrategy.getProductRateJson());
 			bussinessRegisterRequest.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
-			R result = this.yeePayService.userRegister(bussinessRegisterRequest);
+			this.handleUserProductInfo(userInfo);
+			R result = this.yeePayService.userRegister(bussinessRegisterRequest, userInfo.getParentMerchantNo());
 			JSONObject resultData = JSONUtil.parseObj(result.getData());
 			String returnCode = resultData.getStr("returnCode");
 			bussinessRegisterRequest.setApplicationNo(resultData.getStr("applicationNo"));
@@ -236,6 +240,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	@Override
 	public R userRegisterDebug(Long registerRequestId, Long userInfoId) {
 		BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
+		ProductRateStrategy rateStrategy = this.productRateStrategyService.getById(userInfo.getRateStrategyId());
 		if(userInfo == null){
 			return R.fail("用户不存在");
 		}else {
@@ -254,10 +259,9 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 //			this.handleUserProductInfo(userInfo);
 			bussinessRegisterRequest.setMerchantCorporationInfo(userInfo.toMerchantCorporationInfo());
 			bussinessRegisterRequest.setAccountInfo(userInfo.toAccountInfo());
-			List<DictBiz> rateList = dictBizService.getList("yee_product_rate");
-			bussinessRegisterRequest.setProductInfo(this.getUserProductInfo(rateList));
+			bussinessRegisterRequest.setProductInfo(rateStrategy.getProductRateJson());
 			bussinessRegisterRequest.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
-			R result = this.yeePayService.userRegister(bussinessRegisterRequest);
+			R result = this.yeePayService.userRegister(bussinessRegisterRequest, userInfo.getParentMerchantNo());
 			JSONObject resultData = JSONUtil.parseObj(result.getData());
 			String returnCode = resultData.getStr("returnCode");
 			bussinessRegisterRequest.setApplicationNo(resultData.getStr("applicationNo"));
@@ -297,7 +301,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 				.productInfo(JSONUtil.toJsonStr(bussinessRegisterProductInfoDTO.getProductInfo()))
 				.build();
 		try {
-			R result = this.yeePayService.productFeeModify(productFeeModifyDto);
+			R result = this.yeePayService.productFeeModify(productFeeModifyDto, bussinessInfo.getParentMerchantNo());
 			JSONObject resultData = JSONUtil.parseObj(result.getData());
 			String returnCode = resultData.getStr("returnCode");
 			registerRequest.setApplicationNo(resultData.getStr("applicationNo"));
@@ -329,24 +333,21 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	}
 
 	@Override
-	public R testMerchantRegister(BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo, BussinessRegisterRequest bussinessRegisterRequest) {
+	public R testMerchantRegister(Bussiness bussiness, BussinessInfo bussinessInfo, BussinessContactInfo legalInfo, BussinessContactInfo contactInfo) {
+		BussinessRegisterRequest bussinessRegisterRequest = new BussinessRegisterRequest();
 		bussinessInfo.setThirdLicenceUrl(bussinessInfo.getLicenceUrl());
 		bussinessInfo.setThirdHandLicenceUrl(bussinessInfo.getHandLicenceUrl());
 		bussinessInfo.setThirdOpenAccountLicenceUrl(bussinessInfo.getOpenAccountLicenceUrl());
 		legalInfo.setThirdLegalLicenceFrontUrl(legalInfo.getLegalLicenceFrontUrl());
 		legalInfo.setThirdLegalLicenceBackUrl(legalInfo.getLegalLicenceBackUrl());
 		JSONObject qualData = new JSONObject();
-		qualData.set("paymentScene", "GYSDK");
+		ProductRateStrategy rateStrategy = this.productRateStrategyService.getById(bussiness.getRateStrategyId());
+		qualData.set("paymentScene", rateStrategy.getPaymentScene());
 		qualData.set("agreementPhotoUrl", bussinessInfo.getAgreementPhotoUrl());
 		qualData.set("systemScreenshotUrl", bussinessInfo.getSystemScreenshotUrl());
 		qualData.set("specialPermitProcessUrl", bussinessInfo.getSpecialPermitProcessUrl());
 		bussinessRegisterRequest.setProductQualificationInfo(qualData.toString());
-		List<DictBiz> rateList = dictBizService.getList("yee_product_rate");
-		if(bussinessInfo.getBusinessRole().equals("SETTLED_MERCHANT")){
-			bussinessRegisterRequest.setProductInfo(this.getProductInfo(rateList, false));
-		}else if(bussinessInfo.getBusinessRole().equals("PLATFORM_MERCHANT")){
-			bussinessRegisterRequest.setProductInfo(this.getProductInfo(rateList, true));
-		}
+		bussinessRegisterRequest.setProductInfo(rateStrategy.getProductRateJson());
 		bussinessRegisterRequest.setMerchantSubjectInfo(bussinessInfo.toBusinessInfoString());
 		bussinessRegisterRequest.setMerchantCorporationInfo(legalInfo.toLegalString());
 		bussinessRegisterRequest.setMerchantContactInfo(contactInfo.toContactString());
@@ -401,7 +402,12 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 		}
 	}
 
-	private String getProductInfo(List<DictBiz> rateList, boolean isPlatform){
+	private String getProductInfo(Long rateStrategyId){
+		ProductRateStrategy rateStrategy = this.productRateStrategyService.getById(rateStrategyId);
+		return rateStrategy.getProductRateJson();
+	}
+
+	/*private String getProductInfo(List<DictBiz> rateList, boolean isPlatform){
 		String baseRate = paramService.getValue("yee_base_rate");
 		String saasRate = paramService.getValue("yee_saas_rate");
 		String withdrawRate = paramService.getValue("yee_withdraw_rate");
@@ -440,7 +446,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 		}
 		String rateListStr = JSON.toJSONString(realRateList);
 		return rateListStr;
-	}
+	}*/
 
 	private String getUserProductInfo(List<DictBiz> rateList){
 		String withdrawRate = paramService.getValue("yee_withdraw_rate");
@@ -465,12 +471,12 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 		return rateListStr;
 	}
 
-	private R handleBussinessInfoProductQual(BussinessRegisterRequest bussinessRegisterRequest, BussinessInfo bussinessInfo) {
+	private R handleBussinessInfoProductQual(BussinessRegisterRequest bussinessRegisterRequest, BussinessInfo bussinessInfo, String paymentScene) {
 		String agreementPhotoUrl = "";
 		String systemScreenshotUrl = "";
 		String specialPermitProcessUrl = "";
 		JSONObject data = new JSONObject();
-		data.set("paymentScene", "GYSDK");
+		data.set("paymentScene", paymentScene);
 		if(StringUtil.isNotBlank(bussinessInfo.getAgreementPhotoUrl())){
 			R agreementPhotoUrlR = yeePayService.qualUpload(bussinessInfo.getAgreementPhotoUrl());
 			if(agreementPhotoUrlR.isSuccess()){

+ 5 - 3
src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/IBussinessTransferOrderService.java

@@ -43,9 +43,9 @@ public interface IBussinessTransferOrderService extends BaseService<BussinessTra
 	 */
 	IPage<BussinessTransferOrderVO> selectBussinessTransferOrderPage(IPage<BussinessTransferOrderVO> page, BussinessTransferOrderVO bussinessTransferOrder);
 
-	R transferOrder(BussinessTransferOrder bussinessTransferOrder);
+	R transferOrder(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo);
 
-	R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder);
+	R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo);
 
 	BussinessTransferOrder getByRequestNo(String requestNo, String fromMerchantNo);
 
@@ -58,6 +58,8 @@ public interface IBussinessTransferOrderService extends BaseService<BussinessTra
 	 * @param feeChargeSide 可选项如下: OUTSIDE:转出方承担, INSIDE:转入方承担(若不传默认转出方承担)
 	 * @return 转账ID
 	 */
-	R<BussinessTransferOrder> transferOrder(BigDecimal transferAmount, String fromMerchantNo, String toMerchantNo, String usage, String feeChargeSide, Integer transferScene);
+	R<BussinessTransferOrder> transferOrder(BigDecimal transferAmount, String fromMerchantNo, String toMerchantNo, String usage, String feeChargeSide, Integer transferScene, String parentMerchantNo);
+
+	R transferQuery(Long transferOrderId);
 
 }

+ 48 - 6
src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/impl/BussinessTransferOrderServiceImpl.java

@@ -17,18 +17,22 @@
 package org.springblade.modules.guosen.bussinessTransferOrder.service.impl;
 
 import cn.hutool.json.JSON;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springblade.common.constant.SystemConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
 import org.springblade.modules.guosen.bussinessTransferOrder.vo.BussinessTransferOrderVO;
 import org.springblade.modules.guosen.bussinessTransferOrder.mapper.BussinessTransferOrderMapper;
 import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.yeePay.entity.TransferOrderDto;
+import org.springblade.yeePay.entity.TransferQueryDto;
 import org.springblade.yeePay.service.YeePayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -48,6 +52,8 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 
 	@Autowired
 	private YeePayService yeePayService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 	@Override
 	public IPage<BussinessTransferOrderVO> selectBussinessTransferOrderPage(IPage<BussinessTransferOrderVO> page, BussinessTransferOrderVO bussinessTransferOrder) {
@@ -55,7 +61,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 	}
 
 	@Override
-	public R transferOrder(BussinessTransferOrder bussinessTransferOrder) {
+	public R transferOrder(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo) {
 		TransferOrderDto transferOrderDto = TransferOrderDto.builder()
 				.usage(StringUtil.isBlank(bussinessTransferOrder.getTransferUsage()) ? "采购" : bussinessTransferOrder.getTransferUsage())
 				.fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
@@ -64,7 +70,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 				.orderAmount(bussinessTransferOrder.getOrderAmount())
 				.feeChargeSide(bussinessTransferOrder.getFeeChargeSide())
 				.build();
-		R transferResult = yeePayService.transferOrder(transferOrderDto);
+		R transferResult = yeePayService.transferOrder(transferOrderDto, parentMerchantNo);
 		JSONObject data = JSONUtil.parseObj(transferResult.getData());
 		String requestNo = data.getStr("requestNo");
 		String fromMerchantNo = data.getStr("fromMerchantNo");
@@ -108,7 +114,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 
 	//调试专用
 	@Override
-	public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder) {
+	public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo) {
 		TransferOrderDto transferOrderDto = TransferOrderDto.builder()
 				.usage(StringUtil.isBlank(bussinessTransferOrder.getTransferUsage()) ? "采购" : bussinessTransferOrder.getTransferUsage())
 				.fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
@@ -117,7 +123,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 				.orderAmount(bussinessTransferOrder.getOrderAmount())
 				.feeChargeSide(bussinessTransferOrder.getFeeChargeSide())
 				.build();
-		R transferResult = yeePayService.transferOrder(transferOrderDto);
+		R transferResult = yeePayService.transferOrder(transferOrderDto, parentMerchantNo);
 		JSONObject data = JSONUtil.parseObj(transferResult.getData());
 		String requestNo = data.getStr("requestNo");
 		String fromMerchantNo = data.getStr("fromMerchantNo");
@@ -168,7 +174,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 	}
 
 	@Override
-	public R<BussinessTransferOrder> transferOrder(BigDecimal transferAmount, String fromMerchantNo, String toMerchantNo, String usage, String feeChargeSide, Integer transferScene) {
+	public R<BussinessTransferOrder> transferOrder(BigDecimal transferAmount, String fromMerchantNo, String toMerchantNo, String usage, String feeChargeSide, Integer transferScene, String parentMerchantNo) {
 		String requestNo = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
 		BussinessTransferOrder transferOrder = new BussinessTransferOrder();
 		transferOrder.setOrderAmount(transferAmount.toString());
@@ -189,7 +195,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 					.orderAmount(transferAmount.toString())
 					.feeChargeSide(feeChargeSide)
 					.build();
-			R transferResult = yeePayService.transferOrder(transferOrderDto);
+			R transferResult = yeePayService.transferOrder(transferOrderDto, parentMerchantNo);
 			JSONObject data = JSONUtil.parseObj(transferResult.getData());
 			BussinessTransferOrder dbTransferOrder = this.getByRequestNo(data.getStr("requestNo"), data.getStr("fromMerchantNo"));
 			if(dbTransferOrder == null){
@@ -233,4 +239,40 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 
 	}
 
+	@Override
+	public R transferQuery(Long transferOrderId) {
+		LambdaQueryWrapper<BussinessTransferOrder> lambda = new LambdaQueryWrapper<>();
+		lambda.eq(BussinessTransferOrder::getId, transferOrderId);
+		BussinessTransferOrder transferOrder = this.baseMapper.selectOne(lambda);
+		TransferQueryDto queryDto = TransferQueryDto.builder()
+						.orderNo(transferOrder.getOrderNo())
+						.requestNo(transferOrder.getRequestNo())
+						.build();
+		BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getFromMerchantNo());
+		R result = this.yeePayService.transferQuery(queryDto, bussinessInfo.getParentMerchantNo());
+		JSONObject data = JSONUtil.parseObj(result.getData());
+		String returnCode = data.getStr("returnCode");
+		String transferStatus = data.getStr("transferStatus");
+		String returnMsg = data.getStr("returnMsg");
+		if(returnCode.equals("UA00000")){
+			if("REQUEST_RECEIVE".equals(transferStatus)){
+				transferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue());
+				this.updateById(transferOrder);
+				return R.data("REQUEST_RECEIVE");
+			}else if("SUCCESS".equals(transferStatus)){
+				transferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.SUCCESS.getValue());
+				this.updateById(transferOrder);
+				return R.data("SUCCESS");
+			}else if("FAIL".equals(transferStatus)){
+				transferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
+				transferOrder.setReturnMsg(returnMsg);
+				this.updateById(transferOrder);
+				return R.fail("FAIL");
+			}
+			return R.success(transferStatus);
+		}else{
+			return R.fail(data.getStr("returnMsg"));
+		}
+	}
+
 }

+ 7 - 2
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/controller/BussinessUserInfoController.java

@@ -145,6 +145,13 @@ public class BussinessUserInfoController extends BladeController {
 		Assert.notNull(bankCardNo, "用户银行卡号码不能为空");
 		String userIdCard = bussinessUserInfo.getUserLicenceNo();
 		Assert.notNull(userIdCard, "用户证件号码不能为空");
+		BladeUser user = AuthUtil.getUser();
+		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+						.eq(Bussiness::getAccountId, user.getUserId()));
+		Assert.notNull(bussiness, "当前账号为非采购商");
+		bussinessUserInfo.setBussinessId(bussiness.getId());
+		bussinessUserInfo.setUserShortName(bussinessUserInfo.getUserName());
+		bussinessUserInfo.setUserLicenceType("ID_CARD");
 		R editResult = bussinessUserInfoService.editUserInfo(bussinessUserInfo);
 		return editResult;
 	}
@@ -198,6 +205,4 @@ public class BussinessUserInfoController extends BladeController {
 				}).collect(Collectors.toList());
 		return R.data(voList);
 	}
-
-	
 }

+ 6 - 2
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/entity/BussinessUserInfo.java

@@ -53,7 +53,6 @@ public class BussinessUserInfo extends BaseEntity {
 	/**
 	 * 用户简称
 	 */
-	@NotBlank
 	@ApiModelProperty(value = "用户简称")
 	private String userShortName;
 	/**
@@ -65,7 +64,6 @@ public class BussinessUserInfo extends BaseEntity {
 	/**
 	 * 用户证件类型
 	 */
-	@NotBlank
 	@ApiModelProperty(value = "用户证件类型")
 	private String userLicenceType;
 	/**
@@ -141,6 +139,12 @@ public class BussinessUserInfo extends BaseEntity {
 		@ApiModelProperty(value = "审核意见")
 		private String auditOpinion;
 
+		@ApiModelProperty(value = "上级商户号")
+		private String parentMerchantNo;
+
+	@ApiModelProperty(value = "产品费率策略ID")
+	private Long rateStrategyId;
+
 		@TableField(exist = false)
 		private String thirdUserCardFrontUrl;
 

+ 2 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/mapper/BussinessUserInfoMapper.xml

@@ -27,6 +27,8 @@
         <result column="bussiness_id" property="bussinessId"/>
         <result column="register_status" property="registerStatus"/>
         <result column="audit_opinion" property="auditOpinion"/>
+        <result column="parent_merchant_no" property="parentMerchantNo"/>
+        <result column="rate_strategy_id" property="rateStrategyId"/>
     </resultMap>
 
 

+ 2 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/IBussinessUserInfoService.java

@@ -43,4 +43,6 @@ public interface IBussinessUserInfoService extends BaseService<BussinessUserInfo
 
 	BussinessUserInfo getByNameCardBank(BussinessUserInfo bussinessUserInfo);
 
+	BussinessUserInfo getByMerchantNo(String merchantNo);
+
 }

+ 7 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/impl/BussinessUserInfoServiceImpl.java

@@ -78,4 +78,11 @@ public class BussinessUserInfoServiceImpl extends BaseServiceImpl<BussinessUserI
 		lambda.eq(StringUtil.isNotBlank(bussinessUserInfo.getUserLicenceNo()), BussinessUserInfo::getUserLicenceNo, bussinessUserInfo.getUserLicenceNo());
 		return baseMapper.selectOne(lambda);
 	}
+
+	@Override
+	public BussinessUserInfo getByMerchantNo(String merchantNo) {
+		LambdaQueryWrapper<BussinessUserInfo> lambda = new LambdaQueryWrapper<>();
+		lambda.eq(BussinessUserInfo::getMerchantNo, merchantNo);
+		return baseMapper.selectOne(lambda);
+	}
 }

+ 58 - 1
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/controller/BussinessUserWithdrawController.java

@@ -24,10 +24,24 @@ import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 import javax.validation.Valid;
 
+import org.springblade.common.constant.SystemConstant;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.modules.guosen.bussiness.entity.Bussiness;
+import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
+import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
+import org.springblade.modules.guosen.bussinessuserinfo.entity.BussinessUserInfo;
+import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserInfoService;
+import org.springblade.modules.guosen.bussinessuserwithdraw.dto.WithdrawTransferOrder;
+import org.springblade.modules.system.service.IParamService;
+import org.springblade.yeePay.service.BussinessPayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.Assert;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -54,6 +68,13 @@ import java.util.Date;
 public class BussinessUserWithdrawController extends BladeController {
 
 	private final IBussinessUserWithdrawService bussinessUserWithdrawService;
+	private final BussinessPayService bussinessPayService;
+	@Autowired
+	private IParamService paramService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
+	@Autowired
+	private IBussinessUserInfoService userInfoService;
 
 	/**
 	 * 详情
@@ -143,12 +164,48 @@ public class BussinessUserWithdrawController extends BladeController {
 	 * 提现统计
 	 */
 	@GetMapping("/withdrawStat")
-	@ApiOperationSupport(order = 3)
+	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "提现统计", notes = "传入withdraw")
 	public R<BigDecimal> withdrawStat(BussinessUserWithdraw withdraw) {
 		BigDecimal bigDecimal = this.bussinessUserWithdrawService.withdrawStat(withdraw);
 		return R.data(bigDecimal);
 	}
 
+	/**
+	 *
+	 */
+	@PostMapping("/payToUser")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "向用户付款", notes = "传入ids")
+	public R payToUser(@Valid @RequestBody BussinessUserWithdraw withdraw) {
+		String maintain = paramService.getValue("maintain");
+		if(StringUtil.isNotBlank(maintain)){
+			if(maintain.equals("0")){ //进入维护时间
+				return R.fail("系统维护时间为每天晚上22:00-凌晨07:00");
+			}
+		}
+		Long userInfoId = withdraw.getUserInfoId();
+		BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+		BussinessInfo bussinessInfo = bussinessInfoService.getByBussinessId(userInfo.getBussinessId());
+		R<WithdrawTransferOrder> result = this.bussinessUserWithdrawService.initWithdrawOrder(withdraw);
+		if(result.isSuccess()) {
+			WithdrawTransferOrder withdrawTransferOrder = result.getData();
+			R transferResult = bussinessPayService.transferOrder(withdrawTransferOrder.getTransferOrder(), bussinessInfo.getParentMerchantNo());
+			BussinessUserWithdraw dbWithdraw = withdrawTransferOrder.getWithdraw();
+			if (transferResult.isSuccess()) {
+				dbWithdraw.setFailReason("受理成功,请等待结果");
+				dbWithdraw.setReturnMsg(transferResult.getMsg());
+				this.bussinessUserWithdrawService.updateById(dbWithdraw);
+				return R.success("受理成功,请等待结果");
+			} else {
+				dbWithdraw.setFailReason("代付失败");
+				dbWithdraw.setReturnMsg(transferResult.getMsg());
+				this.bussinessUserWithdrawService.updateById(dbWithdraw);
+				return R.fail("代付失败");
+			}
+		}
+		return result;
+	}
+
 	
 }

+ 15 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/dto/WithdrawTransferOrder.java

@@ -0,0 +1,15 @@
+package org.springblade.modules.guosen.bussinessuserwithdraw.dto;
+
+import lombok.Data;
+import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
+import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUserWithdraw;
+
+import java.io.Serializable;
+
+@Data
+public class WithdrawTransferOrder implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  private BussinessTransferOrder transferOrder;
+  private BussinessUserWithdraw withdraw;
+}

+ 4 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/entity/BussinessUserWithdraw.java

@@ -25,6 +25,9 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 /**
  * 实体类
  *
@@ -80,6 +83,7 @@ public class BussinessUserWithdraw extends BaseEntity {
 	/**
 	* 提现金额,单位:元(RMB)
 	*/
+	@NotNull
 		@ApiModelProperty(value = "提现金额,单位:元(RMB)")
 		private BigDecimal orderAmount;
 	/**

+ 5 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/IBussinessUserWithdrawService.java

@@ -16,7 +16,10 @@
  */
 package org.springblade.modules.guosen.bussinessuserwithdraw.service;
 
+import org.springblade.core.tool.api.R;
 import org.springblade.modules.guosen.bussiness.entity.BussinessDebit;
+import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
+import org.springblade.modules.guosen.bussinessuserwithdraw.dto.WithdrawTransferOrder;
 import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUserWithdraw;
 import org.springblade.modules.guosen.bussinessuserwithdraw.vo.BussinessUserWithdrawVO;
 import org.springblade.core.mp.base.BaseService;
@@ -53,4 +56,6 @@ public interface IBussinessUserWithdrawService extends BaseService<BussinessUser
 
 	BigDecimal withdrawStat(BussinessUserWithdraw withdraw);
 
+	R<WithdrawTransferOrder> initWithdrawOrder(BussinessUserWithdraw withdraw);
+
 }

+ 114 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/impl/BussinessUserWithdrawServiceImpl.java

@@ -19,18 +19,34 @@ package org.springblade.modules.guosen.bussinessuserwithdraw.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springblade.common.constant.SystemConstant;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.guosen.bussiness.entity.Bussiness;
+import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
+import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
+import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
+import org.springblade.modules.guosen.bussinessuserinfo.entity.BussinessUserInfo;
+import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserInfoService;
+import org.springblade.modules.guosen.bussinessuserwithdraw.dto.WithdrawTransferOrder;
 import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUserWithdraw;
 import org.springblade.modules.guosen.bussinessuserwithdraw.vo.BussinessUserWithdrawVO;
 import org.springblade.modules.guosen.bussinessuserwithdraw.mapper.BussinessUserWithdrawMapper;
 import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.modules.guosen.debtDaliyStat.entity.BusinessDeptDaliyStat;
+import org.springblade.modules.guosen.debtDaliyStat.service.IBusinessDeptDaliyStatService;
+import org.springblade.modules.system.service.IParamService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.util.Assert;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 /**
  *  服务实现类
@@ -41,6 +57,19 @@ import java.util.List;
 @Service
 public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessUserWithdrawMapper, BussinessUserWithdraw> implements IBussinessUserWithdrawService {
 
+	@Autowired
+	private IBussinessUserInfoService userInfoService;
+	@Autowired
+	private IBussinessService bussinessService;
+	@Autowired
+	private IParamService paramService;
+	@Autowired
+	IBusinessDeptDaliyStatService businessDeptDaliyStatService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
+	@Autowired
+	private IBussinessTransferOrderService transferOrderService;
+
 	@Override
 	public IPage<BussinessUserWithdrawVO> selectBussinessUserWithdrawPage(IPage<BussinessUserWithdrawVO> page, BussinessUserWithdrawVO bussinessUserWithdraw) {
 		return page.setRecords(baseMapper.selectBussinessUserWithdrawPage(page, bussinessUserWithdraw));
@@ -99,4 +128,89 @@ public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessU
 		return stat;
 	}
 
+	@Override
+	public R<WithdrawTransferOrder> initWithdrawOrder(BussinessUserWithdraw withdraw) {
+		Long userInfoId = withdraw.getUserInfoId();
+		BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+		Assert.notNull(userInfo, "用户进件信息不存在");
+		if(userInfo.getRegisterStatus().intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			return R.fail("用户未完成进件审核");
+		}
+		Long bussinessId = userInfo.getBussinessId();
+		Bussiness bussiness = this.bussinessService.getById(bussinessId);
+		if(withdraw.getOrderAmount().compareTo(bussiness.getMaxLimit()) == 1){ //大于的时候返回1,等于返回0,小于返回-1
+			log.error("=================代付请求前校验,提现金额不能超过商户每日限额=================");
+			return R.fail("代付金额不能超过商户每日限额(限额 : 发起金额(不含手续费) = " + bussiness.getMaxLimit().toString() + ":" + String.valueOf(withdraw.getOrderAmount()) + ")");
+		}else{
+			//获取今日采购商已代付金额
+			BusinessDeptDaliyStat todayStat = businessDeptDaliyStatService.getTodayStat(bussiness.getId());
+			if(todayStat == null) {
+				businessDeptDaliyStatService.createTodayStat(bussiness.getId(), null);
+			}else{
+				BigDecimal todayAmount = todayStat.getStatAmount();
+				if(todayAmount.add(withdraw.getOrderAmount()).compareTo(bussiness.getMaxLimit()) == 1){ //如果当日已分润金额+本次订单分润金额大于商户每日上限分润金额
+					log.error("=================代付请求前校验,今日提现金额已超过商户每日限额=================");
+					return R.fail("今日代付金额已超过商户每日限额");
+				}
+			}
+		}
+		BussinessInfo bussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getId());
+		//1、先发起一次子商户转账到平台商户
+		R<BigDecimal> bussinessRemainR = bussinessService.queryBalance(bussiness.getMerchantNo());
+		String withdrawRate = paramService.getValue("yee_withdraw_rate");
+		String transferRate = paramService.getValue("yee_transfer_rate");
+		BigDecimal remain = bussinessRemainR.getData();
+		BigDecimal orderAmount = withdraw.getOrderAmount();
+		BigDecimal withdrawFee = new BigDecimal(withdrawRate);
+		BigDecimal transferFee = new BigDecimal(transferRate);
+		BigDecimal transferAmount = orderAmount.add(transferFee).add(withdrawFee); //这里包含实际提现金额,提现手续费以及帮平台商承担的转账手续费
+		//如果余额小于订单金额+提现手续费+转账手续费*2,则认为不可以发起代付
+		if(remain.compareTo(transferAmount.add(transferFee)) == -1){
+			return R.fail("商户余额不足,无法发起代付。");
+		}
+
+		BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
+		bussinessTransferOrder.setFromMerchantNo(bussinessInfo.getMerchantNo());
+		bussinessTransferOrder.setToMerchantNo(bussinessInfo.getParentMerchantNo());
+		bussinessTransferOrder.setTransferUsage("采购");
+		bussinessTransferOrder.setOrderAmount(transferAmount.toString());
+		bussinessTransferOrder.setFeeChargeSide("OUTSIDE");
+		bussinessTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+		bussinessTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue());
+		bussinessTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+		boolean save = this.transferOrderService.save(bussinessTransferOrder);
+		if(save){
+			BussinessUserWithdraw withdrawOrder = this.createWithdrawOrder(userInfo, orderAmount, null, null);
+			withdrawOrder.setFirstTransferOrderId(bussinessTransferOrder.getId());
+			boolean save1 = this.save(withdrawOrder);
+			if(save1){
+				WithdrawTransferOrder withdrawTransferOrder = new WithdrawTransferOrder();
+				withdrawTransferOrder.setTransferOrder(bussinessTransferOrder);
+				withdrawTransferOrder.setWithdraw(withdrawOrder);
+				return R.data(withdrawTransferOrder, "初始化订单成功");
+			}else{
+				return R.fail("初始化订单失败");
+			}
+		}else{
+			return R.fail("初始化订单失败");
+		}
+	}
+
+	private BussinessUserWithdraw createWithdrawOrder(BussinessUserInfo userInfo, BigDecimal withdrawAmount, String failReason, String returnMsg){
+		BussinessUserWithdraw withdraw = new BussinessUserWithdraw();
+		withdraw.setUserInfoId(userInfo.getId());
+		withdraw.setMerchantNo(userInfo.getMerchantNo());
+		withdraw.setBankAccountNo(userInfo.getBankCardNo());
+		withdraw.setOrderAmount(withdrawAmount);
+		withdraw.setReceiveType("REAL_TIME");
+		withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.WAIT.getValue());
+		withdraw.setFailReason(failReason);
+		withdraw.setReturnMsg(returnMsg);
+		withdraw.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+		withdraw.setReceiverAccountName(userInfo.getUserName());
+		withdraw.setBankCode(userInfo.getBankCode());
+		return withdraw;
+	}
+
+
 }

+ 169 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/controller/ProductRateStrategyController.java

@@ -0,0 +1,169 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.modules.guosen.bussinessRateStrategy.entity.BussinessRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateDTO;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateStrategyDTO;
+import org.springblade.modules.guosen.productratestrategy.vo.SimpleProductRateStrategyVO;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
+import org.springblade.modules.guosen.productratestrategy.wrapper.ProductRateStrategyWrapper;
+import org.springblade.modules.guosen.productratestrategy.service.IProductRateStrategyService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *  控制器
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("cyzh-product-rate-strategy/productratestrategy")
+@Api(value = "", tags = "接口")
+public class ProductRateStrategyController extends BladeController {
+
+	private final IProductRateStrategyService productRateStrategyService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入productRateStrategy")
+	public R<ProductRateStrategyVO> detail(ProductRateStrategy productRateStrategy) {
+		ProductRateStrategy detail = productRateStrategyService.getOne(Condition.getQueryWrapper(productRateStrategy));
+		if(detail != null){
+			List<ProductRateDTO> rateList = JSONArray.parseArray(detail.getProductRateJson(), ProductRateDTO.class);
+			ProductRateStrategyVO vo = new ProductRateStrategyVO();
+			vo.setId(detail.getId());
+			vo.setRateList(rateList);
+			vo.setName(detail.getName());
+			return R.data(vo);
+		}else{
+			return R.data(null);
+		}
+	}
+
+	/**
+	 * 分页 
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入productRateStrategy")
+	public R<IPage<ProductRateStrategyVO>> list(ProductRateStrategy productRateStrategy, Query query) {
+		IPage<ProductRateStrategy> pages = productRateStrategyService.page(Condition.getPage(query), Condition.getQueryWrapper(productRateStrategy));
+		return R.data(ProductRateStrategyWrapper.build().pageVO(pages));
+	}
+
+
+	/**
+	 * 自定义分页 
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入productRateStrategy")
+	public R<IPage<ProductRateStrategyVO>> page(ProductRateStrategyVO productRateStrategy, Query query) {
+		IPage<ProductRateStrategyVO> pages = productRateStrategyService.selectProductRateStrategyPage(Condition.getPage(query), productRateStrategy);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入productRateStrategy")
+	public R save(@Valid @RequestBody ProductRateStrategy productRateStrategy) {
+		return R.status(productRateStrategyService.save(productRateStrategy));
+	}
+
+	/**
+	 * 修改 
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入productRateStrategy")
+	public R update(@Valid @RequestBody ProductRateStrategy productRateStrategy) {
+		return R.status(productRateStrategyService.updateById(productRateStrategy));
+	}
+
+	/**
+	 * 新增或修改 
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入productRateStrategy")
+	public R submit(@Valid @RequestBody ProductRateStrategyDTO productRateStrategyDTO) {
+		return this.productRateStrategyService.createStrategy(productRateStrategyDTO);
+	}
+
+	
+	/**
+	 * 删除 
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "逻辑删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(productRateStrategyService.deleteLogic(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 删除
+	 */
+	@GetMapping("/listRateStrategy")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "产品策略列表", notes = "传入ids")
+	public R<List<SimpleProductRateStrategyVO>> listRateStrategy() {
+		List<ProductRateStrategy> list = this.productRateStrategyService.list();
+		List<SimpleProductRateStrategyVO>  voList = list.stream().map(item -> {
+			SimpleProductRateStrategyVO vo = new SimpleProductRateStrategyVO();
+			vo.setId(item.getId());
+			vo.setName(item.getName());
+			return vo;
+		}).collect(Collectors.toList());
+		if(voList != null && voList.size() > 0){
+			return R.data(voList);
+		}else{
+			return R.data(new ArrayList<>());
+		}
+	}
+
+	
+}

+ 12 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/dto/ProductRateDTO.java

@@ -0,0 +1,12 @@
+package org.springblade.modules.guosen.productratestrategy.dto;
+
+import lombok.Data;
+
+@Data
+public class ProductRateDTO {
+
+  private String productCode;
+  private String rateType;
+  private String percentRate;
+  private String fixedRate;
+}

+ 38 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/dto/ProductRateStrategyDTO.java

@@ -0,0 +1,38 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.dto;
+
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ProductRateStrategyDTO extends ProductRateStrategy {
+	private static final long serialVersionUID = 1L;
+
+	private List<ProductRateDTO> rateList;
+
+}

+ 58 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/entity/ProductRateStrategy.java

@@ -0,0 +1,58 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import org.springblade.core.mp.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * 实体类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@Data
+@TableName("cyzh_product_rate_strategy")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "ProductRateStrategy对象", description = "ProductRateStrategy对象")
+public class ProductRateStrategy extends BaseEntity {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	* 策略名称
+	*/
+		@ApiModelProperty(value = "策略名称")
+		private String name;
+	/**
+	* 产品费率json字符串
+	*/
+		@ApiModelProperty(value = "产品费率json字符串")
+		private String productRateJson;
+
+	/**
+	 * 付款场景
+	 */
+	@ApiModelProperty(value = "付款场景")
+	private String paymentScene;
+
+
+}

+ 42 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/mapper/ProductRateStrategyMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.mapper;
+
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ *  Mapper 接口
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+public interface ProductRateStrategyMapper extends BaseMapper<ProductRateStrategy> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param productRateStrategy
+	 * @return
+	 */
+	List<ProductRateStrategyVO> selectProductRateStrategyPage(IPage page, ProductRateStrategyVO productRateStrategy);
+
+}

+ 25 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/mapper/ProductRateStrategyMapper.xml

@@ -0,0 +1,25 @@
+<?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="org.springblade.modules.guosen.productratestrategy.mapper.ProductRateStrategyMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="productRateStrategyResultMap" type="org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="name" property="name"/>
+        <result column="product_rate_json" property="productRateJson"/>
+        <result column="payment_scene" property="paymentScene"/>
+    </resultMap>
+
+
+    <select id="selectProductRateStrategyPage" resultMap="productRateStrategyResultMap">
+        select * from cyzh_product_rate_strategy where is_deleted = 0
+    </select>
+
+</mapper>

+ 45 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/service/IProductRateStrategyService.java

@@ -0,0 +1,45 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.service;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateStrategyDTO;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
+import org.springblade.core.mp.base.BaseService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ *  服务类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+public interface IProductRateStrategyService extends BaseService<ProductRateStrategy> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param productRateStrategy
+	 * @return
+	 */
+	IPage<ProductRateStrategyVO> selectProductRateStrategyPage(IPage<ProductRateStrategyVO> page, ProductRateStrategyVO productRateStrategy);
+
+	R<Boolean> createStrategy(ProductRateStrategyDTO dto);
+
+}

+ 80 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/service/impl/ProductRateStrategyServiceImpl.java

@@ -0,0 +1,80 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.core.tool.api.R;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateDTO;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateStrategyDTO;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
+import org.springblade.modules.guosen.productratestrategy.mapper.ProductRateStrategyMapper;
+import org.springblade.modules.guosen.productratestrategy.service.IProductRateStrategyService;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ *  服务实现类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@Service
+public class ProductRateStrategyServiceImpl extends BaseServiceImpl<ProductRateStrategyMapper, ProductRateStrategy> implements IProductRateStrategyService {
+
+	@Override
+	public IPage<ProductRateStrategyVO> selectProductRateStrategyPage(IPage<ProductRateStrategyVO> page, ProductRateStrategyVO productRateStrategy) {
+		return page.setRecords(baseMapper.selectProductRateStrategyPage(page, productRateStrategy));
+	}
+
+	@Override
+	public R<Boolean> createStrategy(ProductRateStrategyDTO dto) {
+		List<ProductRateDTO> rateList = dto.getRateList();
+		if(rateList != null && rateList.size() > 0){
+			String json = JSONObject.toJSONString(rateList);
+			if(dto.getId() == null){ //新增
+				LambdaQueryWrapper<ProductRateStrategy> lambda = new LambdaQueryWrapper<>();
+				lambda.eq(ProductRateStrategy::getName, dto.getName());
+				List<ProductRateStrategy> list = this.list(lambda);
+				if(list != null && list.size() > 0){
+					return R.fail("已存在相同的产品策略名称");
+				}
+				ProductRateStrategy strategy = new ProductRateStrategy();
+				strategy.setName(dto.getName());
+				strategy.setProductRateJson(json);
+				strategy.setPaymentScene(dto.getPaymentScene());
+				boolean save = this.save(strategy);
+				return R.status(save);
+			}else{ //更新
+				ProductRateStrategy strategy = new ProductRateStrategy();
+				strategy.setId(dto.getId());
+				strategy.setProductRateJson(json);
+				strategy.setPaymentScene(dto.getPaymentScene());
+				boolean update = this.updateById(strategy);
+				return R.status(update);
+			}
+		}else{
+			return R.status(true);
+		}
+	}
+
+}

+ 41 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/vo/ProductRateStrategyVO.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.vo;
+
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateDTO;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+import java.util.List;
+
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "ProductRateStrategyVO对象", description = "ProductRateStrategyVO对象")
+public class ProductRateStrategyVO extends ProductRateStrategy {
+	private static final long serialVersionUID = 1L;
+
+	private List<ProductRateDTO> rateList;
+
+}

+ 44 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/vo/SimpleProductRateStrategyVO.java

@@ -0,0 +1,44 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.modules.guosen.productratestrategy.dto.ProductRateDTO;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 视图实体类
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+@Data
+public class SimpleProductRateStrategyVO implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	private String name;
+
+	private Long id;
+
+	private String merchantNo;
+
+}

+ 49 - 0
src/main/java/org/springblade/modules/guosen/productratestrategy/wrapper/ProductRateStrategyWrapper.java

@@ -0,0 +1,49 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.modules.guosen.productratestrategy.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.vo.ProductRateStrategyVO;
+import java.util.Objects;
+
+/**
+ * 包装类,返回视图层所需的字段
+ *
+ * @author BladeX
+ * @since 2021-10-21
+ */
+public class ProductRateStrategyWrapper extends BaseEntityWrapper<ProductRateStrategy, ProductRateStrategyVO>  {
+
+	public static ProductRateStrategyWrapper build() {
+		return new ProductRateStrategyWrapper();
+ 	}
+
+	@Override
+	public ProductRateStrategyVO entityVO(ProductRateStrategy productRateStrategy) {
+		ProductRateStrategyVO productRateStrategyVO = Objects.requireNonNull(BeanUtil.copy(productRateStrategy, ProductRateStrategyVO.class));
+
+		//User createUser = UserCache.getUser(productRateStrategy.getCreateUser());
+		//User updateUser = UserCache.getUser(productRateStrategy.getUpdateUser());
+		//productRateStrategyVO.setCreateUserName(createUser.getName());
+		//productRateStrategyVO.setUpdateUserName(updateUser.getName());
+
+		return productRateStrategyVO;
+	}
+
+}

+ 1 - 1
src/main/java/org/springblade/modules/guosen/userActivityStatistical/service/impl/UserActivityStatisticalServiceImpl.java

@@ -283,7 +283,7 @@ public class UserActivityStatisticalServiceImpl extends BaseServiceImpl<UserActi
 			.receiverAccountNo(cardNo)
 			.receiverBankCode(userBank.getBankType())
 			.requestNo(simpleUUID).build();
-		R r = yeePayService.payOrder(transferDto);
+		R r = yeePayService.payOrder(transferDto, null);
 		JSONObject jsonObject = (JSONObject) r.getData();
 		String status = jsonObject.getString("status");
 		System.out.println("*******jsonObject"+jsonObject);

+ 6 - 1
src/main/java/org/springblade/modules/time/TimeTask.java

@@ -18,6 +18,8 @@ import org.springblade.modules.guosen.bussiness.entity.BussinessBonusStatic;
 import org.springblade.modules.guosen.bussiness.service.IBussinessBonusAccountService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessBonusRecordsService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessBonusStaticService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
 import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
 import org.springblade.modules.system.service.IParamService;
@@ -59,6 +61,8 @@ public class TimeTask {
 	private IBussinessTransferOrderService bussinessTransferOrderService;
 	@Autowired
 	private YeePayConst yeePayConst;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 	@Scheduled(cron = "0 0 0 * * ?")
 	public  void clearRedis() {
@@ -232,9 +236,10 @@ public class TimeTask {
 			transferOrder.setTransferUsage("采购");
 			transferOrder.setFeeChargeSide("OUTSIDE");
 			boolean save = bussinessTransferOrderService.save(transferOrder);
+			BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getFromMerchantNo());
 			if(save){
 				//发起充值服务费转账。
-				bussinessTransferOrderService.transferOrder(transferOrder);
+				bussinessTransferOrderService.transferOrder(transferOrder, bussinessInfo.getParentMerchantNo());
 			}else{
 				log.error("=======================分润转账业务订单保存失败========================");
 				log.error(JSONUtil.toJsonStr(transferOrder));

+ 1 - 0
src/main/java/org/springblade/yeePay/common/YeePayConst.java

@@ -31,6 +31,7 @@ public class YeePayConst {
 	String transferOrderUrl;
 	String payOrderUrl;
 	String withdrawOrderUrl;
+	String transferQueryUrl;
 	String productFeeModifyUrl;
 	String rechargeOrderNotify;
 	String transferOrderNotify;

+ 7 - 2
src/main/java/org/springblade/yeePay/controller/BussinessPayController.java

@@ -21,6 +21,8 @@ import org.springblade.modules.guosen.bussiness.entity.BussinessDebitRequest;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitRequestService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessRegisterRequest.entity.BussinessRegisterRequest;
 import org.springblade.modules.guosen.bussinessRegisterRequest.service.IBussinessRegisterRequestService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
@@ -83,6 +85,8 @@ public class BussinessPayController {
 	private IBussinessRegisterRequestService bussinessRegisterRequestService;
 	@Autowired
 	private IBussinessUserWithdrawService withdrawService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 	/**
 	 *	代付1.0:查询订单状态
@@ -190,6 +194,7 @@ public class BussinessPayController {
 				}
 			}
 		}
+		BussinessInfo bussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getId());
 		//1、先发起一次子商户转账到平台商户
 		R<BigDecimal> bussinessRemainR = bussinessService.queryBalance(bussiness.getMerchantNo());
 		BigDecimal remain = bussinessRemainR.getData();
@@ -237,7 +242,7 @@ public class BussinessPayController {
 				bussinessTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
 				boolean transferSave = bussinessTransferOrderService.save(bussinessTransferOrder);
 				if(transferSave){
-					R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder);
+					R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder, bussinessInfo.getParentMerchantNo());
 					if(transferResult.isSuccess()){
 						debit.setTransferOrderId(bussinessTransferOrder.getId());
 						bussinessDebitService.updateById(debit);
@@ -486,7 +491,7 @@ public class BussinessPayController {
 		if(transferSave){
 			R withDrawOrderResult = this.createWithDrawOrder(userInfo, bussinessTransferOrder.getId(), payToUserDto.getBussinessOrderId(), null, orderAmountBigDecimal, "受理成功,请等待结果", "提现前第一次转账发起受理成功", requestIp);
 			if(withDrawOrderResult.isSuccess()){
-				R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder);
+				R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder, userInfo.getParentMerchantNo());
 				if(transferResult.isSuccess()){
 					return R.data(200, bussinessTransferOrder.getId(), "转账受理成功,请等待结果");
 				}else{

+ 2 - 2
src/main/java/org/springblade/yeePay/controller/YeePayController.java

@@ -57,8 +57,8 @@ public class YeePayController {
 	 * */
 	@PostMapping("transferToCard")
 	@ApiOperation("代付:交易到银行卡(单笔出款)")
-	public R transferToCard(@RequestBody @Valid PayOrderDto payOrderDto){
-		return yeePayService.payOrder(payOrderDto);
+	public R transferToCard(@RequestBody @Valid PayOrderDto payOrderDto, String parentMerchantNo){
+		return yeePayService.payOrder(payOrderDto, parentMerchantNo);
 	}
 
 	/**

+ 24 - 0
src/main/java/org/springblade/yeePay/entity/TransferQueryDto.java

@@ -0,0 +1,24 @@
+package org.springblade.yeePay.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+@ApiModel("转账-查询")
+public class TransferQueryDto {
+
+    @ApiModelProperty(value = "发起方商户编号",required = true)
+    public String parentMerchantNo;
+
+    @ApiModelProperty(value = "商户请求号",required = true)
+    public String requestNo;
+
+    /**
+     * 精确到两位小数
+     */
+    @ApiModelProperty(value = "第三方转账单号",required = true)
+    public String orderNo;
+}

+ 9 - 2
src/main/java/org/springblade/yeePay/listener/RechargeOrderNotifyListener.java

@@ -9,6 +9,8 @@ import org.springblade.modules.guosen.billRecord.entity.BillRecord;
 import org.springblade.modules.guosen.billRecord.service.IBillRecordService;
 import org.springblade.modules.guosen.bussiness.entity.Bussiness;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.yeePay.event.RechargeOrderEvent;
 import org.springblade.yeePay.event.RechargeServiceFeeTransferNotifyEvent;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +39,8 @@ public class RechargeOrderNotifyListener {
 	private TransactionDefinition transactionDefinition;
 	@Autowired
 	private ApplicationEventPublisher eventPublisher;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 	/**
 	 * 网银充值回调业务逻辑处理(新版)
@@ -78,8 +82,11 @@ public class RechargeOrderNotifyListener {
 						//提交事务
 						platformTransactionManager.commit(transaction);
 						//发送异步事件,发起转账,扣除充值的服务费。
-						RechargeServiceFeeTransferNotifyEvent rsftEvent = new RechargeServiceFeeTransferNotifyEvent(billRecord);
-						eventPublisher.publishEvent(rsftEvent);
+						BussinessInfo info = bussinessInfoService.getByBussinessId(bussiness.getId());
+						if(info.getBusinessRole().equals("SETTLED_MERCHANT")){
+							RechargeServiceFeeTransferNotifyEvent rsftEvent = new RechargeServiceFeeTransferNotifyEvent(billRecord);
+							eventPublisher.publishEvent(rsftEvent);
+						}
 					}catch (Exception e){
 						//回滚事务
 						platformTransactionManager.rollback(transaction);

+ 6 - 1
src/main/java/org/springblade/yeePay/listener/RechargeServiceFeeTransferNotifyListener.java

@@ -6,6 +6,8 @@ import org.springblade.common.constant.SystemConstant;
 import org.springblade.modules.guosen.billRecord.entity.BillRecord;
 import org.springblade.modules.guosen.bussiness.entity.Bussiness;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
 import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
 import org.springblade.modules.system.service.IParamService;
@@ -31,6 +33,8 @@ public class RechargeServiceFeeTransferNotifyListener {
     private IBussinessTransferOrderService bussinessTransferOrderService;
     @Autowired
     private YeePayConst yeePayConst;
+    @Autowired
+    private IBussinessInfoService bussinessInfoService;
 
     @EventListener
     @Async
@@ -57,9 +61,10 @@ public class RechargeServiceFeeTransferNotifyListener {
             transferOrder.setTransferScene(SystemConstant.TransferScene.FOR_SERVICE_FEE.getValue());
             transferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
             boolean save = bussinessTransferOrderService.save(transferOrder);
+            BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getFromMerchantNo());
             if(save){
                 //发起充值服务费转账。
-                bussinessTransferOrderService.transferOrder(transferOrder);
+                bussinessTransferOrderService.transferOrder(transferOrder, bussinessInfo.getParentMerchantNo());
             }else{
                 log.error("=======================充值服务费转账业务订单保存失败========================");
                 log.error(JSONUtil.toJsonStr(transferOrder));

+ 68 - 17
src/main/java/org/springblade/yeePay/listener/TransferOrderNotifyListener.java

@@ -3,7 +3,6 @@ package org.springblade.yeePay.listener;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
-import net.bytebuddy.asm.Advice;
 import org.springblade.common.constant.SystemConstant;
 import org.springblade.common.utils.MoneyDesUtil;
 import org.springblade.core.tool.api.R;
@@ -15,6 +14,8 @@ import org.springblade.modules.guosen.bussiness.service.IBussinessBonusAccountSe
 import org.springblade.modules.guosen.bussiness.service.IBussinessBonusRecordsService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessTransferOrder.entity.BussinessTransferOrder;
 import org.springblade.modules.guosen.bussinessTransferOrder.service.IBussinessTransferOrderService;
 import org.springblade.modules.guosen.bussinessuserinfo.entity.BussinessUserInfo;
@@ -22,15 +23,17 @@ import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserIn
 import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUserWithdraw;
 import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
 import org.springblade.modules.system.service.IParamService;
-import org.springblade.yeePay.common.YeePayConst;
 import org.springblade.yeePay.event.TransferOrderEvent;
 import org.springblade.yeePay.service.BussinessPayService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.UUID;
 
 @Component
@@ -48,8 +51,6 @@ public class TransferOrderNotifyListener {
     @Autowired
     private IBussinessUserWithdrawService bussinessUserWithdrawService;
     @Autowired
-    private YeePayConst yeePayConst;
-    @Autowired
     private IParamService paramService;
     @Autowired
     private IBussinessBonusRecordsService bussinessBonusRecordsService;
@@ -57,6 +58,10 @@ public class TransferOrderNotifyListener {
     private IBussinessUserInfoService userInfoService;
     @Autowired
     private IBussinessBonusAccountService bussinessBonusAccountService;
+    @Autowired
+    private IBussinessInfoService bussinessInfoService;
+    @Autowired
+    private ApplicationEventPublisher eventPublisher;
 
     @EventListener
     @Async
@@ -80,9 +85,10 @@ public class TransferOrderNotifyListener {
                     this.handleServiceFeeScene(fromMerchantNo);
                 }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_PAY.getValue()){ //代付前转账场景
                     this.handlePayOrderScene(transferOrder.getId(), fromMerchantNo);
-                }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue()){ //提现前第一次转账场景
-                    this.handleFirstTransferScene(transferOrder.getId());
-                }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue()){ //提现前第二次转账场景
+                }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue()){ //提现前第一次转账成功
+                    BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getToMerchantNo());
+                    this.handleFirstTransferScene(transferOrder.getId(), bussinessInfo.getParentMerchantNo());
+                }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue()){ //提现前第二次转账成功
                     this.handleSecondTransferScene(transferOrder.getId());
                 }else if(transferScene.intValue() == SystemConstant.TransferScene.FOR_BONUS_TRANSFER.getValue()){ //分润前转账场景
                     this.handleBonusTransferScene(transferOrder.getId());
@@ -110,8 +116,9 @@ public class TransferOrderNotifyListener {
         if(bussiness != null){
             //发起代付
             BussinessDebit debit = bussinessDebitService.getByTransferOrderId(bussiness.getId(), transferOrderId);
+            BussinessInfo bussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getId());
             if(debit != null){
-                bussinessPayService.payOrder(debit.getId());
+                bussinessPayService.payOrder(debit.getId(), bussinessInfo.getParentMerchantNo());
             }
         }
     }
@@ -119,11 +126,11 @@ public class TransferOrderNotifyListener {
     /**
      * 处理提现前第一次转账场景,主要是要发起第二次转账,转账到小微用户
      */
-    private void handleFirstTransferScene(Long firstTransferOrderId){
+    private void handleFirstTransferScene(Long firstTransferOrderId, String parentMerchantNo){
         String withdrawRate = paramService.getValue("yee_withdraw_rate");
         BussinessUserWithdraw withdraw = this.bussinessUserWithdrawService.getByFirstTransferOrderId(firstTransferOrderId);
         BussinessTransferOrder transferOrder = new BussinessTransferOrder();
-        transferOrder.setFromMerchantNo(yeePayConst.getParentMerchantNo());
+        transferOrder.setFromMerchantNo(parentMerchantNo);
         transferOrder.setToMerchantNo(withdraw.getMerchantNo());
         transferOrder.setTransferUsage("提现前转账");
         transferOrder.setOrderAmount((withdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
@@ -134,11 +141,56 @@ public class TransferOrderNotifyListener {
         boolean transferSave = bussinessTransferOrderService.save(transferOrder);
         if(transferSave){
             withdraw.setSecondTransferOrderId(transferOrder.getId());
-            R transferResult = bussinessPayService.transferOrder(transferOrder);
+            R transferResult = bussinessPayService.transferOrder(transferOrder, parentMerchantNo);
             if(transferResult.isSuccess()){
-                withdraw.setFailReason("受理成功,请等待结果");
-                withdraw.setReturnMsg("提现前第二次转账发起成功");
-                this.bussinessUserWithdrawService.updateById(withdraw);
+                if(transferResult.getMsg().equals("REQUEST_RECEIVE")){
+                    Timer timer = new Timer();
+                    timer.schedule(new TimerTask() {
+                        @Override
+                        public void run() {
+                            BussinessTransferOrder dbTransferOrder = bussinessTransferOrderService.getById(transferOrder.getId());
+                            if(dbTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()){
+                                R result = bussinessTransferOrderService.transferQuery(transferOrder.getId());
+                                if(result.isSuccess()){
+                                    if(result.getData().equals("SUCCESS")){
+                                        //发起提现
+                                        Long transferOrderId = dbTransferOrder.getId();
+                                        BussinessUserWithdraw withdraw = bussinessUserWithdrawService.getBySecondTransferOrderId(transferOrderId);
+                                        Long userInfoId = withdraw.getUserInfoId();
+                                        BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+                                        BussinessTransferOrder transferOrder = bussinessTransferOrderService.getById(transferOrderId);
+                                        withdraw.setReturnMsg("提现前第二次转账回调成功");
+                                        R<BigDecimal> remainR = bussinessService.queryBalance(userInfo.getMerchantNo());
+                                        if(remainR.isSuccess()){
+                                            BigDecimal remain = remainR.getData();
+                                            if(remain.compareTo(new BigDecimal(transferOrder.getOrderAmount())) == 1){
+                                                bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+                                            }else{
+                                                log.error("=====================分润失败,用户资金账户余额不足===============");
+                                                log.error(String.format("============分润金额:%s, 用户资金账户余额:%s", withdraw.getOrderAmount().toString(), remain.toString()));
+                                            }
+                                        }
+                                        this.cancel();
+                                        timer.cancel();
+                                    }
+                                }else{
+                                    this.cancel();
+                                    timer.cancel();
+
+                                }
+                            }else{
+                                this.cancel();
+                                timer.cancel();
+                            }
+                        }
+                    }, 500 , 10000);
+                }else if(transferResult.getMsg().equals("SUCCESS")){
+                    withdraw.setFailReason("受理成功,请等待结果");
+                    withdraw.setReturnMsg("提现前第二次转账发起成功");
+                    this.bussinessUserWithdrawService.updateById(withdraw);
+                    //发起提现
+                    this.handleSecondTransferScene(transferOrder.getId());
+                }
             }else{
                 withdraw.setFailReason("代付失败");
                 withdraw.setReturnMsg("提现前第二次转账发起失败:" + transferResult.getMsg());
@@ -168,13 +220,12 @@ public class TransferOrderNotifyListener {
         if(remainR.isSuccess()){
             BigDecimal remain = remainR.getData();
             if(remain.compareTo(new BigDecimal(transferOrder.getOrderAmount())) == 1){
-                this.bussinessPayService.withdrawOrder(withdraw);
+                this.bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
             }else{
                 log.error("=====================分润失败,用户资金账户余额不足===============");
                 log.error(String.format("============分润金额:%s, 用户资金账户余额:%s", withdraw.getOrderAmount().toString(), remain.toString()));
             }
         }
-        this.bussinessPayService.withdrawOrder(withdraw);
     }
 
     /**
@@ -201,7 +252,7 @@ public class TransferOrderNotifyListener {
         if(remainR.isSuccess()){
             BigDecimal remain = remainR.getData();
             if(remain.compareTo(new BigDecimal(transferOrder.getOrderAmount())) == 1){
-                this.bussinessPayService.withdrawOrder(withdraw);
+                this.bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
             }else{
                 log.error("=====================分润失败,用户资金账户余额不足===============");
                 log.error(String.format("============分润金额:%s, 用户资金账户余额:%s", withdraw.getOrderAmount().toString(), remain.toString()));

+ 1 - 1
src/main/java/org/springblade/yeePay/listener/UserRegisterNotifyListener.java

@@ -124,7 +124,7 @@ public class UserRegisterNotifyListener {
         if(transferSave){
             withdraw.setFirstTransferOrderId(bussinessTransferOrder.getId());
             this.withdrawService.updateById(withdraw);
-            R transferResult = bussinessTransferOrderService.transferOrder(bussinessTransferOrder);
+            R transferResult = bussinessTransferOrderService.transferOrder(bussinessTransferOrder, userInfo.getParentMerchantNo());
             if(transferResult.isSuccess()){
                 withdraw.setFailReason("受理成功,请等待结果");
                 withdraw.setReturnMsg("提现前第一次转账发起成功");

+ 10 - 10
src/main/java/org/springblade/yeePay/service/BussinessPayService.java

@@ -40,7 +40,7 @@ public class BussinessPayService {
      * @param bussinessTransferOrder
      * @return
      */
-    public R transferOrder(BussinessTransferOrder bussinessTransferOrder){
+    public R transferOrder(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo){
         TransferOrderDto transferOrderDto = TransferOrderDto.builder()
                 .fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
                 .toMerchantNo(bussinessTransferOrder.getToMerchantNo())
@@ -49,7 +49,7 @@ public class BussinessPayService {
                 .feeChargeSide(bussinessTransferOrder.getFeeChargeSide())
                 .usage(StringUtil.isBlank(bussinessTransferOrder.getTransferUsage()) ? "采购" : bussinessTransferOrder.getTransferUsage())
                 .build();
-        R result = yeePayService.transferOrder(transferOrderDto);
+        R result = yeePayService.transferOrder(transferOrderDto, parentMerchantNo);
         JSONObject data = JSONUtil.parseObj(result.getData());
         String requestNo = data.getStr("requestNo");
         String fromMerchantNo = data.getStr("fromMerchantNo");
@@ -72,9 +72,9 @@ public class BussinessPayService {
             if("REQUEST_RECEIVE".equals(transferStatus)){
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue());
                 bussinessTransferOrderService.updateById(dbTransferOrder);
-                return R.status(true);
+                return R.success("REQUEST_RECEIVE");
             }else if("SUCCESS".equals(transferStatus)){
-                return R.status(true);
+                return R.success("SUCCESS");
             }else if("FAIL".equals(transferStatus)){
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
                 dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
@@ -100,7 +100,7 @@ public class BussinessPayService {
      * @param bussinessTransferOrder
      * @return
      */
-    public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder){
+    public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo){
         TransferOrderDto transferOrderDto = TransferOrderDto.builder()
                 .fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
                 .toMerchantNo(bussinessTransferOrder.getToMerchantNo())
@@ -109,7 +109,7 @@ public class BussinessPayService {
                 .feeChargeSide(bussinessTransferOrder.getFeeChargeSide())
                 .usage(StringUtil.isBlank(bussinessTransferOrder.getTransferUsage()) ? "采购" : bussinessTransferOrder.getTransferUsage())
                 .build();
-        R result = yeePayService.transferOrder(transferOrderDto);
+        R result = yeePayService.transferOrder(transferOrderDto, parentMerchantNo);
         JSONObject data = JSONUtil.parseObj(result.getData());
         String requestNo = data.getStr("requestNo");
         String fromMerchantNo = data.getStr("fromMerchantNo");
@@ -161,7 +161,7 @@ public class BussinessPayService {
      * @return
      */
     @Async
-    public R payOrder(Long debitId){
+    public R payOrder(Long debitId, String parentMerchantNo){
         BussinessDebit debit = this.bussinessDebitService.getById(debitId);
         if(debit != null){
             String requestNo = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
@@ -177,7 +177,7 @@ public class BussinessPayService {
                 payOrderDto.setReceiverBankCode(debit.getReceiverBankCode());
                 payOrderDto.setBankAccountType(debit.getBankAccountType());
                 payOrderDto.setRequestNo(debit.getRequestNo());
-                R result = this.yeePayService.payOrder(payOrderDto);
+                R result = this.yeePayService.payOrder(payOrderDto, parentMerchantNo);
                 if(result.isSuccess()){
                     JSONObject data = JSONUtil.parseObj(result.getData());
                     String returnCode = data.getStr("returnCode");
@@ -216,7 +216,7 @@ public class BussinessPayService {
         }
     }
 
-    public R withdrawOrder(BussinessUserWithdraw withdraw){
+    public R withdrawOrder(BussinessUserWithdraw withdraw, String parentMerchantNo){
         WithdrawOrderDto withdrawOrderDto = WithdrawOrderDto.builder()
                 .orderAmount(withdraw.getOrderAmount().doubleValue())
                 .bankAccountNo(withdraw.getBankAccountNo())
@@ -224,7 +224,7 @@ public class BussinessPayService {
                 .receiveType(withdraw.getReceiveType())
                 .requestNo(withdraw.getRequestNo())
                 .build();
-        R result = yeePayService.withdrawOrder(withdrawOrderDto);
+        R result = yeePayService.withdrawOrder(withdrawOrderDto, parentMerchantNo);
         JSONObject data = JSONUtil.parseObj(result.getData());
         String status = data.getStr("status");
         String orderNo = data.getStr("orderNo");

+ 27 - 14
src/main/java/org/springblade/yeePay/service/YeePayService.java

@@ -330,10 +330,10 @@ public class YeePayService {
 	 *
 	 * @param bussinessRegisterRequest
 	 * @return*/
-	public R merchantRegister(BussinessRegisterRequest bussinessRegisterRequest){
+	public R merchantRegister(BussinessRegisterRequest bussinessRegisterRequest, String parentMerchantNo){
 		YopRequest request = new YopRequest(yeePayConst.getMerchantRegisterUrl(), "POST");
 		bussinessRegisterRequest.setNotifyUrl(yeePayConst.getMerchantRegisterNotify());
-		request.addParameter("parentMerchantNo",yeePayConst.getParentMerchantNo());
+		request.addParameter("parentMerchantNo",parentMerchantNo);
 		addParamsFromObj(bussinessRegisterRequest,request,bussinessRegisterRequest.getClass());
 		try {
 			R execute = execute(request);
@@ -351,10 +351,10 @@ public class YeePayService {
 	 *
 	 * @param bussinessRegisterRequest
 	 * @return*/
-	public R userRegister(BussinessRegisterRequest bussinessRegisterRequest){
+	public R userRegister(BussinessRegisterRequest bussinessRegisterRequest, String parentMerchantNo){
 		YopRequest request = new YopRequest(yeePayConst.getMerchantRegisterUrl(), "POST");
 		bussinessRegisterRequest.setNotifyUrl(yeePayConst.getUserRegisterNotify());
-		request.addParameter("parentMerchantNo",yeePayConst.getParentMerchantNo());
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(bussinessRegisterRequest,request,bussinessRegisterRequest.getClass());
 		try {
 			R execute = execute(request);
@@ -495,9 +495,9 @@ public class YeePayService {
 	/**
 	 * 	账户服务-转账-下单(商户间转账)
 	 * */
-	public R transferOrder(TransferOrderDto transferOrderDto){
+	public R transferOrder(TransferOrderDto transferOrderDto, String parentMerchantNo){
 		YopRequest request = new YopRequest(yeePayConst.getTransferOrderUrl(), "POST");
-		request.addParameter("parentMerchantNo", yeePayConst.getParentMerchantNo());
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		transferOrderDto.setNotifyUrl(yeePayConst.getTransferOrderNotify());
 		addParamsFromObj(transferOrderDto, request, transferOrderDto.getClass());
 		R execute = execute(request);
@@ -505,15 +505,28 @@ public class YeePayService {
 		log.info(JSONUtil.toJsonStr(execute));
 		return execute;
 	}
+	/**
+	 * 	账户服务-转账-查询(商户间转账)
+	 * */
+	public R transferQuery(TransferQueryDto transferQueryDto, String parentMerchantNo){
+		YopRequest request = new YopRequest(yeePayConst.getTransferOrderUrl(), "POST");
+		request.addParameter("parentMerchantNo", parentMerchantNo);
+		addParamsFromObj(transferQueryDto, request, transferQueryDto.getClass());
+		R execute = execute(request);
+		log.info("=========================商户转账查询-同步请求结果返回数据 =======================");
+		log.info(JSONUtil.toJsonStr(execute));
+		return execute;
+	}
+
 
 	/**
 	 *	代付:交易到银行卡(单笔出款)
 	 * @param payOrderDto 交易信息
 	 * */
-	public R payOrder(PayOrderDto payOrderDto) {
+	public R payOrder(PayOrderDto payOrderDto, String parentMerchantNo) {
 		YopRequest request = new YopRequest(yeePayConst.getPayOrderUrl(), "POST");
 		payOrderDto.setNotifyUrl(yeePayConst.getPayOrderNotify());
-		addMerchantNo(request);
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(payOrderDto,request, payOrderDto.getClass());
 		log.info("======================代付交易下发数据=====================");
 		log.info(JSONUtil.toJsonStr(request.getParameters()));
@@ -524,10 +537,10 @@ public class YeePayService {
 	 * 提现:从商户号提现到银行卡
 	 * @param withdrawOrderDto 交易信息
 	 * */
-	public R withdrawOrder(WithdrawOrderDto withdrawOrderDto) {
+	public R withdrawOrder(WithdrawOrderDto withdrawOrderDto, String parentMerchantNo) {
 		YopRequest request = new YopRequest(yeePayConst.getWithdrawOrderUrl(), "POST");
 		withdrawOrderDto.setNotifyUrl(yeePayConst.getWithdrawOrderNotify());
-		addMerchantNo(request);
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(withdrawOrderDto, request, withdrawOrderDto.getClass());
 		log.info("======================提现交易下发数据=====================");
 		log.info(JSONUtil.toJsonStr(request.getParameters()));
@@ -538,10 +551,10 @@ public class YeePayService {
 	 *	分润:交易到银行卡(单笔出款)
 	 * @param payOrderDto 交易信息
 	 * */
-	public R bonusOrder(PayOrderDto payOrderDto) {
+	public R bonusOrder(PayOrderDto payOrderDto, String parentMerchantNo) {
 		YopRequest request = new YopRequest(yeePayConst.getPayOrderUrl(), "POST");
 		payOrderDto.setNotifyUrl(yeePayConst.getBonusOrderNotify());
-		addMerchantNo(request);
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(payOrderDto,request, payOrderDto.getClass());
 		log.info("======================代付交易下发数据=====================");
 		log.info(JSONUtil.toJsonStr(request.getParameters()));
@@ -552,10 +565,10 @@ public class YeePayService {
 	 *	产品费率变更
 	 * @param productFeeModifyDto 变更信息
 	 * */
-	public R productFeeModify(ProductFeeModifyDto productFeeModifyDto) {
+	public R productFeeModify(ProductFeeModifyDto productFeeModifyDto, String parentMerchantNo) {
 		YopRequest request = new YopRequest(yeePayConst.getProductFeeModifyUrl(), "POST");
 		productFeeModifyDto.setNotifyUrl(yeePayConst.getMerchantRegisterNotify());
-		addMerchantNo(request);
+		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(productFeeModifyDto,request, productFeeModifyDto.getClass());
 		log.info("======================产品费率变更下发数据=====================");
 		log.info(JSONUtil.toJsonStr(request.getParameters()));

+ 2 - 1
src/main/resources/payConfig.properties

@@ -13,7 +13,7 @@ pay.secret = MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMk5bBLo0tZ3JYVU77/
 #yee-pay.parentMerchantNo = 10086066206
 #yee-pay.merchantNo = 10086066206
 
-yee-pay.parentMerchantNo = 10086160953
+yee-pay.parentMerchantNo = 10086175627
 yee-pay.sm4Key = M0huZkdCZHhSU0h6YVF3aQ==
 yee-pay.weChatConfigAddUrl = /rest/v2.0/aggpay/wechat-config/add
 yee-pay.weChatConfigQueryUrl = /rest/v2.0/aggpay/wechat-config/query
@@ -36,6 +36,7 @@ yee-pay.transferOrderUrl = /rest/v1.0/account/transfer/b2b/order
 yee-pay.payOrderUrl = /rest/v1.0/account/pay/order
 yee-pay.withdrawOrderUrl = /rest/v1.0/account/withdraw/order
 yee-pay.productFeeModifyUrl = /rest/v2.0/mer/product/fee/modify
+yee-pay.transferQueryUrl = /rest/v1.0/account/transfer/b2b/query
 yee-pay.merchantRegisterNotify = https://music.nanyue6688.com/api/yeePay/merchant/register/notify
 yee-pay.rechargeOrderNotify = https://music.nanyue6688.com/api/yeePay/recharge/order/notify
 yee-pay.transferOrderNotify = https://music.nanyue6688.com/api/yeePay/transfer/order/notify