Преглед изворни кода

1、提供进件和代付API

billisme пре 4 година
родитељ
комит
b8d1c4e444
44 измењених фајлова са 2130 додато и 367 уклоњено
  1. 11 1
      src/main/java/org/springblade/common/constant/SystemConstant.java
  2. 2 0
      src/main/java/org/springblade/modules/guosen/bankcode/service/IBankCodeService.java
  3. 7 0
      src/main/java/org/springblade/modules/guosen/bankcode/service/impl/BankCodeServiceImpl.java
  4. 9 4
      src/main/java/org/springblade/modules/guosen/billRecord/controller/BillRecordController.java
  5. 9 3
      src/main/java/org/springblade/modules/guosen/billRecord/service/impl/BillRecordServiceImpl.java
  6. 5 38
      src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessBonusRecordsController.java
  7. 8 3
      src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessController.java
  8. 18 0
      src/main/java/org/springblade/modules/guosen/bussiness/entity/Bussiness.java
  9. 1 1
      src/main/java/org/springblade/modules/guosen/bussiness/entity/BussinessBonusAccount.java
  10. 0 5
      src/main/java/org/springblade/modules/guosen/bussiness/excel/DebitRequestExcel.java
  11. 60 0
      src/main/java/org/springblade/modules/guosen/bussiness/excel/WithdrawRequestExcel.java
  12. 1 1
      src/main/java/org/springblade/modules/guosen/bussiness/mapper/BussinessBonusAccountMapper.xml
  13. 3 0
      src/main/java/org/springblade/modules/guosen/bussiness/mapper/BussinessMapper.xml
  14. 113 1
      src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessBonusRecordsServiceImpl.java
  15. 1 1
      src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessDebitRequestServiceImpl.java
  16. 6 1
      src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessServiceImpl.java
  17. 2 3
      src/main/java/org/springblade/modules/guosen/bussinessRegisterRequest/service/impl/BussinessRegisterRequestServiceImpl.java
  18. 7 4
      src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/impl/BussinessTransferOrderServiceImpl.java
  19. 75 4
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/controller/BussinessUserInfoController.java
  20. 5 4
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/entity/BussinessUserInfo.java
  21. 11 0
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/IBussinessUserInfoService.java
  22. 121 1
      src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/impl/BussinessUserInfoServiceImpl.java
  23. 93 6
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/controller/BussinessUserWithdrawController.java
  24. 2 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/dto/BussinessUserWithdrawDTO.java
  25. 7 2
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/entity/BussinessUserWithdraw.java
  26. 78 0
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/excel/WithdrawExcel.java
  27. 7 1
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/IBussinessUserWithdrawService.java
  28. 32 7
      src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/impl/BussinessUserWithdrawServiceImpl.java
  29. 63 66
      src/main/java/org/springblade/modules/time/TimeTask.java
  30. 4 0
      src/main/java/org/springblade/yeePay/common/YeePayConst.java
  31. 422 89
      src/main/java/org/springblade/yeePay/controller/BussinessPayController.java
  32. 1 1
      src/main/java/org/springblade/yeePay/entity/PayToUserDto.java
  33. 3 0
      src/main/java/org/springblade/yeePay/entity/RechargeDto.java
  34. 55 0
      src/main/java/org/springblade/yeePay/entity/UserRegisterDto.java
  35. 46 0
      src/main/java/org/springblade/yeePay/entity/UserSubmitDto.java
  36. 30 0
      src/main/java/org/springblade/yeePay/entity/WithdrawCardBindDto.java
  37. 29 0
      src/main/java/org/springblade/yeePay/entity/WithdrawCardModifyDto.java
  38. 7 1
      src/main/java/org/springblade/yeePay/listener/RechargeOrderNotifyListener.java
  39. 12 1
      src/main/java/org/springblade/yeePay/listener/RechargeServiceFeeTransferNotifyListener.java
  40. 2 40
      src/main/java/org/springblade/yeePay/listener/TransferOrderNotifyListener.java
  41. 195 28
      src/main/java/org/springblade/yeePay/listener/UserRegisterNotifyListener.java
  42. 523 45
      src/main/java/org/springblade/yeePay/service/BussinessPayService.java
  43. 38 3
      src/main/java/org/springblade/yeePay/service/YeePayService.java
  44. 6 2
      src/main/resources/payConfig.properties

+ 11 - 1
src/main/java/org/springblade/common/constant/SystemConstant.java

@@ -87,7 +87,8 @@ public interface SystemConstant {
 		CANCEL("取消",2),
 		FAIL("失败", 3),
 		ERROR("系统异常", 4),
-		HANDLING("处理中", 5);
+		HANDLING("处理中", 5),
+		ACCOUNTING_EXCEPTION("充值处理中-入账异常", 6);
 
 
 		String name;
@@ -332,6 +333,15 @@ public interface SystemConstant {
 			this.name = name;
 			this.value = value;
 		}
+
+		public static String getNameByValue(Integer value){
+			for (WithdrawOrderStatus item : WithdrawOrderStatus.values()) {
+				if(item.getValue().equals(value)){
+					return item.getName();
+				}
+			}
+			return null;
+		}
 	}
 
 	/**

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

@@ -42,4 +42,6 @@ public interface IBankCodeService extends IService<BankCode> {
 
 	List<BankCode> listBankCode(String name);
 
+	List<BankCode> getByBankCode(String bankCode);
+
 }

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

@@ -49,4 +49,11 @@ public class BankCodeServiceImpl extends ServiceImpl<BankCodeMapper, BankCode> i
 		return baseMapper.selectList(lambda);
 	}
 
+	@Override
+	public List<BankCode> getByBankCode(String bankCode) {
+		LambdaQueryWrapper<BankCode> lambda = new LambdaQueryWrapper<>();
+		lambda.eq(BankCode::getCode, bankCode);
+		return list(lambda);
+	}
+
 }

+ 9 - 4
src/main/java/org/springblade/modules/guosen/billRecord/controller/BillRecordController.java

@@ -53,6 +53,7 @@ import org.springblade.modules.guosen.bussinessGoods.entity.BussinessGoods;
 import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
 import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessPurchaseRecord.service.IBussinessPurchaseRecordService;
+import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUserWithdraw;
 import org.springblade.yeePay.entity.PayGateWayDto;
 import org.springblade.yeePay.entity.RechargeDto;
 import org.springblade.yeePay.service.YeePayService;
@@ -178,8 +179,7 @@ public class BillRecordController extends BladeController {
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "新增", notes = "传入billRecord")
 	@AccessLimit(second = 2, maxCount = 1)
-	public R adSave(@Valid @RequestBody BillRecordDTO billRecord) {
-		BladeUser user = AuthUtil.getUser();
+	public R adSave(@Valid @RequestBody BillRecordDTO billRecord) {BladeUser user = AuthUtil.getUser();
 		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
 				.eq(Bussiness::getAccountId, user.getUserId()));
 		Assert.notNull(bussiness,"当前账号为非采购商");
@@ -281,8 +281,13 @@ public class BillRecordController extends BladeController {
 	 */
 	@GetMapping("/billStat")
 	@ApiOperationSupport(order = 9)
-	@ApiOperation(value = "分润统计", notes = "传入billRecord")
-	public R<BigDecimal> billStat(BillRecord billRecord) {
+	@ApiOperation(value = "采购统计", notes = "传入billRecord")
+	public R<BigDecimal> billStat(BillRecord billRecord, BladeUser bladeUser) {
+		String roleName = bladeUser.getRoleName();
+		if(roleName.equals("商户")){
+			Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda().eq(Bussiness::getAccountId, bladeUser.getUserId()));
+			billRecord.setUserId(bussiness.getId());
+		}
 		BigDecimal billStat = billRecordService.billStat(billRecord);
 		return R.data(billStat);
 	}

+ 9 - 3
src/main/java/org/springblade/modules/guosen/billRecord/service/impl/BillRecordServiceImpl.java

@@ -42,6 +42,8 @@ import org.springblade.modules.guosen.billRecord.service.IBillRecordService;
 import org.springblade.modules.guosen.billRecord.vo.BillRecordVO;
 import org.springblade.modules.guosen.billRecord.vo.OrderWebVO;
 import org.springblade.modules.guosen.bussiness.entity.Bussiness;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
+import org.springblade.modules.guosen.bussinessInfo.service.IBussinessInfoService;
 import org.springblade.modules.guosen.bussinessPurchaseRecord.service.IBussinessPurchaseRecordService;
 import org.springblade.modules.guosen.loginUser.entity.LoginUser;
 import org.springblade.modules.guosen.loginUser.service.ILoginUserService;
@@ -97,6 +99,8 @@ public class BillRecordServiceImpl extends BaseServiceImpl<BillRecordMapper, Bil
 	private IBussinessPurchaseRecordService bussinessPurchaseRecordService;
 	@Autowired
 	private YeePayService yeePayService;
+	@Autowired
+	private IBussinessInfoService bussinessInfoService;
 
 
 
@@ -201,10 +205,10 @@ public class BillRecordServiceImpl extends BaseServiceImpl<BillRecordMapper, Bil
 		}
 		LambdaQueryWrapper<BillRecord> lambda = Condition.getQueryWrapper(billRecord).lambda();
 		lambda.like(createTime != null, BillRecord::getCreateTime, createTimeFormat);
-		lambda.eq(BillRecord::getStatus, SystemConstant.BillRecordPayStatus.PAYED.getValue());
+		lambda.eq(BillRecord::getPayStatus, SystemConstant.BillRecordPayStatus.PAYED.getValue());
 		lambda.eq(BillRecord::getType, SystemConstant.BillRecordType.ADS.getValue());
 		List<BillRecord> list = baseMapper.selectList(lambda);
-		BigDecimal stat = list.stream().map(debit -> debit.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal stat = list.stream().map(item -> item.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
 		return stat;
 	}
 
@@ -216,12 +220,14 @@ public class BillRecordServiceImpl extends BaseServiceImpl<BillRecordMapper, Bil
 		BigDecimal price = billRecordDTO.getPrice();
 		BigDecimal bussinessFee = serviceRate.multiply(price).divide(new BigDecimal(1000));
 		billRecordDTO.setBussinessFee(bussinessFee);
+		billRecordDTO.setPayStatus(SystemConstant.BillRecordPayStatus.PAYING.getValue());
 		boolean save = this.save(billRecordDTO);
 		if(save){
 			boolean purchase = bussinessPurchaseRecordService.purchase(billRecordDTO.getPurchaseList(), bussiness, billRecordDTO.getOrderId(), billRecordDTO.getId());
 			if(purchase){
+				BussinessInfo parentBussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getParentBussinessId());
 				RechargeDto rechargeDto = new RechargeDto();
-				rechargeDto.setMerchantNo(bussiness.getMerchantNo());
+				rechargeDto.setParentMerchantNo(parentBussinessInfo.getMerchantNo());
 				rechargeDto.setAmount(price.doubleValue());
 				rechargeDto.setMerchantNo(bussiness.getMerchantNo());
 				rechargeDto.setPayType("B2B");

+ 5 - 38
src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessBonusRecordsController.java

@@ -50,6 +50,7 @@ import org.springblade.modules.guosen.withdrawRecords.service.IWithdrawRecordsSe
 import org.springblade.modules.system.service.IParamService;
 import org.springblade.yeePay.common.YeePayConst;
 import org.springblade.yeePay.entity.PayOrderDto;
+import org.springblade.yeePay.service.BussinessPayService;
 import org.springblade.yeePay.service.YeePayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -95,9 +96,9 @@ public class BussinessBonusRecordsController extends BladeController {
 	@Autowired
 	private IBussinessTransferOrderService transferOrderService;
 	@Autowired
-	private YeePayConst yeePayConst;
-	@Autowired
 	private IBussinessUserInfoService userInfoService;
+	@Autowired
+	private BussinessPayService bussinessPayService;
 
 	/**
 	 * 详情
@@ -341,41 +342,7 @@ public class BussinessBonusRecordsController extends BladeController {
 	@ApiOperationSupport(order = 10)
 	@ApiOperation(value = "分润", notes = "传入bussinessBonusRecords")
 	public R withdrawForBonus(@Valid @RequestBody BussinessBonusRecordsDTO bussinessBonusRecordsDTO){
-		BussinessBonusRecords record = bussinessBonusRecordsService.getById(bussinessBonusRecordsDTO.getId());
-		//分佣
-		Assert.isFalse(record.getBonusStatus() == SystemConstant.BussinessBonusStatus.SUCCESS.getValue()
-						|| record.getBonusStatus() == SystemConstant.BussinessBonusStatus.BONUSING.getValue(),
-				"不能重复分配");
-		BigDecimal price = bussinessBonusRecordsDTO.getPrice();
-		if(record.getPrice().compareTo(price) == -1){
-			R.fail("分润金额不能高于可分润金额");
-		}
-		String withdrawRate = paramService.getValue("yee_withdraw_rate");
-		String transferRate = paramService.getValue("yee_transfer_rate");
-		DecimalFormat decimalFormat = new DecimalFormat("0.00");
-		BigDecimal transferFee = new BigDecimal(decimalFormat.format(Double.parseDouble(transferRate)));
-		BigDecimal withdrawFee = new BigDecimal(decimalFormat.format(Double.parseDouble(withdrawRate)));
-		BigDecimal transferAmount = record.getPrice().add(transferFee).add(withdrawFee);
-		if(record.getPrice().compareTo(transferAmount) == -1){
-			return R.fail("可分润金额不足以抵扣手续费");
-		}
-		Long userInfoId = record.getUserInfoId();
-		BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
-		if(!userInfo.isRegisterSuccess()){
-			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(), userInfo.getParentMerchantNo());
-		record.setTransferOrderId(transferOrderR.getData().getId());
-		record.setFailReason(transferOrderR.getData().getReturnMsg());
-		if(transferOrderR.isSuccess()){
-			record.setBonusStatus(SystemConstant.BussinessBonusStatus.BONUSING.getValue());
-			this.bussinessBonusRecordsService.updateById(record);
-			return R.success("受理成功,请等待结果");
-		}else{
-			record.setBonusStatus(SystemConstant.BussinessBonusStatus.FAIL.getValue());
-			this.bussinessBonusRecordsService.updateById(record);
-			return R.fail("受理失败");
-		}
+		R result = this.bussinessBonusRecordsService.withdrawForBonus(bussinessBonusRecordsDTO);
+		return  result;
 	}
 }

+ 8 - 3
src/main/java/org/springblade/modules/guosen/bussiness/controller/BussinessController.java

@@ -253,9 +253,14 @@ public class BussinessController extends BladeController {
 		Bussiness bussiness = bussinessService.getById(bussinessId);
 		Assert.notNull(bussiness, "商户不存在");
 		BladeUser user = AuthUtil.getUser();
-		if(user.getRoleName().equals("商户") || user.getRoleName().equals("财务管理") || user.getRoleName().equals("超级管理员")){ //入驻商查询余额
+		if(user.getRoleName().equals("商户") || user.getRoleName().equals("财务管理") || user.getRoleName().equals("administrator")){ //入驻商查询余额
 			if(StringUtil.isNoneBlank(bussiness.getMerchantNo()) && bussiness.getRegisterStatus().intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
-				return bussinessService.queryBalance(bussiness.getMerchantNo());
+				R<BigDecimal> newRemainR = bussinessService.queryBalance(bussiness.getMerchantNo());
+				BigDecimal newRemain = newRemainR.getData();
+				bussiness.setRemain(MoneyDesUtil.encrypt(newRemain.toString(), MoneyDesUtil.KEY_FOR_UC));
+				//修改商户余额信息
+				bussinessService.updateById(bussiness);
+				return newRemainR;
 			}else{
 				return R.fail("请先完成商户进件");
 			}
@@ -273,7 +278,7 @@ public class BussinessController extends BladeController {
 	public R<BigDecimal> queryPlatformBalance() {
 		BladeUser user = AuthUtil.getUser();
 		if(user.getRoleName().equals("财务管理") || user.getRoleName().equals("administrator")){//运营查询平台商余额
-			return bussinessService.queryBalance(yeePayConst.getParentMerchantNo());
+			return bussinessService.queryBalance(null);
 		}else{
 			return R.fail("无权限查看");
 		}

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

@@ -162,6 +162,24 @@ public class Bussiness extends BaseEntity {
 	@ApiModelProperty(value = "产品策略ID")
 	private Long rateStrategyId;
 
+	/**
+	 * 入驻商产品策略ID
+	 */
+	@ApiModelProperty(value = "入驻商产品策略ID")
+	private Long subRateStrategyId;
+
+	/**
+	 * 入驻商产品策略ID
+	 */
+	@ApiModelProperty(value = "小微商产品策略ID")
+	private Long microRateStrategyId;
+
+	/**
+	 * 入驻商产品策略ID
+	 */
+	@ApiModelProperty(value = "采购商进件回调通知")
+	private String registerNotifyUrl;
+
 
 
 

+ 1 - 1
src/main/java/org/springblade/modules/guosen/bussiness/entity/BussinessBonusAccount.java

@@ -77,7 +77,7 @@ public class BussinessBonusAccount extends BaseEntity {
 	@ApiModelProperty(value = "进件用户ID")
 	String userInfoId;
 
-	@ApiModelProperty(value = "商户ID")
+	@ApiModelProperty(value = "所属平台商户")
 	String bussinessId;
 
 	@ApiModelProperty(value = "签约用户名")

+ 0 - 5
src/main/java/org/springblade/modules/guosen/bussiness/excel/DebitRequestExcel.java

@@ -1,18 +1,13 @@
 package org.springblade.modules.guosen.bussiness.excel;
 
-import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.ContentRowHeight;
 import com.alibaba.excel.annotation.write.style.HeadRowHeight;
-import com.alibaba.excel.metadata.BaseRowModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
 import java.io.Serializable;
-import java.util.Date;
 
 /**
  * Created By lidexi in 2021/7/20

+ 60 - 0
src/main/java/org/springblade/modules/guosen/bussiness/excel/WithdrawRequestExcel.java

@@ -0,0 +1,60 @@
+package org.springblade.modules.guosen.bussiness.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created By lidexi in 2021/7/20
+ **/
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class WithdrawRequestExcel implements Serializable {
+
+
+	@ApiModelProperty(value = "单位:元,非负浮点数,保留2位小数,示例值:1000.00",required = true)
+	@ExcelProperty("付款金额(元)")
+	@ColumnWidth(25)
+	Double orderAmount;
+
+	@ApiModelProperty(required = true)
+	@ExcelProperty("收款人姓名")
+	@ColumnWidth(25)
+	String userName;
+
+	@ApiModelProperty(required = true)
+	@ExcelProperty("收款人手机号码")
+	@ColumnWidth(25)
+	String userPhone;
+
+	@ExcelProperty("银行总行编号")
+	@ColumnWidth(25)
+	String bankCode;
+
+	@ExcelProperty("银行卡号")
+	@ColumnWidth(25)
+	String bankCardNo;
+
+	@ApiModelProperty(required = true)
+	@ExcelProperty("身份证号")
+	@ColumnWidth(25)
+	String 	userLicenceNo;
+
+	@ApiModelProperty(required = true)
+	@ExcelProperty("身份证件正面照URL")
+	@ColumnWidth(25)
+	String 	userCardFrontUrl;
+
+	@ApiModelProperty(required = true)
+	@ExcelProperty("身份证件反面照URL")
+	@ColumnWidth(25)
+	String 	userCardBackUrl;
+
+}

+ 1 - 1
src/main/java/org/springblade/modules/guosen/bussiness/mapper/BussinessBonusAccountMapper.xml

@@ -16,8 +16,8 @@
         <result column="rate" property="rate"/>
         <result column="user_info_id" property="userInfoId"/>
         <result column="bussiness_id" property="bussinessId"/>
-        <result column="bussiness_name" property="bussinessName"/>
         <result column="user_info_name" property="userInfoName"/>
+        <result column="bussiness_name" property="bussinessName"/>
     </resultMap>
 
 

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

@@ -30,6 +30,9 @@
         <result column="parent_bussiness_id" property="parentBussinessId"/>
         <result column="bussiness_type" property="bussinessType"/>
         <result column="rate_strategy_id" property="rateStrategyId"/>
+        <result column="sub_rate_strategy_id" property="subRateStrategyId"/>
+        <result column="micro_rate_strategy_id" property="microRateStrategyId"/>
+        <result column="register_notify_url" property="registerNotifyUrl"/>
     </resultMap>
 
 

+ 113 - 1
src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessBonusRecordsServiceImpl.java

@@ -16,18 +16,36 @@
  */
 package org.springblade.modules.guosen.bussiness.service.impl;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.common.constant.SystemConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.modules.guosen.bussiness.dto.BussinessBonusRecordsDTO;
+import org.springblade.modules.guosen.bussiness.entity.BussinessBonusAccount;
 import org.springblade.modules.guosen.bussiness.entity.BussinessBonusRecords;
+import org.springblade.modules.guosen.bussiness.service.IBussinessBonusAccountService;
 import org.springblade.modules.guosen.bussiness.vo.BussinessBonusRecordsVO;
 import org.springblade.modules.guosen.bussiness.mapper.BussinessBonusRecordsMapper;
 import org.springblade.modules.guosen.bussiness.service.IBussinessBonusRecordsService;
 import org.springblade.core.mp.base.BaseServiceImpl;
 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.entity.BussinessUserWithdraw;
+import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
+import org.springblade.modules.system.service.IParamService;
+import org.springblade.yeePay.service.BussinessPayService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.UUID;
+
 /**
  *  服务实现类
  *
@@ -37,6 +55,19 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 @Service
 public class BussinessBonusRecordsServiceImpl extends BaseServiceImpl<BussinessBonusRecordsMapper, BussinessBonusRecords> implements IBussinessBonusRecordsService {
 
+	@Autowired
+	private IParamService paramService;
+	@Autowired
+	private IBussinessUserInfoService userInfoService;
+	@Autowired
+	private IBussinessUserWithdrawService withdrawService;
+	@Autowired
+	private IBussinessTransferOrderService transferOrderService;
+	@Autowired
+	private IBussinessBonusAccountService accountService;
+	@Autowired
+	private BussinessPayService bussinessPayService;
+
 	@Override
 	public IPage<BussinessBonusRecordsVO> selectBussinessBonusRecordsPage(IPage<BussinessBonusRecordsVO> page, BussinessBonusRecordsVO bussinessBonusRecords) {
 		return page.setRecords(baseMapper.selectBussinessBonusRecordsPage(page, bussinessBonusRecords));
@@ -49,7 +80,88 @@ public class BussinessBonusRecordsServiceImpl extends BaseServiceImpl<BussinessB
 
 	@Override
 	public R withdrawForBonus(BussinessBonusRecordsDTO recordsDTO) {
-		return null;
+		BussinessBonusRecords record = this.getById(recordsDTO.getId());
+		//分佣
+		Assert.isFalse(record.getBonusStatus() == SystemConstant.BussinessBonusStatus.SUCCESS.getValue()
+										|| record.getBonusStatus() == SystemConstant.BussinessBonusStatus.BONUSING.getValue(),
+						"不能重复分配");
+		BigDecimal price = recordsDTO.getPrice();
+		if(record.getPrice().compareTo(price) == -1){
+			R.fail("分润金额不能高于可分润金额");
+		}
+		String withdrawRate = paramService.getValue("yee_withdraw_rate");
+		String transferRate = paramService.getValue("yee_transfer_rate");
+		DecimalFormat decimalFormat = new DecimalFormat("0.00");
+		BigDecimal transferFee = new BigDecimal(decimalFormat.format(Double.parseDouble(transferRate)));
+		BigDecimal withdrawFee = new BigDecimal(decimalFormat.format(Double.parseDouble(withdrawRate)));
+		BigDecimal transferAmount = record.getPrice().add(transferFee).add(withdrawFee);
+		if(record.getPrice().compareTo(transferAmount) == -1){
+			return R.fail("可分润金额不足以抵扣手续费");
+		}
+		Long userInfoId = record.getUserInfoId();
+		BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
+		if(!userInfo.isRegisterSuccess()){
+			return R.fail("该用户未完成进件");
+		}
+		BussinessBonusAccount account = this.accountService.getById(record.getBonusAccountId());
+		//1、创建转账单
+		BussinessTransferOrder transferOrder = new BussinessTransferOrder();
+		transferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+		transferOrder.setTransferScene(SystemConstant.TransferScene.FOR_BONUS_TRANSFER.getValue());
+		transferOrder.setFeeChargeSide("feeChargeSide");
+		transferOrder.setOrderAmount(transferAmount.toString());
+		transferOrder.setTransferUsage("采购");
+		transferOrder.setFromMerchantNo(userInfo.getParentMerchantNo());
+		transferOrder.setToMerchantNo(userInfo.getMerchantNo());
+		transferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+		boolean transferSave = this.transferOrderService.save(transferOrder);
+		if(transferSave){
+			//2、创建提现单
+			BussinessUserWithdraw withdraw = new BussinessUserWithdraw();
+			withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.WAIT.getValue());
+			withdraw.setBussinessId(userInfo.getBussinessId());
+			withdraw.setBankCode(account.getReceiverBankCode());
+			withdraw.setBankAccountNo(account.getReceiverAccountNo());
+			withdraw.setReceiveType("REAL_TIME");
+			withdraw.setReceiverAccountName(account.getReceiverAccountName());
+			withdraw.setMerchantNo(userInfo.getMerchantNo());
+			withdraw.setUserInfoId(userInfoId);
+			withdraw.setOrderAmount(record.getPrice());
+			withdraw.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+			withdraw.setSecondTransferOrderId(transferOrder.getId());
+			withdraw.setBussinessId(userInfo.getBussinessId());
+			this.withdrawService.save(withdraw);
+			R secondTransferResult = this.transferOrderService.transferOrder(transferOrder, userInfo.getParentMerchantNo());
+			if(secondTransferResult.isSuccess()){
+				if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+					this.bussinessPayService.handleSecondTransferScene(transferOrder.getId());
+					return R.status(true);
+				}else if(secondTransferResult.getMsg().equals("SUCCESS")){
+					R withdrawResult = this.bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+					record.setFailReason(withdrawResult.getMsg());
+					record.setThirdPayLog(withdraw.getThirdLog());
+					if(withdrawResult.isSuccess()){
+						record.setThirdOrderNo(withdraw.getThirdOrderNo());
+						record.setBonusStatus(SystemConstant.BussinessBonusStatus.BONUSING.getValue());
+					}else{
+						record.setBonusStatus(SystemConstant.BussinessBonusStatus.FAIL.getValue());
+					}
+					this.withdrawService.updateById(withdraw);
+					return R.status(true);
+				}else{
+					return R.status(true);
+				}
+			}else{
+				withdraw.setFailReason("分润失败");
+				withdraw.setReturnMsg(secondTransferResult.getMsg());
+				withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+				this.withdrawService.updateById(withdraw);
+				record.setBonusStatus(SystemConstant.BussinessBonusStatus.FAIL.getValue());
+				return R.fail("分润失败");
+			}
+		}else{
+			return R.fail("保存数据失败");
+		}
 	}
 
 	@Override

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

@@ -227,7 +227,7 @@ public class BussinessDebitRequestServiceImpl extends BaseServiceImpl<BussinessD
 			for (BussinessDebit debit : bussinessDebits) {
 				BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
 				bussinessTransferOrder.setFromMerchantNo(bussiness.getMerchantNo());
-				bussinessTransferOrder.setToMerchantNo(yeePayConst.getParentMerchantNo());
+				bussinessTransferOrder.setToMerchantNo(parentMerchantNo);
 				bussinessTransferOrder.setTransferUsage("采购");
 				bussinessTransferOrder.setOrderAmount(debit.getPrice().toString());
 				bussinessTransferOrder.setFeeChargeSide("OUTSIDE");

+ 6 - 1
src/main/java/org/springblade/modules/guosen/bussiness/service/impl/BussinessServiceImpl.java

@@ -51,6 +51,7 @@ import org.springframework.util.Assert;
 
 import java.io.*;
 import java.math.BigDecimal;
+import java.text.DecimalFormat;
 import java.util.List;
 import java.util.UUID;
 
@@ -146,6 +147,8 @@ public class BussinessServiceImpl extends BaseServiceImpl<BussinessMapper, Bussi
 			oldEntity.setBussinessType(bussiness.getBussinessType());
 			oldEntity.setParentBussinessId(bussiness.getParentBussinessId());
 			oldEntity.setRateStrategyId(bussiness.getRateStrategyId());
+			oldEntity.setSubRateStrategyId(bussiness.getSubRateStrategyId());
+			oldEntity.setMicroRateStrategyId(bussiness.getMicroRateStrategyId());
 			return this.updateById(oldEntity);
 		}
 
@@ -193,6 +196,7 @@ public class BussinessServiceImpl extends BaseServiceImpl<BussinessMapper, Bussi
 		}
 	}
 
+	//TODO 调试专用
 	@Override
 	public R<BigDecimal> queryBalance(String merchantNo) {
 		BigDecimal balance = new BigDecimal(0.00);
@@ -206,7 +210,8 @@ public class BussinessServiceImpl extends BaseServiceImpl<BussinessMapper, Bussi
 				String accountType = accountInfo.getStr("accountType");
 				if(accountType.equals("FUND_ACCOUNT")){
 					Double yeeBalance = accountInfo.getDouble("balance");
-					balance = balance.add(new BigDecimal(yeeBalance));
+					DecimalFormat decimalFormat = new DecimalFormat("0.00");
+					balance = balance.add(new BigDecimal(decimalFormat.format(yeeBalance)));
 				}
 			}
 			log.info("=================查询商户<" + merchantNo + ">资金账户余额:" + balance.toString());

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

@@ -76,8 +76,6 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 	@Autowired
 	private IParamService paramService;
 	@Autowired
-	private IDictBizService dictBizService;
-	@Autowired
 	private IBussinessUserInfoService userInfoService;
 	@Autowired
 	private IProductRateStrategyService productRateStrategyService;
@@ -208,11 +206,11 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 			BussinessRegisterRequest bussinessRegisterRequest = this.getById(registerRequestId);
 			bussinessRegisterRequest.setMerchantSubjectInfo(userInfo.toMerchantSubjectInfo());
 			bussinessRegisterRequest.setBusinessAddressInfo(userInfo.toBusinessAddressInfo());
-			bussinessRegisterRequest.setMerchantCorporationInfo(userInfo.toMerchantCorporationInfo());
 			bussinessRegisterRequest.setAccountInfo(userInfo.toAccountInfo());
 			bussinessRegisterRequest.setProductInfo(rateStrategy.getProductRateJson());
 			bussinessRegisterRequest.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
 			this.handleUserProductInfo(userInfo);
+			bussinessRegisterRequest.setMerchantCorporationInfo(userInfo.toMerchantCorporationInfo());
 			R result = this.yeePayService.userRegister(bussinessRegisterRequest, userInfo.getParentMerchantNo());
 			JSONObject resultData = JSONUtil.parseObj(result.getData());
 			String returnCode = resultData.getStr("returnCode");
@@ -229,6 +227,7 @@ public class BussinessRegisterRequestServiceImpl extends BaseServiceImpl<Bussine
 				bussinessRegisterRequest.setReturnMsg(returnMsg);
 				bussinessRegisterRequest.setAuditOpinion(returnMsg);
 				userInfo.setRegisterStatus(SystemConstant.BussinessRegisterStatus.SUBMIT_FAIL.getValue());
+				userInfo.setAuditOpinion(returnMsg);
 				userInfoService.updateById(userInfo);
 				this.baseMapper.updateById(bussinessRegisterRequest);
 				return R.fail(returnMsg);

+ 7 - 4
src/main/java/org/springblade/modules/guosen/bussinessTransferOrder/service/impl/BussinessTransferOrderServiceImpl.java

@@ -89,12 +89,15 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 			dbTransferOrder.setDebitAmount(data.getStr("debitAmount"));
 			dbTransferOrder.setFeeMerchantNo(data.getStr("feeMerchantNo"));
 			dbTransferOrder.setReceiveAmount(data.getStr("receiveAmount"));
+			dbTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
 			if("REQUEST_RECEIVE".equals(transferStatus)){
 				dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue());
 				this.updateById(dbTransferOrder);
-				return R.status(true);
+				return R.success("REQUEST_RECEIVE");
 			}else if("SUCCESS".equals(transferStatus)){
-				return R.status(true);
+				dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.SUCCESS.getValue());
+				this.updateById(dbTransferOrder);
+				return R.success("SUCCESS");
 			}else if("FAIL".equals(transferStatus)){
 				dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
 				this.updateById(dbTransferOrder);
@@ -199,7 +202,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 			JSONObject data = JSONUtil.parseObj(transferResult.getData());
 			BussinessTransferOrder dbTransferOrder = this.getByRequestNo(data.getStr("requestNo"), data.getStr("fromMerchantNo"));
 			if(dbTransferOrder == null){
-				log.error("=================充值服务费转账请求响应,转账订单不存在====================");
+				log.error("=================转账请求响应,转账订单不存在====================");
 				log.error("转账请求号:" + data.getStr("requestNo") + ", 转出商户号:" + data.getStr("fromMerchantNo"));
 				return R.fail("TF订单查询失败");
 			}
@@ -226,7 +229,7 @@ public class BussinessTransferOrderServiceImpl extends BaseServiceImpl<Bussiness
 				}
 				return R.data(dbTransferOrder);
 			}else{
-				log.error("=================充值服务费转账请求响应转账下单失败====================");
+				log.error("=================转账请求响应转账下单失败====================");
 				log.error("转账请求号:" + requestNo + ", 转出商户号:" + fromMerchantNo + ", 失败原因:" + data.getStr("returnMsg"));
 				dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
 				dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());

+ 75 - 4
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/controller/BussinessUserInfoController.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.modules.guosen.bussinessuserinfo.controller;
 
+import cn.hutool.core.lang.Assert;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import io.swagger.annotations.Api;
@@ -35,11 +36,7 @@ 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.vo.SimpleBussinessInfoVO;
-import org.springblade.modules.guosen.bussinessRegisterRequest.service.IBussinessRegisterRequestService;
 import org.springblade.modules.guosen.bussinessuserinfo.vo.SimpleBussinessUserInfoVO;
-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;
@@ -49,6 +46,7 @@ import org.springblade.modules.guosen.bussinessuserinfo.wrapper.BussinessUserInf
 import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserInfoService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -149,9 +147,23 @@ public class BussinessUserInfoController extends BladeController {
 		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
 						.eq(Bussiness::getAccountId, user.getUserId()));
 		Assert.notNull(bussiness, "当前账号为非采购商");
+		Integer registerStatus = bussiness.getRegisterStatus();
+		if(registerStatus.intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			return R.fail("请先完成商户进件审核");
+		}
+		String parentMerchantNo = null;
+		if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue()){
+			parentMerchantNo = bussiness.getMerchantNo();
+			bussinessUserInfo.setRateStrategyId(bussiness.getMicroRateStrategyId());
+		}else{
+			Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+			parentMerchantNo = parentBussiness.getMerchantNo();
+			bussinessUserInfo.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+		}
 		bussinessUserInfo.setBussinessId(bussiness.getId());
 		bussinessUserInfo.setUserShortName(bussinessUserInfo.getUserName());
 		bussinessUserInfo.setUserLicenceType("ID_CARD");
+		bussinessUserInfo.setParentMerchantNo(parentMerchantNo);
 		R editResult = bussinessUserInfoService.editUserInfo(bussinessUserInfo);
 		return editResult;
 	}
@@ -205,4 +217,63 @@ public class BussinessUserInfoController extends BladeController {
 				}).collect(Collectors.toList());
 		return R.data(voList);
 	}
+
+	/**
+	 * 修改
+	 * @param userInfo
+	 * @return
+	 */
+	@GetMapping(value = "/withdrawCardQuery")
+	@ApiOperationSupport(order = 9)
+	public R withdrawCardQuery(BussinessUserInfo userInfo){
+		R result = this.bussinessUserInfoService.withdrawCardQuery(userInfo.getId());
+		return result;
+	}
+
+	/**
+	 * 添加
+	 * @param userInfo
+	 * @return
+	 */
+	@PostMapping(value = "/withdrawCardBind")
+	@ApiOperationSupport(order = 10)
+	public R withdrawCardBind(@RequestBody BussinessUserInfo userInfo){
+		R result = this.bussinessUserInfoService.withdrawCardBind(userInfo);
+		return result;
+	}
+
+	/**
+	 * 修改
+	 * @param userInfo
+	 * @return
+	 */
+	@PostMapping(value = "/withdrawCardModify")
+	@ApiOperationSupport(order = 11)
+	public R withdrawCardModify(@RequestBody BussinessUserInfo userInfo){
+		R result = this.bussinessUserInfoService.withdrawCardModify(userInfo);
+		return result;
+	}
+
+	/**
+	 * 查询商户账户余额
+	 */
+	@GetMapping("/queryUserBalance")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "小微商户余额查询")
+	public R<BigDecimal> queryBalance(@RequestParam(value = "userInfoId", required = false) Long userInfoId) {
+		BussinessUserInfo userInfo = this.bussinessUserInfoService.getById(userInfoId);
+		org.springframework.util.Assert.notNull(userInfo, "商户不存在");
+		BladeUser user = AuthUtil.getUser();
+		if(user.getRoleName().equals("财务管理") || user.getRoleName().equals("administrator")){ //入驻商查询余额
+			if(StringUtil.isNoneBlank(userInfo.getMerchantNo()) && userInfo.getRegisterStatus().intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+				R<BigDecimal> newRemainR = bussinessService.queryBalance(userInfo.getMerchantNo());
+				return newRemainR;
+			}else{
+				return R.fail("请先完成商户进件");
+			}
+		}else{
+			return R.fail("暂无权限");
+		}
+	}
+
 }

+ 5 - 4
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/entity/BussinessUserInfo.java

@@ -160,10 +160,10 @@ public class BussinessUserInfo extends BaseEntity {
 
 	public String toBusinessAddressInfo(){
 		return "{" +
-				"\"province\":" + "\"\"" +
-				", \"city\":" + "\"\"" +
-				", \"district\":" + "\"\"" +
-				", \"address\":" + "\""+ (StringUtil.isNotBlank(userAddress)? userAddress : "") + '\"' +
+				"\"province\":" + "\"" + "440000" + "\"" +
+				", \"city\":" + "\"" + "440100" + "\"" +
+				", \"district\":" + "\"" + "440106" + "\"" +
+				", \"address\":" + "\""+ (StringUtil.isNotBlank(userAddress)? userAddress : "经营地址") + '\"' +
 				'}';
 	}
 
@@ -180,6 +180,7 @@ public class BussinessUserInfo extends BaseEntity {
 	public String toAccountInfo(){
 		return "{" +
 				"\"bankAccountType\":" + "\""+ bankAccountType + '\"' +
+				", \"settlementDirection\":" + "\"" + "ACCOUNT" + "\"" +
 				", \"bankCardNo\":" + "\""+ bankCardNo + '\"' +
 				", \"bankCode\":" + "\""+ bankCode + '\"' +
 				'}';

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

@@ -16,11 +16,14 @@
  */
 package org.springblade.modules.guosen.bussinessuserinfo.service;
 
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
+import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
 import org.springblade.modules.guosen.bussinessuserinfo.entity.BussinessUserInfo;
 import org.springblade.modules.guosen.bussinessuserinfo.vo.BussinessUserInfoVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  *  服务类
@@ -45,4 +48,12 @@ public interface IBussinessUserInfoService extends BaseService<BussinessUserInfo
 
 	BussinessUserInfo getByMerchantNo(String merchantNo);
 
+	R withdrawCardQuery(Long userInfo);
+
+	R withdrawCardBind(BussinessUserInfo userInfo);
+
+	R withdrawCardModify(BussinessUserInfo userInfo);
+
+	BussinessUserInfo getByNameLicenceNo(String userName, String licenceNo);
+
 }

+ 121 - 1
src/main/java/org/springblade/modules/guosen/bussinessuserinfo/service/impl/BussinessUserInfoServiceImpl.java

@@ -16,17 +16,44 @@
  */
 package org.springblade.modules.guosen.bussinessuserinfo.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.springblade.common.constant.SystemConstant;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.secure.BladeUser;
 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.bussiness.excel.DebitRequestExcel;
+import org.springblade.modules.guosen.bussiness.excel.WithdrawRequestExcel;
+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.bussinessuserinfo.entity.BussinessUserInfo;
 import org.springblade.modules.guosen.bussinessuserinfo.vo.BussinessUserInfoVO;
 import org.springblade.modules.guosen.bussinessuserinfo.mapper.BussinessUserInfoMapper;
 import org.springblade.modules.guosen.bussinessuserinfo.service.IBussinessUserInfoService;
 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.obs.service.ObsService;
+import org.springblade.yeePay.entity.WithdrawCardBindDto;
+import org.springblade.yeePay.entity.WithdrawCardModifyDto;
+import org.springblade.yeePay.service.YeePayService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotBlank;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.UUID;
 
 /**
  *  服务实现类
@@ -37,6 +64,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 @Service
 public class BussinessUserInfoServiceImpl extends BaseServiceImpl<BussinessUserInfoMapper, BussinessUserInfo> implements IBussinessUserInfoService {
 
+	@Autowired
+	private YeePayService yeePayService;
+
 	@Override
 	public IPage<BussinessUserInfoVO> selectBussinessUserInfoPage(IPage<BussinessUserInfoVO> page, BussinessUserInfoVO bussinessUserInfo) {
 		return page.setRecords(baseMapper.selectBussinessUserInfoPage(page, bussinessUserInfo));
@@ -66,11 +96,12 @@ public class BussinessUserInfoServiceImpl extends BaseServiceImpl<BussinessUserI
 					return R.fail("该用户已完成审核或审核中,请勿修改");
 				}
 				boolean update = this.updateById(bussinessUserInfo);
-				return R.status(update);
+				return R.status(true);
 			}
 		}
 	}
 
+	@Override
 	public BussinessUserInfo getByNameCardBank(BussinessUserInfo bussinessUserInfo){
 		LambdaQueryWrapper<BussinessUserInfo> lambda = new LambdaQueryWrapper<>();
 		lambda.eq(StringUtil.isNotBlank(bussinessUserInfo.getUserName()), BussinessUserInfo::getUserName, bussinessUserInfo.getUserName());
@@ -85,4 +116,93 @@ public class BussinessUserInfoServiceImpl extends BaseServiceImpl<BussinessUserI
 		lambda.eq(BussinessUserInfo::getMerchantNo, merchantNo);
 		return baseMapper.selectOne(lambda);
 	}
+
+	@Override
+	public R withdrawCardQuery(Long userInfoId) {
+		BussinessUserInfo userInfo = this.getById(userInfoId);
+		Assert.notNull(userInfo, "用户不存在");
+		Integer registerStatus = userInfo.getRegisterStatus();
+		if(registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			R result = this.yeePayService.withdrawCardQuery(userInfo.getMerchantNo());
+			return R.data(result.getData());
+		}else{
+			return R.fail("用户未完成进件");
+		}
+	}
+
+	@Override
+	public R withdrawCardBind(BussinessUserInfo userInfo) {
+		BussinessUserInfo dbUserInfo = this.getById(userInfo.getId());
+		Integer registerStatus = dbUserInfo.getRegisterStatus();
+		if(registerStatus.intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			return R.fail("用户未完成进件");
+		}
+		Assert.notEmpty(userInfo.getBankCardNo(), "银行卡号不能为空");
+		dbUserInfo.setBankCode(userInfo.getBankCode());
+		dbUserInfo.setBankCardNo(userInfo.getBankCardNo());
+		this.updateById(dbUserInfo);
+		//发起修改提现卡请求
+		WithdrawCardBindDto withdrawCardBindDto = WithdrawCardBindDto.builder()
+						.bankCardType(userInfo.getBankAccountType())
+						.accountNo(dbUserInfo.getBankCardNo())
+						.merchantNo(dbUserInfo.getMerchantNo())
+						.bankCode(dbUserInfo.getBankCode())
+						.build();
+		R result = yeePayService.withdrawCardBind(withdrawCardBindDto);
+		JSONObject resultData = JSONUtil.parseObj(result.getData());
+		String returnCode = resultData.getStr("returnCode");
+		String returnMsg = resultData.getStr("returnMsg");
+		if(returnCode.equals("UA00000")){
+			return R.status(true);
+		}else{
+			return R.fail(returnMsg);
+		}
+	}
+
+	@Override
+	public R withdrawCardModify(BussinessUserInfo userInfo) {
+		BussinessUserInfo dbUserInfo = this.getById(userInfo.getId());
+		Integer registerStatus = dbUserInfo.getRegisterStatus();
+		if(registerStatus.intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			return R.fail("用户未完成进件");
+		}
+		Assert.notEmpty(userInfo.getBankCardNo(), "银行卡号不能为空");
+		Assert.notEmpty(userInfo.getBankCode(), "总行编号不能为空");
+		if(userInfo.getBankCardNo().equals(dbUserInfo.getBankCardNo()) && userInfo.getBankCode().equals(dbUserInfo.getBankCode())){
+			//这里是处理,上次修改提现卡时候,本地保存成功,但是支付平台修改失败,需要重新发起修改,但此时数据库已经更新为最新的提现卡了,所以只需要对支付平台发起请求即可
+
+		}else{
+			dbUserInfo.setBankCardNo(userInfo.getBankCardNo());
+			dbUserInfo.setBankCode(userInfo.getBankCode());
+			boolean update = this.updateById(dbUserInfo);
+			if(!update){
+				return R.fail("修改失败");
+			}
+		}
+		//发起修改提现卡请求
+		WithdrawCardModifyDto withdrawCardModifyDto = WithdrawCardModifyDto.builder()
+						.bankCardOperateType("MODIFY")
+						.accountNo(dbUserInfo.getBankCardNo())
+						.merchantNo(dbUserInfo.getMerchantNo())
+						.bankCode(dbUserInfo.getBankCode())
+						.build();
+		R result = yeePayService.withdrawCardModify(withdrawCardModifyDto);
+		JSONObject resultData = JSONUtil.parseObj(result.getData());
+		String returnCode = resultData.getStr("returnCode");
+		String returnMsg = resultData.getStr("returnMsg");
+		if(returnCode.equals("UA00000")){
+			return R.status(true);
+		}else{
+			return R.fail(returnMsg);
+		}
+	}
+
+	@Override
+	public BussinessUserInfo getByNameLicenceNo(String userName, String licenceNo) {
+		LambdaQueryWrapper<BussinessUserInfo> lambda = new LambdaQueryWrapper<>();
+		lambda.eq(StringUtil.isNotBlank(userName), BussinessUserInfo::getUserName, userName);
+		lambda.eq(StringUtil.isNotBlank(licenceNo), BussinessUserInfo::getUserLicenceNo, licenceNo);
+		return baseMapper.selectOne(lambda);
+	}
+
 }

+ 93 - 6
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/controller/BussinessUserWithdrawController.java

@@ -17,17 +17,24 @@
 package org.springblade.modules.guosen.bussinessuserwithdraw.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 import org.springblade.common.constant.SystemConstant;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+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.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.guosen.bussiness.entity.Bussiness;
@@ -35,9 +42,12 @@ 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.BussinessUserWithdrawDTO;
 import org.springblade.modules.guosen.bussinessuserwithdraw.dto.WithdrawTransferOrder;
+import org.springblade.modules.guosen.bussinessuserwithdraw.excel.WithdrawExcel;
 import org.springblade.modules.system.service.IParamService;
 import org.springblade.yeePay.service.BussinessPayService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,10 +60,11 @@ import org.springblade.modules.guosen.bussinessuserwithdraw.vo.BussinessUserWith
 import org.springblade.modules.guosen.bussinessuserwithdraw.wrapper.BussinessUserWithdrawWrapper;
 import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
 import org.springblade.core.boot.ctrl.BladeController;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.*;
 
 /**
  *  控制器
@@ -75,6 +86,10 @@ public class BussinessUserWithdrawController extends BladeController {
 	private IBussinessInfoService bussinessInfoService;
 	@Autowired
 	private IBussinessUserInfoService userInfoService;
+	@Autowired
+	private IBussinessTransferOrderService transferOrderService;
+	@Autowired
+	private IBussinessService bussinessService;
 
 	/**
 	 * 详情
@@ -93,7 +108,7 @@ public class BussinessUserWithdrawController extends BladeController {
 	@GetMapping("/list")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入bussinessUserWithdraw")
-	public R<IPage<BussinessUserWithdrawVO>> list(BussinessUserWithdraw bussinessUserWithdraw, Query query) {
+	public R<IPage<BussinessUserWithdrawVO>> list(BussinessUserWithdraw bussinessUserWithdraw, Query query, BladeUser bladeUser) {
 		Date createTime = bussinessUserWithdraw.getCreateTime();
 		String createTimeFormat = null;
 		if(createTime != null){
@@ -103,6 +118,12 @@ public class BussinessUserWithdrawController extends BladeController {
 		}
 		LambdaQueryWrapper<BussinessUserWithdraw> lambda = Condition.getQueryWrapper(bussinessUserWithdraw).lambda();
 		lambda.like(createTime != null, BussinessUserWithdraw::getCreateTime, createTimeFormat);
+		lambda.eq(StringUtil.isNotBlank(bussinessUserWithdraw.getBussinessOrderId()), BussinessUserWithdraw::getBussinessOrderId, bussinessUserWithdraw.getBussinessOrderId());
+		String roleName = bladeUser.getRoleName();
+		if(roleName.equals("商户")){
+			Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda().eq(Bussiness::getAccountId, bladeUser.getUserId()));
+			lambda.eq(BussinessUserWithdraw::getBussinessId, bussiness.getId());
+		}
 		IPage<BussinessUserWithdraw> pages = bussinessUserWithdrawService.page(Condition.getPage(query), lambda.orderByDesc(BussinessUserWithdraw::getCreateTime));
 		return R.data(BussinessUserWithdrawWrapper.build().pageVO(pages));
 	}
@@ -186,20 +207,60 @@ public class BussinessUserWithdrawController extends BladeController {
 		}
 		Long userInfoId = withdraw.getUserInfoId();
 		BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+		if(userInfo.getRegisterStatus().intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			return R.fail("用户未完成进件,请勿发起付款");
+		}
 		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());
+			R firstTransferResult = bussinessPayService.transferOrder(withdrawTransferOrder.getTransferOrder(), bussinessInfo.getParentMerchantNo());
 			BussinessUserWithdraw dbWithdraw = withdrawTransferOrder.getWithdraw();
-			if (transferResult.isSuccess()) {
+			BussinessTransferOrder firstTransferOrder = withdrawTransferOrder.getTransferOrder();
+			if (firstTransferResult.isSuccess()) {
 				dbWithdraw.setFailReason("受理成功,请等待结果");
-				dbWithdraw.setReturnMsg(transferResult.getMsg());
+				dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
 				this.bussinessUserWithdrawService.updateById(dbWithdraw);
+				if(firstTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+					this.bussinessPayService.handleFirstTransferScene(firstTransferOrder.getId());
+				}else if(firstTransferResult.getMsg().equals("SUCCESS")){
+					firstTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.SUCCESS.getValue());
+					this.transferOrderService.updateById(firstTransferOrder);
+					String withdrawRate = paramService.getValue("yee_withdraw_rate");
+					BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+					secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+					secondTransferOrder.setToMerchantNo(dbWithdraw.getMerchantNo());
+					secondTransferOrder.setTransferUsage("提现前转账给小微商户");
+					secondTransferOrder.setOrderAmount((dbWithdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+					secondTransferOrder.setFeeChargeSide("OUTSIDE");
+					secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+					secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+					secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+					this.transferOrderService.save(secondTransferOrder);
+					dbWithdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+					this.bussinessUserWithdrawService.updateById(dbWithdraw);
+					R secondTransferResult = this.bussinessPayService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+					if(secondTransferResult.isSuccess()){
+						if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+							this.bussinessPayService.handleSecondTransferScene(secondTransferOrder.getId());
+						}else if(secondTransferResult.getMsg().equals("SUCCESS")){
+							secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.SUCCESS.getValue());
+							this.transferOrderService.updateById(secondTransferOrder);
+							this.bussinessPayService.withdrawOrder(dbWithdraw, userInfo.getParentMerchantNo());
+						}
+					}else{
+						dbWithdraw.setFailReason("代付失败");
+						dbWithdraw.setReturnMsg(secondTransferResult.getMsg());
+						dbWithdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+						this.bussinessUserWithdrawService.updateById(dbWithdraw);
+						return R.fail("代付失败");
+					}
+				}
 				return R.success("受理成功,请等待结果");
 			} else {
 				dbWithdraw.setFailReason("代付失败");
-				dbWithdraw.setReturnMsg(transferResult.getMsg());
+				dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
+				dbWithdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
 				this.bussinessUserWithdrawService.updateById(dbWithdraw);
 				return R.fail("代付失败");
 			}
@@ -207,5 +268,31 @@ public class BussinessUserWithdrawController extends BladeController {
 		return result;
 	}
 
+	/**
+	 * 导出用户
+	 */
+	@GetMapping("export-withdraw")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "导出代付数据", notes = "传入user")
+	public void exportUser(@ApiIgnore BussinessUserWithdrawDTO withdrawDTO, BladeUser bladeUser, HttpServletResponse response) {
+		Integer withdrawStatus = withdrawDTO.getWithdrawStatus();
+		String createTimeStr = withdrawDTO.getCreateTimeStr();
+		String createTimeFormat = null;
+		if(StringUtil.isNotBlank(createTimeStr)){
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			createTimeFormat = sdf.format(DateUtil.parse(createTimeStr, "yyyy-MM-dd"));
+		}
+		LambdaQueryWrapper<BussinessUserWithdraw> lambda = new LambdaQueryWrapper<>();
+		lambda.eq(withdrawStatus != null, BussinessUserWithdraw::getWithdrawStatus, withdrawStatus);
+		lambda.like(StringUtil.isNotBlank(createTimeStr), BussinessUserWithdraw::getCreateTime, createTimeFormat);
+		if(bladeUser.getRoleName().equals("商户")){
+			Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+							.eq(Bussiness::getAccountId, bladeUser.getUserId()));
+			Assert.notNull(bussiness, "商户不存在");
+			lambda.eq(BussinessUserWithdraw::getBussinessId, bussiness.getId());
+		}
+		List<WithdrawExcel> list = this.bussinessUserWithdrawService.exportWithdraw(lambda);
+		ExcelUtil.export(response, "代付数据" + DateUtil.time(), "代付数据表", list, WithdrawExcel.class);
+	}
 	
 }

+ 2 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/dto/BussinessUserWithdrawDTO.java

@@ -31,4 +31,6 @@ import lombok.EqualsAndHashCode;
 public class BussinessUserWithdrawDTO extends BussinessUserWithdraw {
 	private static final long serialVersionUID = 1L;
 
+	private String createTimeStr;
+
 }

+ 7 - 2
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/entity/BussinessUserWithdraw.java

@@ -18,14 +18,14 @@ package org.springblade.modules.guosen.bussinessuserwithdraw.entity;
 
 import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 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;
 
 /**
@@ -183,5 +183,10 @@ public class BussinessUserWithdraw extends BaseEntity {
 	 */
 	private String requestIp;
 
+	/**
+	 * 提现完成标识
+	 */
+	private String withdrawFlag;
+
 
 }

+ 78 - 0
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/excel/WithdrawExcel.java

@@ -0,0 +1,78 @@
+/*
+ *      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.bussinessuserwithdraw.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * UserExcel
+ *
+ * @author Chill
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class WithdrawExcel implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	@ColumnWidth(15)
+	@ExcelProperty("收款用户")
+	private String receiverAccountName;
+
+	@ColumnWidth(15)
+	@ExcelProperty("收款金额")
+	private BigDecimal orderAmount;
+
+	@ColumnWidth(15)
+	@ExcelProperty("银行编号")
+	private String bankCode;
+
+	@ColumnWidth(25)
+	@ExcelProperty("银行名称")
+	private String bankName;
+
+	@ColumnWidth(25)
+	@ExcelProperty("银行账户")
+	private String bankAccountNo;
+
+	@ColumnWidth(15)
+	@ExcelProperty("付款状态")
+	private String withdrawStatusTxt;
+
+	@ExcelIgnore
+	@ExcelProperty("付款状态")
+	private Integer withdrawStatus;
+
+	@ColumnWidth(20)
+	@ExcelProperty("采购商订单号")
+	private String bussinessOrderId;
+
+	@ColumnWidth(25)
+	@ExcelProperty("下单时间")
+	private Date createTime;
+
+}

+ 7 - 1
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/IBussinessUserWithdrawService.java

@@ -16,16 +16,21 @@
  */
 package org.springblade.modules.guosen.bussinessuserwithdraw.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springblade.core.secure.BladeUser;
 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.excel.WithdrawExcel;
 import org.springblade.modules.guosen.bussinessuserwithdraw.vo.BussinessUserWithdrawVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  *  服务类
@@ -52,10 +57,11 @@ public interface IBussinessUserWithdrawService extends BaseService<BussinessUser
 
 	BussinessUserWithdraw getByRequestNo(String requestNo);
 
-	BussinessUserWithdraw getByBussinessOrderId(Long bussinessId, String bussinessOrderId);
+	List<BussinessUserWithdraw> getByBussinessOrderId(Long bussinessId, List<String> bussinessOrderId);
 
 	BigDecimal withdrawStat(BussinessUserWithdraw withdraw);
 
 	R<WithdrawTransferOrder> initWithdrawOrder(BussinessUserWithdraw withdraw);
 
+	List<WithdrawExcel> exportWithdraw(LambdaQueryWrapper<BussinessUserWithdraw> lambdaQueryWrapper);
 }

+ 32 - 7
src/main/java/org/springblade/modules/guosen/bussinessuserwithdraw/service/impl/BussinessUserWithdrawServiceImpl.java

@@ -20,6 +20,9 @@ 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.core.tool.utils.BeanUtil;
+import org.springblade.modules.guosen.bankcode.entity.BankCode;
+import org.springblade.modules.guosen.bankcode.service.IBankCodeService;
 import org.springblade.modules.guosen.bussiness.entity.Bussiness;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
 import org.springblade.modules.guosen.bussinessInfo.entity.BussinessInfo;
@@ -30,6 +33,7 @@ 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.excel.WithdrawExcel;
 import org.springblade.modules.guosen.bussinessuserwithdraw.vo.BussinessUserWithdrawVO;
 import org.springblade.modules.guosen.bussinessuserwithdraw.mapper.BussinessUserWithdrawMapper;
 import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
@@ -44,9 +48,8 @@ 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;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *  服务实现类
@@ -69,6 +72,8 @@ public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessU
 	private IBussinessInfoService bussinessInfoService;
 	@Autowired
 	private IBussinessTransferOrderService transferOrderService;
+	@Autowired
+	private IBankCodeService bankCodeService;
 
 	@Override
 	public IPage<BussinessUserWithdrawVO> selectBussinessUserWithdrawPage(IPage<BussinessUserWithdrawVO> page, BussinessUserWithdrawVO bussinessUserWithdraw) {
@@ -104,11 +109,13 @@ public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessU
 	}
 
 	@Override
-	public BussinessUserWithdraw getByBussinessOrderId(Long bussinessId, String bussinessOrderId) {
+	public List<BussinessUserWithdraw> getByBussinessOrderId(Long bussinessId, List<String> bussinessOrderId) {
 		LambdaQueryWrapper<BussinessUserWithdraw> lambda = new LambdaQueryWrapper<>();
 		lambda.eq(BussinessUserWithdraw::getBussinessId, bussinessId);
-		lambda.eq(BussinessUserWithdraw::getBussinessOrderId, bussinessOrderId);
-		return baseMapper.selectOne(lambda);
+		lambda.in(BussinessUserWithdraw::getBussinessOrderId, bussinessOrderId);
+		lambda.orderByDesc(BussinessUserWithdraw::getCreateTime);
+		List<BussinessUserWithdraw> list = this.list(lambda);
+		return list;
 	}
 
 	@Override
@@ -172,7 +179,7 @@ public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessU
 		BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
 		bussinessTransferOrder.setFromMerchantNo(bussinessInfo.getMerchantNo());
 		bussinessTransferOrder.setToMerchantNo(bussinessInfo.getParentMerchantNo());
-		bussinessTransferOrder.setTransferUsage("采购");
+		bussinessTransferOrder.setTransferUsage("提现前转账给平台商");
 		bussinessTransferOrder.setOrderAmount(transferAmount.toString());
 		bussinessTransferOrder.setFeeChargeSide("OUTSIDE");
 		bussinessTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
@@ -196,6 +203,24 @@ public class BussinessUserWithdrawServiceImpl extends BaseServiceImpl<BussinessU
 		}
 	}
 
+	@Override
+	public List<WithdrawExcel> exportWithdraw(LambdaQueryWrapper<BussinessUserWithdraw> lambdaQueryWrapper) {
+		List<BussinessUserWithdraw> list = this.list(lambdaQueryWrapper);
+		List<WithdrawExcel> exportList = list.stream().map(item -> {
+			WithdrawExcel excel = new WithdrawExcel();
+			excel = BeanUtil.copy(item, WithdrawExcel.class);
+			List<BankCode> bankCodeList = bankCodeService.getByBankCode(item.getBankCode());
+			if (bankCodeList != null && bankCodeList.size() > 0) {
+				BankCode bankCode = bankCodeList.get(0);
+				excel.setBankName(bankCode.getName());
+			}
+			Integer withdrawStatus = item.getWithdrawStatus();
+			excel.setWithdrawStatusTxt(SystemConstant.WithdrawOrderStatus.getNameByValue(withdrawStatus));
+			return excel;
+		}).collect(Collectors.toList());
+		return exportList;
+	}
+
 	private BussinessUserWithdraw createWithdrawOrder(BussinessUserInfo userInfo, BigDecimal withdrawAmount, String failReason, String returnMsg){
 		BussinessUserWithdraw withdraw = new BussinessUserWithdraw();
 		withdraw.setUserInfoId(userInfo.getId());

+ 63 - 66
src/main/java/org/springblade/modules/time/TimeTask.java

@@ -1,12 +1,11 @@
 package org.springblade.modules.time;
 
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.common.constant.SystemConstant;
-import org.springblade.core.mp.support.Condition;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.modules.guosen.billRecord.entity.BillRecord;
@@ -18,12 +17,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.guosen.bussiness.service.IBussinessService;
 import org.springblade.modules.system.service.IParamService;
-import org.springblade.yeePay.common.YeePayConst;
 import org.springframework.beans.factory.annotation.Autowired;
 		import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -35,7 +30,6 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 @Component
@@ -58,11 +52,7 @@ public class TimeTask {
 	@Autowired
 	private IParamService paramService;
 	@Autowired
-	private IBussinessTransferOrderService bussinessTransferOrderService;
-	@Autowired
-	private YeePayConst yeePayConst;
-	@Autowired
-	private IBussinessInfoService bussinessInfoService;
+	private IBussinessService bussinessService;
 
 	@Scheduled(cron = "0 0 0 * * ?")
 	public  void clearRedis() {
@@ -91,26 +81,29 @@ public class TimeTask {
 		//分润金额=每一笔充值的服务费-(每一笔充值金额*每一笔充值金额的交易方式的费率),这里遇到充值方式为扫码的时候才进行相减。否则直接=充值服务费
 		BigDecimal bussinessFee = billRecords.stream().map(BillRecord::getBussinessFee).reduce(BigDecimal.ZERO, BigDecimal::add);
 		//计算支付手续费
+		BigDecimal baseRate = new BigDecimal(paramService.getValue("yee_base_rate")).multiply(new BigDecimal(10));//0.21 * 10 = 2.1
+		BigDecimal saasBaseRate = new BigDecimal(paramService.getValue("yee_saas_rate")).multiply(new BigDecimal(10));//0.1 * 10 = 1
+		BigDecimal yeeRate = baseRate.add(saasBaseRate);
 		BigDecimal yeeFee = billRecords.stream().map(record -> {
-			String payWay = record.getPayWay();
-			BigDecimal baseFee = record.getBussinessFee();
-//			BigDecimal baseFee = record.getPrice().multiply((new BigDecimal("0.0021")));
-			if (StringUtil.isNotBlank(payWay) && payWay.equals("USER_SCAN")) {
-				BigDecimal userScanFee = record.getPrice().multiply(new BigDecimal("0.0022"));
-				BigDecimal add = userScanFee.add(baseFee);
-				return add;
-			} else {
-				return baseFee;
-			}
+			return record.getPrice().multiply(yeeRate);
 		}).reduce(BigDecimal.ZERO, BigDecimal::add);
 
-
+		BigDecimal bonusAmt = new BigDecimal(0.00);
+		List<Bussiness> platformBusinessList = this.bussinessService.list(new LambdaQueryWrapper<Bussiness>()
+						.eq(Bussiness::getBussinessType, SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue())
+						.eq(Bussiness::getRegisterStatus, SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()));
+		for(Bussiness bussiness : platformBusinessList){
+			R<BigDecimal> result = this.bussinessService.queryBalance(bussiness.getMerchantNo());
+			if(result.isSuccess()){
+				bonusAmt = bonusAmt.add(result.getData());
+			}
+		}
 		BussinessBonusStatic bussinessBonusStatic = new BussinessBonusStatic();
 		bussinessBonusStatic.setDate(yesterday);
 		bussinessBonusStatic.setFee(yeeFee);
 		bussinessBonusStatic.setTotalAmt(total);
 		bussinessBonusStatic.setServiceAmt(bussinessFee);
-		bussinessBonusStatic.setBonusAmt(total.multiply(new BigDecimal(0.0049)));
+		bussinessBonusStatic.setBonusAmt(bonusAmt);
 
 		bussinessBonusStaticService.save(bussinessBonusStatic);
 
@@ -157,26 +150,30 @@ public class TimeTask {
 			//分润金额=每一笔充值的服务费-(每一笔充值金额*每一笔充值金额的交易方式的费率),这里遇到充值方式为扫码的时候才进行相减。否则直接=充值服务费
 			BigDecimal bussinessFee = billRecords.stream().map(BillRecord::getBussinessFee).reduce(BigDecimal.ZERO, BigDecimal::add);
 			//计算支付手续费
+			BigDecimal baseRate = new BigDecimal(paramService.getValue("yee_base_rate")).multiply(new BigDecimal(10));//0.21 * 10 = 2.1
+			BigDecimal saasBaseRate = new BigDecimal(paramService.getValue("yee_saas_rate")).multiply(new BigDecimal(10));//0.1 * 10 = 1
+			BigDecimal yeeRate = baseRate.add(saasBaseRate);
 			BigDecimal fee = billRecords.stream().map(record -> {
-				String payWay = record.getPayWay();
-				BigDecimal baseFee = record.getBussinessFee();
-//				BigDecimal baseFee = record.getPrice().multiply((new BigDecimal("0.0021")));
-				if (StringUtil.isNotBlank(payWay) && payWay.equals("USER_SCAN")) {
-					BigDecimal userScanFee = record.getPrice().multiply(new BigDecimal("0.0022"));
-					BigDecimal add = userScanFee.add(baseFee);
-					return add;
-				} else {
-					return baseFee;
-				}
+				return record.getPrice().multiply(yeeRate);
 			}).reduce(BigDecimal.ZERO, BigDecimal::add);
 
+			BigDecimal bonusAmt = new BigDecimal(0.00);
+			List<Bussiness> platformBusinessList = this.bussinessService.list(new LambdaQueryWrapper<Bussiness>()
+							.eq(Bussiness::getBussinessType, SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue())
+							.eq(Bussiness::getRegisterStatus, SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()));
+			for(Bussiness bussiness : platformBusinessList){
+				R<BigDecimal> result = this.bussinessService.queryBalance(bussiness.getMerchantNo());
+				if(result.isSuccess()){
+					bonusAmt = bonusAmt.add(result.getData());
+				}
+			}
 
 			BussinessBonusStatic bussinessBonusStatic = new BussinessBonusStatic();
 			bussinessBonusStatic.setDate(beginDate);
 			bussinessBonusStatic.setFee(fee);
 			bussinessBonusStatic.setTotalAmt(total);
 			bussinessBonusStatic.setServiceAmt(bussinessFee);
-			bussinessBonusStatic.setBonusAmt(total.multiply(new BigDecimal(0.0049)));
+			bussinessBonusStatic.setBonusAmt(bonusAmt);
 
 			bussinessBonusStaticService.save(bussinessBonusStatic);
 			beginDate = DateUtil.plusDays(beginDate, 1);
@@ -216,36 +213,36 @@ public class TimeTask {
 	 * 早上5点
 	 */
 //	@Scheduled(cron = "0 0 5 * * ?")
-	public void transferFormPlatformToBusiness() {
-		String toMerchantNo = paramService.getValue("self_merchant_no");
-		//获取前一天的日期
-		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
-		Calendar calendar = Calendar.getInstance();
-		calendar.add(Calendar.DATE, -1);
-
-		Date yesterday = calendar.getTime();
-		BussinessBonusStatic bonusStatic = bussinessBonusStaticService.getBaseMapper().selectOne(new QueryWrapper<>(new BussinessBonusStatic()).lambda()
-				.like(BussinessBonusStatic::getDate, df.format(yesterday)));
-
-		if(bonusStatic.getBonusAmt() != null && bonusStatic.getBonusAmt().compareTo(new BigDecimal(2)) == 1){
-			BussinessTransferOrder transferOrder = new BussinessTransferOrder();
-			transferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
-			transferOrder.setOrderAmount(bonusStatic.getBonusAmt().toString());
-			transferOrder.setFromMerchantNo(yeePayConst.getParentMerchantNo());
-			transferOrder.setToMerchantNo(toMerchantNo);
-			transferOrder.setTransferUsage("采购");
-			transferOrder.setFeeChargeSide("OUTSIDE");
-			boolean save = bussinessTransferOrderService.save(transferOrder);
-			BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getFromMerchantNo());
-			if(save){
-				//发起充值服务费转账。
-				bussinessTransferOrderService.transferOrder(transferOrder, bussinessInfo.getParentMerchantNo());
-			}else{
-				log.error("=======================分润转账业务订单保存失败========================");
-				log.error(JSONUtil.toJsonStr(transferOrder));
-			}
-		}
-	}
+//	public void transferFormPlatformToBusiness() {
+//		String toMerchantNo = paramService.getValue("self_merchant_no");
+//		//获取前一天的日期
+//		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+//		Calendar calendar = Calendar.getInstance();
+//		calendar.add(Calendar.DATE, -1);
+//
+//		Date yesterday = calendar.getTime();
+//		BussinessBonusStatic bonusStatic = bussinessBonusStaticService.getBaseMapper().selectOne(new QueryWrapper<>(new BussinessBonusStatic()).lambda()
+//				.like(BussinessBonusStatic::getDate, df.format(yesterday)));
+//
+//		if(bonusStatic.getBonusAmt() != null && bonusStatic.getBonusAmt().compareTo(new BigDecimal(2)) == 1){
+//			BussinessTransferOrder transferOrder = new BussinessTransferOrder();
+//			transferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+//			transferOrder.setOrderAmount(bonusStatic.getBonusAmt().toString());
+//			transferOrder.setFromMerchantNo(yeePayConst.getParentMerchantNo());
+//			transferOrder.setToMerchantNo(toMerchantNo);
+//			transferOrder.setTransferUsage("采购");
+//			transferOrder.setFeeChargeSide("OUTSIDE");
+//			boolean save = bussinessTransferOrderService.save(transferOrder);
+//			BussinessInfo bussinessInfo = this.bussinessInfoService.getByMerchantNo(transferOrder.getFromMerchantNo());
+//			if(save){
+//				//发起充值服务费转账。
+//				bussinessTransferOrderService.transferOrder(transferOrder, bussinessInfo.getParentMerchantNo());
+//			}else{
+//				log.error("=======================分润转账业务订单保存失败========================");
+//				log.error(JSONUtil.toJsonStr(transferOrder));
+//			}
+//		}
+//	}
 
 	/**
 	 * 仅用于测试

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

@@ -26,6 +26,7 @@ public class YeePayConst {
 	String appKey;
 	String privateKey;
 	String merchantRegisterUrl;
+	String userRegisterUrl;
 	String qualUpload;
 	String rechargeOrderUrl;
 	String transferOrderUrl;
@@ -33,6 +34,9 @@ public class YeePayConst {
 	String withdrawOrderUrl;
 	String transferQueryUrl;
 	String productFeeModifyUrl;
+	String withdrawCardBind;
+	String withdrawCardModify;
+	String withdrawCardQuery;
 	String rechargeOrderNotify;
 	String transferOrderNotify;
 	String payOrderNotify;

+ 422 - 89
src/main/java/org/springblade/yeePay/controller/BussinessPayController.java

@@ -4,20 +4,24 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Lists;
 import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.common.annotation.AccessLimit;
 import org.springblade.common.constant.SystemConstant;
 import org.springblade.common.utils.IPUtils;
 import org.springblade.common.utils.MoneyDesUtil;
+import org.springblade.core.excel.util.ExcelUtil;
 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.BeanUtil;
+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.entity.BussinessDebit;
 import org.springblade.modules.guosen.bussiness.entity.BussinessDebitRequest;
+import org.springblade.modules.guosen.bussiness.excel.WithdrawRequestExcel;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitRequestService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessDebitService;
 import org.springblade.modules.guosen.bussiness.service.IBussinessService;
@@ -36,19 +40,19 @@ import org.springblade.modules.guosen.debtDaliyStat.service.IBusinessDeptDaliySt
 import org.springblade.modules.guosen.withdrawRecords.service.IWithdrawRecordsService;
 import org.springblade.modules.system.service.IParamService;
 import org.springblade.yeePay.common.YeePayConst;
-import org.springblade.yeePay.entity.OrderQueryDto;
-import org.springblade.yeePay.entity.PayOrderDto;
-import org.springblade.yeePay.entity.PayToUserDto;
+import org.springblade.yeePay.entity.*;
 import org.springblade.yeePay.service.BussinessPayService;
 import org.springblade.yeePay.service.YeePayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
-import java.util.UUID;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * Created By lidexi in 2021/7/8
@@ -70,7 +74,7 @@ public class BussinessPayController {
 	@Autowired
 	IBussinessDebitService bussinessDebitService;
 	@Autowired
-	IBusinessDeptDaliyStatService businessDeptDaliyStatService;
+	IBusinessDeptDaliyStatService businessDeptDailyStatService;
 	@Autowired
 	private IParamService paramService;
 	@Autowired
@@ -78,8 +82,6 @@ public class BussinessPayController {
 	@Autowired
 	private IBussinessTransferOrderService bussinessTransferOrderService;
 	@Autowired
-	private YeePayConst yeePayConst;
-	@Autowired
 	private IBussinessUserInfoService userInfoService;
 	@Autowired
 	private IBussinessRegisterRequestService bussinessRegisterRequestService;
@@ -87,6 +89,8 @@ public class BussinessPayController {
 	private IBussinessUserWithdrawService withdrawService;
 	@Autowired
 	private IBussinessInfoService bussinessInfoService;
+	@Autowired
+	private IBussinessTransferOrderService transferOrderService;
 
 	/**
 	 *	代付1.0:查询订单状态
@@ -101,24 +105,23 @@ public class BussinessPayController {
 		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
 				.eq(Bussiness::getAccountId, user.getUserId()).eq(Bussiness::getSecret, orderQueryDto.getSecret()));
 		Assert.notNull(bussiness,"商户不存在");
-		BussinessUserWithdraw withdraw = withdrawService.getByBussinessOrderId(bussiness.getId(), businessOrderId);
-		if(withdraw == null){
-			return R.fail("商户订单不存在");
-		}else{
+		List<BussinessUserWithdraw> withdrawList = withdrawService.getByBussinessOrderId(bussiness.getId(), Func.toStrList(businessOrderId));
+		List<JSONObject> queryList = withdrawList.stream().map(item -> {
 			JSONObject data = new JSONObject();
-			Integer withdrawStatus = withdraw.getWithdrawStatus();
+			Integer withdrawStatus = item.getWithdrawStatus();
 			//status: 1待确认、2已确认、3确认失败
-			if(withdrawStatus.intValue() == SystemConstant.WithdrawOrderStatus.SUCCESS.getValue()){
+			if (withdrawStatus.intValue() == SystemConstant.WithdrawOrderStatus.SUCCESS.getValue()) {
 				data.put("status", 2);
-			}else if(withdrawStatus.intValue() == SystemConstant.WithdrawOrderStatus.FAIL.getValue()){
+			} else if (withdrawStatus.intValue() == SystemConstant.WithdrawOrderStatus.FAIL.getValue()) {
 				data.put("status", 3);
-			}else{
+			} else {
 				data.put("status", 0);
 			}
-			data.put("bussinessOrderId", orderQueryDto.getBussinessOrderId());
-			data.put("failReason", withdraw.getFailReason());
-			return R.data(data);
-		}
+			data.put("bussinessOrderId", item.getBussinessOrderId());
+			data.put("failReason", item.getFailReason());
+			return data;
+		}).collect(Collectors.toList());
+		return R.data(queryList);
 
 		/*
 		*代付1.1版本
@@ -183,9 +186,9 @@ public class BussinessPayController {
 			return R.fail("代付金额不能超过商户每日限额(限额 : 发起金额(不含手续费) = " + bussiness.getMaxLimit().toString() + ":" + String.valueOf(payOrderDto.getOrderAmount()) + ")");
 		}else{
 			//获取今日采购商已代付金额
-			BusinessDeptDaliyStat todayStat = businessDeptDaliyStatService.getTodayStat(bussiness.getId());
+			BusinessDeptDaliyStat todayStat = businessDeptDailyStatService.getTodayStat(bussiness.getId());
 			if(todayStat == null) {
-				businessDeptDaliyStatService.createTodayStat(bussiness.getId(), null);
+				businessDeptDailyStatService.createTodayStat(bussiness.getId(), null);
 			}else{
 				BigDecimal todayAmount = todayStat.getStatAmount();
 				if(todayAmount.add(new BigDecimal(payOrderDto.getOrderAmount())).compareTo(bussiness.getMaxLimit()) == 1){ //如果当日已分润金额+本次订单分润金额大于商户每日上限分润金额
@@ -233,7 +236,7 @@ public class BussinessPayController {
 			if(this.bussinessDebitService.save(debit)){
 				BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
 				bussinessTransferOrder.setFromMerchantNo(bussiness.getMerchantNo());
-				bussinessTransferOrder.setToMerchantNo(yeePayConst.getParentMerchantNo());
+				bussinessTransferOrder.setToMerchantNo(bussinessInfo.getParentMerchantNo());
 				bussinessTransferOrder.setTransferUsage("采购");
 				bussinessTransferOrder.setOrderAmount(transferAmount.toString());
 				bussinessTransferOrder.setFeeChargeSide("OUTSIDE");
@@ -272,28 +275,6 @@ public class BussinessPayController {
 		}
 	}
 
-	private BussinessDebit generateDebit(PayOrderDto payOrderDto){
-		BussinessDebit bussinessDebit = new BussinessDebit();
-		bussinessDebit.setFee(BigDecimal.valueOf(1));
-		bussinessDebit.setPrice(BigDecimal.valueOf(payOrderDto.getOrderAmount()));
-		bussinessDebit.setType(SystemConstant.BussinessDebitType.COMMISSION.getValue());
-		bussinessDebit.setBankAccountType(payOrderDto.getBankAccountType());
-		bussinessDebit.setReceiverAccountName(payOrderDto.getReceiverAccountName());
-		bussinessDebit.setReceiverAccountNo(payOrderDto.getReceiverAccountNo());
-		bussinessDebit.setReceiverBankCode(payOrderDto.getReceiverBankCode());
-		bussinessDebit.setBussinessOrderId(payOrderDto.getBussinessOrderId());
-		bussinessDebit.setMethod(2);//表示api对接
-		bussinessDebit.setFreeze(String.valueOf(payOrderDto.getOrderAmount()));
-		return bussinessDebit;
-	}
-
-
-	public static void main(String[] args){
-		String remain = "FF4B299BBD4357507945013F418D21A9";
-		String decrypt = MoneyDesUtil.decrypt(remain, MoneyDesUtil.KEY_FOR_UC);
-		System.out.printf(decrypt);
-	}
-
 	/**
 	 *  开放给第三方的商户提现功能
 	 *	1、进行小微用户进件
@@ -303,40 +284,40 @@ public class BussinessPayController {
 	 * @param payToUserDto 交易信息
 	 * */
 	@PostMapping("/payToUser")
-	@AccessLimit(second = 2, maxCount = 1)
+	@AccessLimit(second = 2, maxCount = 10)
 	public R payToUser(@RequestBody @Valid PayToUserDto payToUserDto, HttpServletRequest request){
 		String maintain = paramService.getValue("maintain");
 		if(StringUtil.isNotBlank(maintain)){
 			if(maintain.equals("0")){ //进入维护时间
-				return R.fail("系统维护时间为每天晚上22:00-凌晨07:00");
+				return R.data(400, "FAIL", "系统维护时间为每天晚上22:00-凌晨07:00");
 			}
 		}
 		BladeUser user = AuthUtil.getUser();
 		if(user == null){
-			return R.fail("账号不存在");
+			return R.data(400, "FAIL", "账号不存在");
 		}
 		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
 				.eq(Bussiness::getAccountId, user.getUserId()).eq(Bussiness::getSecret, payToUserDto.getSecret()));
 		if(bussiness == null){
-			return R.fail("商户不存在");
+			return R.data(400, "FAIL", "商户不存在");
 		}
 		if(bussiness.getRegisterStatus() == null || bussiness.getRegisterStatus().intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
 			log.error("=================代付请求前校验,商户未完成进件审核=================");
-			return R.fail("请先完成商户进件审核");
+			return R.data(400, "FAIL", "请先完成商户进件审核");
 		}
 		if(BigDecimal.valueOf(payToUserDto.getOrderAmount()).compareTo(bussiness.getMaxLimit()) == 1){ //大于的时候返回1,等于返回0,小于返回-1
 			log.error("=================代付请求前校验,提现金额不能超过商户每日限额=================");
-			return R.fail("代付金额不能超过商户每日限额(限额 : 发起金额(不含手续费) = " + bussiness.getMaxLimit().toString() + ":" + payToUserDto.getOrderAmount() + ")");
+			return R.data(400, "FAIL", "代付金额不能超过商户每日限额(限额 : 发起金额(不含手续费) = " + bussiness.getMaxLimit().toString() + ":" + payToUserDto.getOrderAmount() + ")");
 		}else{
 			//获取今日采购商已代付金额
-			BusinessDeptDaliyStat todayStat = businessDeptDaliyStatService.getTodayStat(bussiness.getId());
+			BusinessDeptDaliyStat todayStat = businessDeptDailyStatService.getTodayStat(bussiness.getId());
 			if(todayStat == null) {
-				businessDeptDaliyStatService.createTodayStat(bussiness.getId(), null);
+				businessDeptDailyStatService.createTodayStat(bussiness.getId(), null);
 			}else{
 				BigDecimal todayAmount = todayStat.getStatAmount();
 				if(todayAmount.add(new BigDecimal(payToUserDto.getOrderAmount())).compareTo(bussiness.getMaxLimit()) == 1){ //如果当日已分润金额+本次订单分润金额大于商户每日上限分润金额
 					log.error("=================代付请求前校验,今日提现金额已超过商户每日限额=================");
-					return R.fail("今日代付金额已超过商户每日限额");
+					return R.data(400, "FAIL", "今日代付金额已超过商户每日限额");
 				}
 			}
 		}
@@ -352,11 +333,14 @@ public class BussinessPayController {
 		BigDecimal transferAmount = orderAmount.add(transferFee).add(withdrawFee);
 		//如果余额小于订单金额+代付手续费+转账手续费,则认为不可以发起代付
 		if(remain.compareTo(transferAmount.add(transferFee)) == -1){
-			return R.fail("商户余额不足,无法发起代付。");
+			return R.data(400, "FAIL", "商户余额不足,无法发起代付。");
 		}
 
 		BussinessUserInfo userInfoDTO = this.toUserInfo(payToUserDto, bussiness.getId());
 		BussinessUserInfo dbUserInfo = userInfoService.getByNameCardBank(userInfoDTO);
+		Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+		userInfoDTO.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+		userInfoDTO.setParentMerchantNo(parentBussiness.getMerchantNo());
 		if(dbUserInfo == null){
 			boolean save = this.userInfoService.save(userInfoDTO);
 			if(save){
@@ -364,22 +348,21 @@ public class BussinessPayController {
 				R result = this.userRegisterAndCreateWithdraw(userInfoDTO, payToUserDto, IPUtils.getIP(request));
 				return result;
 			}else{
-				return R.fail("代付失败(CODE:40003)");
+				return R.data(400, "FAIL", "代付失败(CODE:40003)");
 			}
 		}else{
 			Integer registerStatus = dbUserInfo.getRegisterStatus();
-			if(registerStatus != null &&
-					(registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()
-							|| registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUBMIT_SUCCESS.getValue())
-					|| registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.WAIT_AUDIT.getValue()){
+			if(registerStatus != null && registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
 				//情况二:直接发起提现前第一次转账
 				R<Long> transferResult = this.transferOrderToPlatform(dbUserInfo, bussiness.getMerchantNo(), transferAmount.toString(), payToUserDto, IPUtils.getIP(request));
 				if(transferResult.getCode() == 200){
-					return R.success("代付受理成功,请等待结果");
+					return R.data("PROCESSING", "代付受理成功,请等待结果");
 				}else{
-					return R.fail("代付失败(CODE:FT)");
+					return R.data(400, "FAIL", "代付失败(CODE:FT)");
 				}
-			}else{
+			}else if(registerStatus != null && (registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUBMIT_FAIL.getValue()
+							|| registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.FAIL.getValue()
+							|| registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.DOING.getValue())){
 				userInfoDTO.setId(dbUserInfo.getId());
 				userInfoDTO.setCreateTime(dbUserInfo.getCreateTime());
 				BussinessUserInfo userInfo = BeanUtil.copyProperties(userInfoDTO, BussinessUserInfo.class);
@@ -389,10 +372,114 @@ public class BussinessPayController {
 					R result = this.userRegisterAndCreateWithdraw(userInfoDTO, payToUserDto, IPUtils.getIP(request));
 					return result;
 				}else{
-					return R.fail("代付失败(CODE:40004)");
+					return R.data(400, "FAIL", "代付失败(CODE:40004)");
 				}
+			}else{
+				return R.data("PROCESSING", "代付受理成功,请等待结果");
+			}
+		}
+	}
+
+	/**
+	 *  开放给第三方的商户提现功能
+	 *	1、进行小微用户进件
+	 *  2、进件成功后,入驻商户转账金额到平台商户
+	 *  3、转账成功后,平台商户转账到小微用户商户号下
+	 *  4、转账成功后。小微用户发起提现下单
+	 * */
+	@PostMapping("/import-payToUser-excel")
+	public R importPayToUserList(MultipartFile file){
+		String maintain = paramService.getValue("maintain");
+		if(StringUtil.isNotBlank(maintain)){
+			if(maintain.equals("0")){ //进入维护时间
+				return R.fail("系统维护时间为每天晚上22:00-凌晨07:00");
+			}
+		}
+		//将表格解析为list
+		List<WithdrawRequestExcel> withdrawRequestExcelList = ExcelUtil.read(file,WithdrawRequestExcel.class);
+		cn.hutool.core.lang.Assert.isFalse(withdrawRequestExcelList.size() == 0,"表格中无记录");
+		String payBatchSize = paramService.getValue("payBatchSize");
+		if(withdrawRequestExcelList.size() > Integer.valueOf(payBatchSize)){
+			return R.fail("一次最多导入" + payBatchSize + "条记录, 当前导入数量为:" + withdrawRequestExcelList.size());
+		}
+		//获取当前采购商的可用余额
+		BladeUser bladeUser = AuthUtil.getUser();
+		Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+						.eq(Bussiness::getAccountId, bladeUser.getUserId()));
+		cn.hutool.core.lang.Assert.notNull(bussiness,"当前登录用户不是采购商,无法执行此操作");
+		if(bussiness.getRegisterStatus() == null || bussiness.getRegisterStatus().intValue() != SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+			log.error("=================代付请求前校验,商户未完成进件审核=================");
+			return R.fail("请先完成商户进件审核");
+		}
+		//本次代付订单金额
+		BigDecimal totalAmount = withdrawRequestExcelList.stream().map(
+						withdrawRequestExcel -> BigDecimal.valueOf(withdrawRequestExcel.getOrderAmount())
+		).reduce(BigDecimal.ZERO,BigDecimal::add);
+		//检查采购商今日上限金额是否已超
+		if(totalAmount.compareTo(bussiness.getMaxLimit()) == 1){ //大于的时候返回1,等于返回0,小于返回-1
+			log.error("=================代付请求前校验,提现金额不能超过商户每日限额=================");
+			return R.fail("代付金额不能超过商户每日限额(限额 : 发起金额(不含手续费) = " + bussiness.getMaxLimit().toString() + ":" + totalAmount.toString() + ")");
+		}else{
+			//获取今日采购商已分润金额
+			BusinessDeptDaliyStat todayStat = businessDeptDailyStatService.getTodayStat(bussiness.getId());
+			if(todayStat == null) {
+				businessDeptDailyStatService.createTodayStat(bussiness.getId(), null);
+			}else{
+				//今日已分润金额
+				BigDecimal todayAmount = todayStat.getStatAmount();
+				if(todayAmount.add(totalAmount).compareTo(bussiness.getMaxLimit()) == 1){ //如果当日已分润金额+本次订单分润金额大于商户每日上限分润金额
+					log.error("=================代付请求前校验,今日提现金额已超过商户每日限额=================");
+					return R.fail("今日代付金额已超过商户每日限额");
+				}
+			}
+		}
+		//1、先发起一次子商户转账到平台商户
+		//2、如果余额小于订单金额+提现手续费+转账手续费*2,则认为不可以发起代付
+		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();
+		DecimalFormat payDecimalFormat = new DecimalFormat("0.00");
+		BigDecimal totalOrderAmount = new BigDecimal(payDecimalFormat.format(totalAmount));
+		BigDecimal withdrawFee = new BigDecimal(withdrawRate);
+		BigDecimal transferFee = new BigDecimal(transferRate);
+		BigDecimal transferAmount = totalOrderAmount.add(transferFee.multiply(BigDecimal.valueOf(withdrawRequestExcelList.size()))).add(withdrawFee.multiply(BigDecimal.valueOf(withdrawRequestExcelList.size()))); //这里包含实际提现金额,提现手续费以及帮平台商承担的转账手续费
+		if(remain.compareTo(transferAmount.add(transferFee.multiply(BigDecimal.valueOf(withdrawRequestExcelList.size())))) == -1){
+			return R.fail("商户余额不足,无法发起代付。");
+		}
+		this.bussinessPayService.importPayToUserList(withdrawRequestExcelList, bussiness);
+		return R.success("导入成功");
+	}
+
+	/**
+	 *  重新发起付款(补发)
+	 * */
+	@PostMapping("/rePayToUser")
+	public R rePayToUser(@RequestParam Long withdrawId){
+		String maintain = paramService.getValue("maintain");
+		if(StringUtil.isNotBlank(maintain)){
+			if(maintain.equals("0")){ //进入维护时间
+				return R.fail("系统维护时间为每天晚上22:00-凌晨07:00");
 			}
 		}
+		R result = this.bussinessPayService.rePayToUser(withdrawId);
+		return result;
+	}
+
+	@PostMapping("/user/submit")
+	public R userSubmit(@RequestBody UserSubmitDto userSubmitDto){
+		return this.bussinessPayService.userSubmit(userSubmitDto);
+	}
+
+	@PostMapping("/user/register")
+	public R userRegister(@Valid @RequestBody UserRegisterDto userRegisterDto){
+		if(StringUtil.isBlank(userRegisterDto.getUserId())){
+			//发起一个新用户的进件
+			return this.bussinessPayService.userRegister(userRegisterDto);
+		}else{
+			//针对一个旧用户再次发起进件
+			return this.bussinessPayService.userRegisterUpdate(userRegisterDto);
+		}
 	}
 
 	/**
@@ -405,19 +492,20 @@ public class BussinessPayController {
 		BussinessUserInfo userInfo = new BussinessUserInfo();
 		userInfo.setUserName(payToUserDto.getUserName());
 		userInfo.setUserShortName(payToUserDto.getUserName());
-		userInfo.setUserLicenceNo(payToUserDto.getUserCardNo());
+		userInfo.setUserLicenceNo(payToUserDto.getUserLicenceNo());
 		userInfo.setUserLicenceType("ID_CARD");
 		userInfo.setUserCardFrontUrl(payToUserDto.getUserCardFrontUrl());
 		userInfo.setUserCardBackUrl(payToUserDto.getUserCardBackUrl());
 		userInfo.setThirdUserCardBackUrl(payToUserDto.getUserCardBackUrl());
 		userInfo.setBankCode(payToUserDto.getReceiverBankCode());
 		userInfo.setBankCardNo(payToUserDto.getReceiverAccountNo());
-		userInfo.setBankAccountType(payToUserDto.getBankAccountType());
+		userInfo.setBankAccountType(StringUtil.isNotBlank(payToUserDto.getBankAccountType()) ? payToUserDto.getBankAccountType() : "DEBIT_CARD");
 		userInfo.setUserPhone(payToUserDto.getUserPhone());
 		userInfo.setBussinessId(bussinessId);
 		return userInfo;
 	}
 
+
 	/**
 	 * 创建小微用户进件申请和提现账单
 	 * @param userInfo
@@ -434,6 +522,35 @@ public class BussinessPayController {
 			R result = this.createWithDrawOrder(userInfo, null, payToUserDto.getBussinessOrderId(), bussinessRegisterRequest.getId(), new BigDecimal(debitDecimalFormat.format(payToUserDto.getOrderAmount())), null, null, requestIp);
 			if(result.isSuccess()){
 				R registerResult = bussinessRegisterRequestService.userRegister(bussinessRegisterRequest.getId(), userInfo.getId());
+				if(registerResult.isSuccess()){
+					return R.data("PROCESSING", "代付受理成功,请等待结果");
+				}else{
+					return R.data(400, "FAIL", registerResult.getMsg());
+				}
+			}else{
+				return R.data(400, "FAIL","代付失败(CODE:40001)");
+			}
+		}else{
+			return R.data(400, "FAIL", "代付失败(CODE:40002)");
+		}
+	}
+
+	/**
+	 * 创建小微用户进件申请和提现账单
+	 * @param userInfo
+	 * @param excel
+	 * @return
+	 */
+	private R userRegisterAndCreateWithdraw(BussinessUserInfo userInfo, WithdrawRequestExcel excel, String requestIp){
+		DecimalFormat debitDecimalFormat = new DecimalFormat("0.00");
+		//先保存一个进件请求对象
+		BussinessRegisterRequest bussinessRegisterRequest = new BussinessRegisterRequest();
+		bussinessRegisterRequest.setUserInfoId(userInfo.getId());
+		boolean requestSave = this.bussinessRegisterRequestService.save(bussinessRegisterRequest);
+		if(requestSave){
+			R result = this.createWithDrawOrder(userInfo, null,null, bussinessRegisterRequest.getId(), new BigDecimal(debitDecimalFormat.format(excel.getOrderAmount())), null, null, requestIp);
+			if(result.isSuccess()){
+				R registerResult = this.bussinessRegisterRequestService.userRegister(bussinessRegisterRequest.getId(), userInfo.getId());
 				if(registerResult.isSuccess()){
 					return R.success("代付受理成功,请等待结果");
 				}else{
@@ -447,7 +564,7 @@ public class BussinessPayController {
 		}
 	}
 
-	private R createWithDrawOrder(BussinessUserInfo userInfo, Long transferOrderId, String bussinessOrderId, Long userRegisterRequestId, BigDecimal withdrawAmount, String failReason, String returnMsg, String requestIp){
+	private R<BussinessUserWithdraw> createWithDrawOrder(BussinessUserInfo userInfo, Long transferOrderId, String bussinessOrderId, Long userRegisterRequestId, BigDecimal withdrawAmount, String failReason, String returnMsg, String requestIp){
 		BussinessUserWithdraw withdraw = new BussinessUserWithdraw();
 		withdraw.setUserInfoId(userInfo.getId());
 		withdraw.setMerchantNo(userInfo.getMerchantNo());
@@ -464,8 +581,13 @@ public class BussinessPayController {
 		withdraw.setRequestIp(requestIp);
 		withdraw.setReceiverAccountName(userInfo.getUserName());
 		withdraw.setBankCode(userInfo.getBankCode());
+		withdraw.setBussinessId(userInfo.getBussinessId());
 		boolean save = this.withdrawService.save(withdraw);
-		return R.status(save);
+		if(save){
+			return R.data(withdraw);
+		}else{
+			return R.fail("提现订单保存失败");
+		}
 	}
 
 	/**
@@ -478,33 +600,244 @@ public class BussinessPayController {
 	private R<Long> transferOrderToPlatform(BussinessUserInfo userInfo, String merchantNo, String transferAmount, PayToUserDto payToUserDto, String requestIp){
 		DecimalFormat debitDecimalFormat = new DecimalFormat("0.00");
 		BigDecimal orderAmountBigDecimal = new BigDecimal(debitDecimalFormat.format(payToUserDto.getOrderAmount()));
-		BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
-		bussinessTransferOrder.setFromMerchantNo(merchantNo);
-		bussinessTransferOrder.setToMerchantNo(yeePayConst.getParentMerchantNo());
-		bussinessTransferOrder.setTransferUsage("采购");
-		bussinessTransferOrder.setOrderAmount(transferAmount);
-		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 transferSave = bussinessTransferOrderService.save(bussinessTransferOrder);
-		if(transferSave){
-			R withDrawOrderResult = this.createWithDrawOrder(userInfo, bussinessTransferOrder.getId(), payToUserDto.getBussinessOrderId(), null, orderAmountBigDecimal, "受理成功,请等待结果", "提现前第一次转账发起受理成功", requestIp);
-			if(withDrawOrderResult.isSuccess()){
-				R transferResult = bussinessPayService.transferOrder(bussinessTransferOrder, userInfo.getParentMerchantNo());
-				if(transferResult.isSuccess()){
-					return R.data(200, bussinessTransferOrder.getId(), "转账受理成功,请等待结果");
-				}else{
-					return R.data(400, bussinessTransferOrder.getId(), transferResult.getMsg());
+		BussinessTransferOrder firstTransferOrder = new BussinessTransferOrder();
+		firstTransferOrder.setFromMerchantNo(merchantNo);
+		firstTransferOrder.setToMerchantNo(userInfo.getParentMerchantNo());
+		firstTransferOrder.setTransferUsage("采购");
+		firstTransferOrder.setOrderAmount(transferAmount);
+		firstTransferOrder.setFeeChargeSide("OUTSIDE");
+		firstTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+		firstTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue());
+		firstTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+		bussinessTransferOrderService.save(firstTransferOrder);
+		R<BussinessUserWithdraw> withDrawOrderResult = this.createWithDrawOrder(userInfo, firstTransferOrder.getId(), payToUserDto.getBussinessOrderId(), null, orderAmountBigDecimal, "受理成功,请等待结果", "提现前第一次转账发起受理成功", requestIp);
+		if(withDrawOrderResult.isSuccess()){
+			R firstTransferResult = this.bussinessPayService.transferOrder(firstTransferOrder, userInfo.getParentMerchantNo());
+			BussinessUserWithdraw dbWithdraw = withDrawOrderResult.getData();
+			if(firstTransferResult.isSuccess()){
+				dbWithdraw.setFailReason("受理成功,请等待结果");
+				dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
+				this.withdrawService.updateById(dbWithdraw);
+				if(firstTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+					this.handleFirstTransferScene(firstTransferOrder.getId());
+				}else if(firstTransferResult.getMsg().equals("SUCCESS")){
+					String withdrawRate = paramService.getValue("yee_withdraw_rate");
+					BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+					secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+					secondTransferOrder.setToMerchantNo(dbWithdraw.getMerchantNo());
+					secondTransferOrder.setTransferUsage("提现前转账");
+					secondTransferOrder.setOrderAmount((dbWithdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+					secondTransferOrder.setFeeChargeSide("OUTSIDE");
+					secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+					secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+					secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+					this.transferOrderService.save(secondTransferOrder);
+					dbWithdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+					this.withdrawService.updateById(dbWithdraw);
+					R secondTransferResult = this.transferOrderService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+					if(secondTransferResult.isSuccess()){
+						if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+							this.handleSecondTransferScene(secondTransferOrder.getId());
+						}else if(secondTransferResult.getMsg().equals("SUCCESS")){
+							this.bussinessPayService.withdrawOrder(dbWithdraw, userInfo.getParentMerchantNo());
+						}
+					}else{
+						dbWithdraw.setFailReason("代付失败");
+						dbWithdraw.setReturnMsg(secondTransferResult.getMsg());
+						dbWithdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+						this.withdrawService.updateById(dbWithdraw);
+						return R.fail("代付失败");
+					}
 				}
+				return R.success("受理成功,请等待结果");
 			}else{
-				return R.fail("代付失败(CODE:YWSB)");
+				dbWithdraw.setFailReason("代付失败");
+				dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
+				dbWithdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+				this.withdrawService.updateById(dbWithdraw);
+				return R.data(400, firstTransferOrder.getId(), firstTransferResult.getMsg());
 			}
 		}else{
-			log.error("====================提现前第一次转账业务订单保存失败====================");
-			log.error(JSONUtil.toJsonStr(bussinessTransferOrder));
-			return R.data(400, bussinessTransferOrder.getId(), "转账单保存失败");
+			return R.fail("代付失败(CODE:YWSB)");
 		}
 	}
 
+	/**
+	 * 提现前发起第一次转账到平台商
+	 * @param userInfo
+	 * @param merchantNo
+	 * @param excel
+	 * @return
+	 */
+	private R<Long> transferOrderToPlatform(BussinessUserInfo userInfo, String merchantNo, String transferAmount, WithdrawRequestExcel excel){
+		DecimalFormat debitDecimalFormat = new DecimalFormat("0.00");
+		BigDecimal orderAmountBigDecimal = new BigDecimal(debitDecimalFormat.format(excel.getOrderAmount()));
+		BussinessTransferOrder firstTransferOrder = new BussinessTransferOrder();
+		firstTransferOrder.setFromMerchantNo(merchantNo);
+		firstTransferOrder.setToMerchantNo(userInfo.getParentMerchantNo());
+		firstTransferOrder.setTransferUsage("采购");
+		firstTransferOrder.setOrderAmount(transferAmount);
+		firstTransferOrder.setFeeChargeSide("OUTSIDE");
+		firstTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+		firstTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue());
+		firstTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+		this.transferOrderService.save(firstTransferOrder);
+		R<BussinessUserWithdraw> withDrawOrderResult = this.createWithDrawOrder(userInfo, firstTransferOrder.getId(),null, null, orderAmountBigDecimal, "受理成功,请等待结果", "提现前第一次转账发起受理成功", null);
+		if(withDrawOrderResult.isSuccess()){
+			R firstTransferResult = transferOrderService.transferOrder(firstTransferOrder, userInfo.getParentMerchantNo());
+			if(firstTransferResult.isSuccess()){
+				BussinessUserWithdraw dbWithdraw = withDrawOrderResult.getData();
+				dbWithdraw.setFailReason("受理成功,请等待结果");
+				dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
+				this.withdrawService.updateById(dbWithdraw);
+				if(firstTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+					this.handleFirstTransferScene(firstTransferOrder.getId());
+				}else if(firstTransferResult.getMsg().equals("SUCCESS")){
+					String withdrawRate = paramService.getValue("yee_withdraw_rate");
+					BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+					secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+					secondTransferOrder.setToMerchantNo(dbWithdraw.getMerchantNo());
+					secondTransferOrder.setTransferUsage("提现前转账");
+					secondTransferOrder.setOrderAmount((dbWithdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+					secondTransferOrder.setFeeChargeSide("OUTSIDE");
+					secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+					secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+					secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+					this.transferOrderService.save(secondTransferOrder);
+					dbWithdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+					this.withdrawService.updateById(dbWithdraw);
+					R secondTransferResult = this.transferOrderService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+					if(secondTransferResult.isSuccess()){
+						if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+							this.handleSecondTransferScene(secondTransferOrder.getId());
+						}else if(secondTransferResult.getMsg().equals("SUCCESS")){
+							this.bussinessPayService.withdrawOrder(dbWithdraw, userInfo.getParentMerchantNo());
+						}
+					}else{
+						dbWithdraw.setFailReason("代付失败");
+						dbWithdraw.setReturnMsg(secondTransferResult.getMsg());
+						this.withdrawService.updateById(dbWithdraw);
+						return R.fail("代付失败");
+					}
+				}
+				return R.success("受理成功,请等待结果");
+			}else{
+				return R.data(400, firstTransferOrder.getId(), firstTransferResult.getMsg());
+			}
+		}else{
+			return R.fail("代付失败(CODE:YWSB)");
+		}
+	}
+
+	public void handleFirstTransferScene(Long firstTransferOrderId){
+		Timer timer = new Timer();
+		timer.schedule(new TimerTask() {
+			@Override
+			public void run() {
+				BussinessTransferOrder firstTransferOrder = transferOrderService.getById(firstTransferOrderId);
+				if(firstTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()){
+					try{
+						R result = transferOrderService.transferQuery(firstTransferOrder.getId());
+						if(result.isSuccess()){
+							if(result.getData().equals("SUCCESS")){
+								String withdrawRate = paramService.getValue("yee_withdraw_rate");
+								BussinessUserWithdraw withdraw = withdrawService.getByFirstTransferOrderId(firstTransferOrderId);
+								BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+								secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+								secondTransferOrder.setToMerchantNo(withdraw.getMerchantNo());
+								secondTransferOrder.setTransferUsage("提现前转账");
+								secondTransferOrder.setOrderAmount((withdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+								secondTransferOrder.setFeeChargeSide("OUTSIDE");
+								secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+								secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+								secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+								transferOrderService.save(secondTransferOrder);
+								withdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+								withdrawService.updateById(withdraw);
+								R secondTransferResult = transferOrderService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+								if(secondTransferResult.isSuccess()){
+									if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+										handleSecondTransferScene(secondTransferOrder.getId());
+									}else if(secondTransferResult.getMsg().equals("SUCCESS")){
+										bussinessPayService.withdrawOrder(withdraw, secondTransferOrder.getFromMerchantNo());
+									}
+								}else{
+									withdraw.setFailReason("代付失败");
+									withdraw.setReturnMsg(secondTransferResult.getMsg());
+									withdrawService.updateById(withdraw);
+								}
+								this.cancel();
+								timer.cancel();
+							}
+						}else{
+							this.cancel();
+							timer.cancel();
+						}
+					}catch (Exception e){
+						this.cancel();
+						timer.cancel();
+					}
+				}else{
+					this.cancel();
+					timer.cancel();
+				}
+			}
+		}, 500 , 10000);
+	}
+
+	public void handleSecondTransferScene(Long secondTransferOrderId){
+		Timer timer = new Timer();
+		timer.schedule(new TimerTask() {
+			@Override
+			public void run() {
+				BussinessTransferOrder firstTransferOrder = transferOrderService.getById(secondTransferOrderId);
+				if(firstTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()){
+					try{
+						R result = transferOrderService.transferQuery(secondTransferOrderId);
+						if(result.isSuccess()){
+							if(result.getData().equals("SUCCESS")){
+								BussinessUserWithdraw withdraw = withdrawService.getBySecondTransferOrderId(secondTransferOrderId);
+								Long userInfoId = withdraw.getUserInfoId();
+								BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+								withdraw.setReturnMsg("提现前第二次转账成功");
+								bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+								this.cancel();
+								timer.cancel();
+							}
+						}else{
+							this.cancel();
+							timer.cancel();
+						}
+					}catch (Exception e){
+						this.cancel();
+						timer.cancel();
+					}
+				}else{
+					this.cancel();
+					timer.cancel();
+				}
+			}
+		}, 500 , 10000);
+	}
+
+	private BussinessDebit generateDebit(PayOrderDto payOrderDto){
+		BussinessDebit bussinessDebit = new BussinessDebit();
+		bussinessDebit.setFee(BigDecimal.valueOf(1));
+		bussinessDebit.setPrice(BigDecimal.valueOf(payOrderDto.getOrderAmount()));
+		bussinessDebit.setType(SystemConstant.BussinessDebitType.COMMISSION.getValue());
+		bussinessDebit.setBankAccountType(payOrderDto.getBankAccountType());
+		bussinessDebit.setReceiverAccountName(payOrderDto.getReceiverAccountName());
+		bussinessDebit.setReceiverAccountNo(payOrderDto.getReceiverAccountNo());
+		bussinessDebit.setReceiverBankCode(payOrderDto.getReceiverBankCode());
+		bussinessDebit.setBussinessOrderId(payOrderDto.getBussinessOrderId());
+		bussinessDebit.setMethod(2);//表示api对接
+		bussinessDebit.setFreeze(String.valueOf(payOrderDto.getOrderAmount()));
+		return bussinessDebit;
+	}
+
+	public static void main(String[] args){
+		String remain = "FF4B299BBD4357507945013F418D21A9";
+		String decrypt = MoneyDesUtil.decrypt(remain, MoneyDesUtil.KEY_FOR_UC);
+		System.out.printf(decrypt);
+	}
 }

+ 1 - 1
src/main/java/org/springblade/yeePay/entity/PayToUserDto.java

@@ -29,7 +29,7 @@ public class PayToUserDto {
 
     @NotNull
     @ApiModelProperty(value = "提现人身份证号",required = true)
-    String userCardNo;
+    String userLicenceNo;
 
     @NotNull
     @ApiModelProperty(value = "用户身份证正面照",required = true)

+ 3 - 0
src/main/java/org/springblade/yeePay/entity/RechargeDto.java

@@ -20,6 +20,9 @@ public class RechargeDto {
     @ApiModelProperty(value = "收款商户商编",required = true)
     public String merchantNo;
 
+    @ApiModelProperty(value = "上级商户商编",required = true)
+    public String parentMerchantNo;
+
     @ApiModelProperty(value = "商户通知地址",required = true)
     public String notifyUrl;
 

+ 55 - 0
src/main/java/org/springblade/yeePay/entity/UserRegisterDto.java

@@ -0,0 +1,55 @@
+package org.springblade.yeePay.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@Builder
+@ApiModel("用户-进件")
+public class UserRegisterDto {
+
+    @ApiModelProperty(value = "提现人ID",required = false)
+    String userId;
+
+    @NotNull
+    @ApiModelProperty(value = "提现人姓名",required = true)
+    String userName;
+
+    @NotNull
+    @ApiModelProperty(value = "银行预留手机号",required = true)
+    String userPhone;
+
+    @NotNull
+    @ApiModelProperty(value = "提现人身份证号",required = true)
+    String userLicenceNo;
+
+    @NotNull
+    @ApiModelProperty(value = "用户身份证正面照",required = true)
+    String userCardFrontUrl;
+
+    @NotNull
+    @ApiModelProperty(value = "用户身份证反面照",required = true)
+    String userCardBackUrl;
+
+    @NotNull
+    @ApiModelProperty(value = "收款银行卡账号",required = true)
+    String receiverAccountNo;
+
+    @NotNull
+    @ApiModelProperty(value = "银行账户类型",required = true)
+    String bankAccountType;
+
+    @NotNull
+    @ApiModelProperty(value = "开户总行编码",required = true)
+    String receiverBankCode;
+
+    @NotNull
+    @ApiModelProperty(value = "商户API密钥",required = true)
+    String secret;
+
+
+}

+ 46 - 0
src/main/java/org/springblade/yeePay/entity/UserSubmitDto.java

@@ -0,0 +1,46 @@
+package org.springblade.yeePay.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@Builder
+@ApiModel("用户-添加/修改")
+public class UserSubmitDto {
+
+    @ApiModelProperty(value = "提现人ID",required = false)
+    String userId;
+
+    @ApiModelProperty(value = "提现人姓名",required = false)
+    String userName;
+
+    @ApiModelProperty(value = "银行预留手机号",required = false)
+    String userPhone;
+
+    @ApiModelProperty(value = "提现人身份证号",required = false)
+    String userLicenceNo;
+
+    @ApiModelProperty(value = "用户身份证正面照",required = false)
+    String userCardFrontUrl;
+
+    @ApiModelProperty(value = "用户身份证反面照",required = false)
+    String userCardBackUrl;
+
+    @ApiModelProperty(value = "收款银行卡账号",required = false)
+    String bankCardNo;
+
+    @ApiModelProperty(value = "银行账户类型",required = false)
+    String bankAccountType;
+
+    @ApiModelProperty(value = "开户总行编码",required = false)
+    String bankCode;
+
+    @ApiModelProperty(value = "商户API密钥",required = false)
+    String secret;
+
+
+}

+ 30 - 0
src/main/java/org/springblade/yeePay/entity/WithdrawCardBindDto.java

@@ -0,0 +1,30 @@
+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 WithdrawCardBindDto {
+
+    @ApiModelProperty(value = "总行编号",required = false)
+    public String bankCode;
+
+    @ApiModelProperty(value = "提现账号",required = true)
+    public String accountNo;
+
+    @ApiModelProperty(value = "商户编号",required = true)
+    public String merchantNo;
+
+    /**
+     * 银行卡类型
+     * 可选项如下:
+     * DEBIT_CARD:借记卡
+     * ENTERPRISE_ACCOUNT:对公账号
+     */
+    @ApiModelProperty(value = "操作类型",required = true)
+    public String bankCardType;
+}

+ 29 - 0
src/main/java/org/springblade/yeePay/entity/WithdrawCardModifyDto.java

@@ -0,0 +1,29 @@
+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 WithdrawCardModifyDto {
+
+    @ApiModelProperty(value = "总行编号",required = true)
+    public String bankCode;
+
+    @ApiModelProperty(value = "提现账号",required = true)
+    public String accountNo;
+
+    @ApiModelProperty(value = "商户编号",required = true)
+    public String merchantNo;
+
+    /**
+     * 可选项如下:
+     * MODIFY:修改
+     * CANCELLED:注销
+     */
+    @ApiModelProperty(value = "操作类型",required = true)
+    public String bankCardOperateType;
+}

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

@@ -95,12 +95,18 @@ public class RechargeOrderNotifyListener {
 						billRecord.setPayStatus(SystemConstant.BillRecordPayStatus.ERROR.getValue());
 						billRecordService.updateById(billRecord);
 					}
-				}else{
+				}else if(Objects.equals(status, "FAIL")){
 					billRecord.setPayStatus(SystemConstant.BillRecordPayStatus.FAIL.getValue());
 					billRecord.setPayWay(payWay);
 					billRecord.setThirdPayLog(decryptData.toJSONString());
 					billRecord.setFailReason(decryptData.getString("failReason"));
 					billRecordService.updateById(billRecord);
+				}else if(Objects.equals(status, "ACCOUNTING_EXCEPTION")){
+					billRecord.setPayStatus(SystemConstant.BillRecordPayStatus.ACCOUNTING_EXCEPTION.getValue());
+					billRecord.setPayWay(payWay);
+					billRecord.setThirdPayLog(decryptData.toJSONString());
+					billRecord.setFailReason(decryptData.getString("failReason"));
+					billRecordService.updateById(billRecord);
 				}
 			}
 		}

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

@@ -43,6 +43,7 @@ public class RechargeServiceFeeTransferNotifyListener {
         if(billRecord != null){
             Long bussinessId = billRecord.getUserId();
             Bussiness bussiness = bussinessService.getById(bussinessId);
+            BussinessInfo parentBussinessInfo = this.bussinessInfoService.getByBussinessId(bussiness.getParentBussinessId());
             //转账金额 = 充值原始金额 * (商户服务费率-基础费率)
             BigDecimal rechargeAmount = billRecord.getPrice();
             BigDecimal serviceRate = bussiness.getServiceRate();
@@ -55,7 +56,7 @@ public class RechargeServiceFeeTransferNotifyListener {
             transferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
             transferOrder.setOrderAmount(transferAmount.toString());
             transferOrder.setFromMerchantNo(bussiness.getMerchantNo());
-            transferOrder.setToMerchantNo(yeePayConst.getParentMerchantNo());
+            transferOrder.setToMerchantNo(parentBussinessInfo.getMerchantNo());
             transferOrder.setTransferUsage("采购");
             transferOrder.setFeeChargeSide("OUTSIDE");
             transferOrder.setTransferScene(SystemConstant.TransferScene.FOR_SERVICE_FEE.getValue());
@@ -72,4 +73,14 @@ public class RechargeServiceFeeTransferNotifyListener {
 
         }
     }
+
+    public static void main(String[] args) {
+        BigDecimal rechargeAmount = new BigDecimal(307080);
+        BigDecimal serviceRate = new BigDecimal(28);
+        BigDecimal baseRate = new BigDecimal("0.21").multiply(new BigDecimal(10));//0.21 * 10 = 2.1
+        BigDecimal saasBaseRate = new BigDecimal("0.1").multiply(new BigDecimal(10));//0.1 * 10 = 1
+        BigDecimal transferRate = (serviceRate.subtract(baseRate).subtract(saasBaseRate)).divide(new BigDecimal(1000));
+        BigDecimal transferAmount = rechargeAmount.multiply(transferRate).setScale(2, BigDecimal.ROUND_HALF_UP);
+        System.out.println(transferAmount);
+    }
 }

+ 2 - 40
src/main/java/org/springblade/yeePay/listener/TransferOrderNotifyListener.java

@@ -144,46 +144,7 @@ public class TransferOrderNotifyListener {
             R transferResult = bussinessPayService.transferOrder(transferOrder, parentMerchantNo);
             if(transferResult.isSuccess()){
                 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);
+                    this.bussinessPayService.handleFirstTransferScene(firstTransferOrderId);
                 }else if(transferResult.getMsg().equals("SUCCESS")){
                     withdraw.setFailReason("受理成功,请等待结果");
                     withdraw.setReturnMsg("提现前第二次转账发起成功");
@@ -247,6 +208,7 @@ public class TransferOrderNotifyListener {
         withdraw.setBussinessId(userInfo.getBussinessId());
         withdraw.setReceiverAccountName(userInfo.getUserName());
         withdraw.setBankCode(userInfo.getBankCode());
+        withdraw.setBussinessId(userInfo.getBussinessId());
         this.bussinessUserWithdrawService.save(withdraw);
         R<BigDecimal> remainR = this.bussinessService.queryBalance(userInfo.getMerchantNo());
         if(remainR.isSuccess()){

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

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 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.bussiness.service.IBussinessService;
 import org.springblade.modules.guosen.bussinessRegisterRequest.entity.BussinessRegisterRequest;
@@ -17,14 +18,24 @@ import org.springblade.modules.guosen.bussinessuserwithdraw.entity.BussinessUser
 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.entity.NotifyDto;
 import org.springblade.yeePay.event.UserRegisterEvent;
+import org.springblade.yeePay.service.BussinessPayService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
 
 import java.math.BigDecimal;
+import java.net.URI;
 import java.text.DecimalFormat;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.UUID;
 
 @Component
@@ -40,11 +51,11 @@ public class UserRegisterNotifyListener {
     @Autowired
     private IBussinessService bussinessService;
     @Autowired
-    private YeePayConst yeePayConst;
-    @Autowired
     private IParamService paramService;
     @Autowired
     private IBussinessTransferOrderService bussinessTransferOrderService;
+    @Autowired
+    private BussinessPayService bussinessPayService;
 
     /**
      * 小微用户入网申请回调
@@ -53,7 +64,7 @@ public class UserRegisterNotifyListener {
      */
     @EventListener
     @Async
-    public void merchantRegisterNotify(UserRegisterEvent userRegisterEvent) {
+    public void userRegisterNotify(UserRegisterEvent userRegisterEvent) {
         JSONObject decryptData = userRegisterEvent.getDecryptData(); //获取回调信息,解密后的数据
 
         String requestNo = decryptData.getString("requestNo");
@@ -76,20 +87,25 @@ public class UserRegisterNotifyListener {
             }else if(applicationStatus.equals("COMPLETED")){
                 registerRequest.setApplicationStatus(SystemConstant.BussinessRegisterStatus.SUCCESS.getValue());
                 userInfo.setRegisterStatus(SystemConstant.BussinessRegisterStatus.SUCCESS.getValue());
-                BussinessUserWithdraw withdraw = withdrawService.getByUserRegisterRequestId(registerRequest.getId());
-                withdraw.setMerchantNo(decryptData.getString("merchantNo"));
-                withdrawService.updateById(withdraw);
-                //发起提现前第一次转账
-                this.sendFirstTransferForWithdraw(withdraw);
             }
             registerRequest.setAuditOpinion(decryptData.getString("auditOpinion"));
             registerRequest.setApplicationNo(decryptData.getString("applicationNo"));
             registerRequest.setMerchantNo(decryptData.getString("merchantNo"));
             userInfo.setAuditOpinion(decryptData.getString("auditOpinion"));
-            boolean update = bussinessRegisterRequestService.updateById(registerRequest);
-            if(update){
-                userInfo.setMerchantNo(decryptData.getString("merchantNo"));
-                userInfoService.updateById(userInfo);
+            userInfo.setMerchantNo(decryptData.getString("merchantNo"));
+            bussinessRegisterRequestService.updateById(registerRequest);
+            userInfoService.updateById(userInfo);
+            //发送回调通知给采购商
+            this.registerCallback(userInfo, decryptData.getString("auditOpinion"));
+
+            if(applicationStatus.equals("COMPLETED")){
+                BussinessUserWithdraw withdraw = withdrawService.getByUserRegisterRequestId(registerRequest.getId());
+                if(withdraw != null){
+                    withdraw.setMerchantNo(decryptData.getString("merchantNo"));
+                    withdrawService.updateById(withdraw);
+                    //发起提现前第一次转账
+                    this.sendFirstTransferForWithdraw(withdraw);
+                }
             }
         }
     }
@@ -103,6 +119,7 @@ public class UserRegisterNotifyListener {
         BussinessUserInfo userInfo = this.userInfoService.getById(userInfoId);
         Long bussinessId = userInfo.getBussinessId();
         Bussiness bussiness = bussinessService.getById(bussinessId);
+        Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
         DecimalFormat debitDecimalFormat = new DecimalFormat("0.00");
         BigDecimal orderAmountBigDecimal = new BigDecimal(debitDecimalFormat.format(withdraw.getOrderAmount()));
         //检查商户是否有足够余额进行代付
@@ -111,33 +128,183 @@ public class UserRegisterNotifyListener {
         BigDecimal transferFee = new BigDecimal(debitDecimalFormat.format(Double.parseDouble(transferRate))).multiply(new BigDecimal(2));
         BigDecimal withdrawFee = new BigDecimal(debitDecimalFormat.format(Double.parseDouble(withdrawRate)));
         BigDecimal transferAmount = orderAmountBigDecimal.add(transferFee).add(withdrawFee);
-        BussinessTransferOrder bussinessTransferOrder = new BussinessTransferOrder();
-        bussinessTransferOrder.setFromMerchantNo(bussiness.getMerchantNo());
-        bussinessTransferOrder.setToMerchantNo(yeePayConst.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 transferSave = bussinessTransferOrderService.save(bussinessTransferOrder);
+        BussinessTransferOrder firstBussinessTransferOrder = new BussinessTransferOrder();
+        firstBussinessTransferOrder.setFromMerchantNo(bussiness.getMerchantNo());
+        firstBussinessTransferOrder.setToMerchantNo(parentBussiness.getMerchantNo());
+        firstBussinessTransferOrder.setTransferUsage("提现前转账到平台商");
+        firstBussinessTransferOrder.setOrderAmount(transferAmount.toString());
+        firstBussinessTransferOrder.setFeeChargeSide("OUTSIDE");
+        firstBussinessTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+        firstBussinessTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue());
+        firstBussinessTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+        boolean transferSave = bussinessTransferOrderService.save(firstBussinessTransferOrder);
         if(transferSave){
-            withdraw.setFirstTransferOrderId(bussinessTransferOrder.getId());
+            withdraw.setFirstTransferOrderId(firstBussinessTransferOrder.getId());
             this.withdrawService.updateById(withdraw);
-            R transferResult = bussinessTransferOrderService.transferOrder(bussinessTransferOrder, userInfo.getParentMerchantNo());
-            if(transferResult.isSuccess()){
+            R firstTransferResult = bussinessTransferOrderService.transferOrder(firstBussinessTransferOrder, userInfo.getParentMerchantNo());
+            if(firstTransferResult.isSuccess()){
                 withdraw.setFailReason("受理成功,请等待结果");
-                withdraw.setReturnMsg("提现前第一次转账发起成功");
+                withdraw.setReturnMsg(firstTransferResult.getMsg());
                 this.withdrawService.updateById(withdraw);
+                if(firstTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+                    this.handleFirstTransferScene(firstBussinessTransferOrder.getId());
+                }else if(firstTransferResult.getMsg().equals("SUCCESS")){
+                    BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+                    secondTransferOrder.setFromMerchantNo(firstBussinessTransferOrder.getToMerchantNo());
+                    secondTransferOrder.setToMerchantNo(withdraw.getMerchantNo());
+                    secondTransferOrder.setTransferUsage("提现前转账到小微");
+                    secondTransferOrder.setOrderAmount((withdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+                    secondTransferOrder.setFeeChargeSide("OUTSIDE");
+                    secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+                    secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+                    secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+                    this.bussinessTransferOrderService.save(secondTransferOrder);
+                    withdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+                    withdraw.setFailReason("受理成功,请等待结果");
+                    withdraw.setReturnMsg("提现前第一次转账成功");
+                    this.withdrawService.updateById(withdraw);
+                    R secondTransferResult = this.bussinessTransferOrderService.transferOrder(secondTransferOrder, firstBussinessTransferOrder.getToMerchantNo());
+                    if(secondTransferResult.isSuccess()){
+                        if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+                            this.handleSecondTransferScene(secondTransferOrder.getId());
+                        }else if(secondTransferResult.getMsg().equals("SUCCESS")){
+                            this.bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+                        }
+                    }else{
+                        withdraw.setFailReason("代付失败");
+                        withdraw.setReturnMsg(secondTransferResult.getMsg());
+                        withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+                        this.withdrawService.updateById(withdraw);
+                    }
+                }
             }else{
                 withdraw.setFailReason("代付失败");
-                withdraw.setReturnMsg("提现前第一次转账发起失败:" + transferResult.getMsg());
+                withdraw.setReturnMsg("提现前第一次转账发起失败:" + firstTransferResult.getMsg());
                 withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
                 this.withdrawService.updateById(withdraw);
             }
         }else{
             log.error("=======================提现前第一次转账业务订单保存失败========================");
-            log.error(JSONUtil.toJsonStr(bussinessTransferOrder));
+            log.error(JSONUtil.toJsonStr(firstBussinessTransferOrder));
+        }
+    }
+
+    public void handleFirstTransferScene(Long firstTransferOrderId){
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                BussinessTransferOrder firstTransferOrder = bussinessTransferOrderService.getById(firstTransferOrderId);
+                if(firstTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()){
+                    try{
+                        R result = bussinessTransferOrderService.transferQuery(firstTransferOrder.getId());
+                        if(result.isSuccess()){
+                            if(result.getData().equals("SUCCESS")){
+                                String withdrawRate = paramService.getValue("yee_withdraw_rate");
+                                BussinessUserWithdraw withdraw = withdrawService.getByFirstTransferOrderId(firstTransferOrderId);
+                                BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+                                secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+                                secondTransferOrder.setToMerchantNo(withdraw.getMerchantNo());
+                                secondTransferOrder.setTransferUsage("提现前转账");
+                                secondTransferOrder.setOrderAmount((withdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+                                secondTransferOrder.setFeeChargeSide("OUTSIDE");
+                                secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-","").toUpperCase());
+                                secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+                                secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+                                bussinessTransferOrderService.save(secondTransferOrder);
+                                withdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+                                withdrawService.updateById(withdraw);
+                                R secondTransferResult = bussinessTransferOrderService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+                                if(secondTransferResult.isSuccess()){
+                                    if(secondTransferResult.getMsg().equals("REQUEST_RECEIVE")){
+                                        handleSecondTransferScene(secondTransferOrder.getId());
+                                    }else if(secondTransferResult.getMsg().equals("SUCCESS")){
+                                        bussinessPayService.withdrawOrder(withdraw, secondTransferOrder.getFromMerchantNo());
+                                    }
+                                }else{
+                                    withdraw.setFailReason("代付失败");
+                                    withdraw.setReturnMsg(secondTransferResult.getMsg());
+                                    withdrawService.updateById(withdraw);
+                                }
+                                this.cancel();
+                                timer.cancel();
+                            }
+                        }
+                    }catch (Exception e){
+                        this.cancel();
+                        timer.cancel();
+                    }
+                }else{
+                    this.cancel();
+                    timer.cancel();
+                }
+            }
+        }, 500 , 10000);
+    }
+
+    public void handleSecondTransferScene(Long secondTransferOrderId){
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                BussinessTransferOrder secondTransferOrder = bussinessTransferOrderService.getById(secondTransferOrderId);
+                if(secondTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()){
+                    try{
+                        R result = bussinessTransferOrderService.transferQuery(secondTransferOrderId);
+                        if(result.isSuccess()){
+                            if(result.getData().equals("SUCCESS")){
+                                BussinessUserWithdraw withdraw = withdrawService.getBySecondTransferOrderId(secondTransferOrderId);
+                                Long userInfoId = withdraw.getUserInfoId();
+                                BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+                                withdraw.setReturnMsg("提现前第二次转账成功");
+                                bussinessPayService.withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+                                this.cancel();
+                                timer.cancel();
+                            }
+                        }
+                    }catch (Exception e){
+                        this.cancel();
+                        timer.cancel();
+                    }
+                }else{
+                    this.cancel();
+                    timer.cancel();
+                }
+            }
+        }, 500 , 5000);
+    }
+
+    @Async
+    void registerCallback(BussinessUserInfo userInfo, String auditOpinion){
+        Bussiness bussiness = this.bussinessService.getById(userInfo.getBussinessId());
+        String registerNotifyUrl = bussiness.getRegisterNotifyUrl();
+        if(StringUtil.isNotBlank(registerNotifyUrl)){
+            JSONObject callbackData = new JSONObject();
+            callbackData.put("userId", userInfo.getId().toString());
+            if(userInfo.getRegisterStatus().intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+                callbackData.put("status", "SUCCESS");
+            }else if(userInfo.getRegisterStatus().intValue() == SystemConstant.BussinessRegisterStatus.FAIL.getValue()){
+                callbackData.put("status", "FAIL");
+            }else{
+                callbackData.put("status", "WAIT");
+            }
+            callbackData.put("auditOpinion", auditOpinion);
+            try{
+                RestTemplate restTemplate = new RestTemplate();
+                HttpHeaders headers = new HttpHeaders();
+                headers.add(HttpHeaders.CONTENT_TYPE, "application/json");
+                HttpEntity<String> requestEntity = new HttpEntity<String>(JSONUtil.toJsonStr(callbackData), headers);
+                ParameterizedTypeReference<Object> reference = new ParameterizedTypeReference<Object>() {
+                };
+                URI uri = URI.create(registerNotifyUrl);
+                restTemplate.exchange(uri, HttpMethod.POST, requestEntity, reference);
+                log.info("===================================返回给商户的进件回调信息================================");
+                log.info(JSONUtil.toJsonStr(callbackData));
+            }catch (Exception e){
+                log.error("商户回调地址>>>>>>>>>>>>>> " + registerNotifyUrl);
+                log.error("商户回调地址请求失败");
+                log.error(JSONUtil.toJsonStr(callbackData));
+            }
         }
     }
 }

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

@@ -2,23 +2,47 @@ package org.springblade.yeePay.service;
 
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springblade.common.constant.SystemConstant;
+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.BeanUtil;
+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.entity.BussinessDebit;
+import org.springblade.modules.guosen.bussiness.excel.WithdrawRequestExcel;
 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.bussinessRateStrategy.service.IBussinessRateStrategyService;
+import org.springblade.modules.guosen.bussinessRegisterRequest.entity.BussinessRegisterRequest;
+import org.springblade.modules.guosen.bussinessRegisterRequest.service.IBussinessRegisterRequestService;
 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.entity.BussinessUserWithdraw;
 import org.springblade.modules.guosen.bussinessuserwithdraw.service.IBussinessUserWithdrawService;
-import org.springblade.yeePay.entity.PayOrderDto;
-import org.springblade.yeePay.entity.TransferOrderDto;
-import org.springblade.yeePay.entity.WithdrawOrderDto;
+import org.springblade.modules.guosen.productratestrategy.entity.ProductRateStrategy;
+import org.springblade.modules.guosen.productratestrategy.service.IProductRateStrategyService;
+import org.springblade.modules.system.service.IParamService;
+import org.springblade.yeePay.entity.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.UUID;
 
 @Service
@@ -33,14 +57,23 @@ public class BussinessPayService {
     private IBussinessDebitService bussinessDebitService;
     @Autowired
     private IBussinessUserWithdrawService withdrawService;
+    @Autowired
+    private IParamService paramService;
+    @Autowired
+    private IBussinessUserInfoService userInfoService;
+    @Autowired
+    private IBussinessRegisterRequestService bussinessRegisterRequestService;
+    @Autowired
+    private IBussinessService bussinessService;
 
     /**
      * 商户间转账
      * 适用于:子商户发起代付前转账到平台商、子商户充值后转账服务费到平台商
+     *
      * @param bussinessTransferOrder
      * @return
      */
-    public R transferOrder(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo){
+    public R transferOrder(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo) {
         TransferOrderDto transferOrderDto = TransferOrderDto.builder()
                 .fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
                 .toMerchantNo(bussinessTransferOrder.getToMerchantNo())
@@ -53,41 +86,38 @@ public class BussinessPayService {
         JSONObject data = JSONUtil.parseObj(result.getData());
         String requestNo = data.getStr("requestNo");
         String fromMerchantNo = data.getStr("fromMerchantNo");
-        BussinessTransferOrder dbTransferOrder = this.bussinessTransferOrderService.getByRequestNo(requestNo, fromMerchantNo);
-        if(dbTransferOrder == null){
-            log.error("=================转账请求响应,转账订单不存在====================");
-            log.error("转账请求号:" + requestNo + ", 转出商户号:" + fromMerchantNo);
-            return R.fail("TF订单查询失败");
-        }
         String returnCode = data.getStr("returnCode");
         String transferStatus = data.getStr("transferStatus");
-        dbTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
-        if(returnCode.equals("UA00000")){ //转账成功
+        if (returnCode.equals("UA00000")) { //转账成功
+            BussinessTransferOrder dbTransferOrder = this.bussinessTransferOrderService.getByRequestNo(requestNo, fromMerchantNo);
+            dbTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
             dbTransferOrder.setFee(data.getStr("fee"));
             dbTransferOrder.setOrderNo(data.getStr("orderNo"));
             dbTransferOrder.setFinishTime(data.getStr("finishTime"));
             dbTransferOrder.setDebitAmount(data.getStr("debitAmount"));
             dbTransferOrder.setFeeMerchantNo(data.getStr("feeMerchantNo"));
             dbTransferOrder.setReceiveAmount(data.getStr("receiveAmount"));
-            if("REQUEST_RECEIVE".equals(transferStatus)){
+            if ("REQUEST_RECEIVE".equals(transferStatus)) {
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue());
                 bussinessTransferOrderService.updateById(dbTransferOrder);
                 return R.success("REQUEST_RECEIVE");
-            }else if("SUCCESS".equals(transferStatus)){
+            } else if ("SUCCESS".equals(transferStatus)) {
+                dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.SUCCESS.getValue());
+                this.bussinessTransferOrderService.updateById(dbTransferOrder);
                 return R.success("SUCCESS");
-            }else if("FAIL".equals(transferStatus)){
+            } else if ("FAIL".equals(transferStatus)) {
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
                 dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
                 bussinessTransferOrderService.updateById(dbTransferOrder);
                 return R.fail(data.getStr("returnMsg"));
             }
-        }else{
-            log.error("=================充值服务费转账请求响应转账下单失败====================");
+        } else {
+            log.error("=================转账请求响应转账下单失败====================");
             log.error("转账请求号:" + requestNo + ", 转出商户号:" + fromMerchantNo + ", 失败原因:" + data.getStr("returnMsg"));
-            dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
-            dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
-            dbTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
-            bussinessTransferOrderService.updateById(dbTransferOrder);
+            bussinessTransferOrder.setReturnMsg(data.getStr("returnMsg"));
+            bussinessTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
+            bussinessTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
+            bussinessTransferOrderService.updateById(bussinessTransferOrder);
             return R.fail(data.getStr("returnMsg"));
         }
         return R.status(true);
@@ -97,10 +127,11 @@ public class BussinessPayService {
      * 调试专用
      * 商户间转账
      * 适用于:子商户发起代付前转账到平台商、子商户充值后转账服务费到平台商
+     *
      * @param bussinessTransferOrder
      * @return
      */
-    public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo){
+    public R transferOrderDebug(BussinessTransferOrder bussinessTransferOrder, String parentMerchantNo) {
         TransferOrderDto transferOrderDto = TransferOrderDto.builder()
                 .fromMerchantNo(bussinessTransferOrder.getFromMerchantNo())
                 .toMerchantNo(bussinessTransferOrder.getToMerchantNo())
@@ -114,7 +145,7 @@ public class BussinessPayService {
         String requestNo = data.getStr("requestNo");
         String fromMerchantNo = data.getStr("fromMerchantNo");
         BussinessTransferOrder dbTransferOrder = this.bussinessTransferOrderService.getByRequestNo(requestNo, fromMerchantNo);
-        if(dbTransferOrder == null){
+        if (dbTransferOrder == null) {
             log.error("=================转账请求响应,转账订单不存在====================");
             log.error("转账请求号:" + requestNo + ", 转出商户号:" + fromMerchantNo);
             return R.fail("TF订单查询失败");
@@ -122,26 +153,26 @@ public class BussinessPayService {
         String returnCode = data.getStr("returnCode");
         String transferStatus = data.getStr("transferStatus");
         dbTransferOrder.setThirdLog(JSONUtil.toJsonStr(data));
-        if(returnCode.equals("UA00000")){ //转账成功
+        if (returnCode.equals("UA00000")) { //转账成功
             dbTransferOrder.setFee(data.getStr("fee"));
             dbTransferOrder.setOrderNo(data.getStr("orderNo"));
             dbTransferOrder.setFinishTime(data.getStr("finishTime"));
             dbTransferOrder.setDebitAmount(data.getStr("debitAmount"));
             dbTransferOrder.setFeeMerchantNo(data.getStr("feeMerchantNo"));
             dbTransferOrder.setReceiveAmount(data.getStr("receiveAmount"));
-            if("REQUEST_RECEIVE".equals(transferStatus)){
+            if ("REQUEST_RECEIVE".equals(transferStatus)) {
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue());
                 bussinessTransferOrderService.updateById(dbTransferOrder);
                 return R.status(true);
-            }else if("SUCCESS".equals(transferStatus)){
+            } else if ("SUCCESS".equals(transferStatus)) {
                 return R.status(true);
-            }else if("FAIL".equals(transferStatus)){
+            } else if ("FAIL".equals(transferStatus)) {
                 dbTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.FAIL.getValue());
                 dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
                 bussinessTransferOrderService.updateById(dbTransferOrder);
                 return R.fail(data.getStr("returnMsg"));
             }
-        }else{
+        } else {
             log.error("=================充值服务费转账请求响应转账下单失败====================");
             log.error("转账请求号:" + requestNo + ", 转出商户号:" + fromMerchantNo + ", 失败原因:" + data.getStr("returnMsg"));
             dbTransferOrder.setReturnMsg(data.getStr("returnMsg"));
@@ -157,17 +188,18 @@ public class BussinessPayService {
     /**
      * 代付
      * 只适用于平台商代付
+     *
      * @param debitId
      * @return
      */
     @Async
-    public R payOrder(Long debitId, String parentMerchantNo){
+    public R payOrder(Long debitId, String parentMerchantNo) {
         BussinessDebit debit = this.bussinessDebitService.getById(debitId);
-        if(debit != null){
+        if (debit != null) {
             String requestNo = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
             debit.setRequestNo(requestNo);
             boolean save = bussinessDebitService.updateById(debit);
-            if(save){
+            if (save) {
                 PayOrderDto payOrderDto = new PayOrderDto();
                 payOrderDto.setOrderAmount(debit.getPrice().doubleValue());
                 payOrderDto.setReceiveType("REAL_TIME");
@@ -178,19 +210,19 @@ public class BussinessPayService {
                 payOrderDto.setBankAccountType(debit.getBankAccountType());
                 payOrderDto.setRequestNo(debit.getRequestNo());
                 R result = this.yeePayService.payOrder(payOrderDto, parentMerchantNo);
-                if(result.isSuccess()){
+                if (result.isSuccess()) {
                     JSONObject data = JSONUtil.parseObj(result.getData());
                     String returnCode = data.getStr("returnCode");
                     String returnMsg = data.getStr("returnMsg");
                     String orderNo = data.getStr("orderNo");
                     String msg = returnMsg;
                     debit.setThirdPayLog(JSONUtil.toJsonStr(data));
-                    if(StringUtil.isNotBlank(returnCode) && returnCode.equals("UA00000")) { //代付发起成功
+                    if (StringUtil.isNotBlank(returnCode) && returnCode.equals("UA00000")) { //代付发起成功
                         log.info("========================单笔代付发起成功====================");
                         debit.setThirdOrderNo(orderNo);
                         bussinessDebitService.updateById(debit);
                         return R.data(data, msg);
-                    } else{
+                    } else {
                         log.error("========================单笔代付发起失败====================");
                         log.error(msg);
                         debit.setStatus(SystemConstant.BussinessDebitStatus.FAIL.getValue());
@@ -199,24 +231,24 @@ public class BussinessPayService {
                         bussinessDebitService.updateById(debit);
                         return R.data(400, data, msg);
                     }
-                }else{
+                } else {
                     log.error("========================单笔代付发起失败====================");
                     log.error(result.getMsg());
                     debit.setFreeze("0.00");
                     bussinessDebitService.updateById(debit);
                     return R.fail(result.getMsg());
                 }
-            }else{
+            } else {
                 log.error("==================代付账单请求号保存失败========================");
                 return R.fail("代付账单请求号保存失败");
             }
-        }else{
+        } else {
             log.error("==================代付账单不存在========================");
             return R.fail("代付账单不存在");
         }
     }
 
-    public R withdrawOrder(BussinessUserWithdraw withdraw, String parentMerchantNo){
+    public R withdrawOrder(BussinessUserWithdraw withdraw, String parentMerchantNo) {
         WithdrawOrderDto withdrawOrderDto = WithdrawOrderDto.builder()
                 .orderAmount(withdraw.getOrderAmount().doubleValue())
                 .bankAccountNo(withdraw.getBankAccountNo())
@@ -230,41 +262,487 @@ public class BussinessPayService {
         String orderNo = data.getStr("orderNo");
         String returnCode = data.getStr("returnCode");
         withdraw.setThirdLog(JSONUtil.toJsonStr(data));
-        if(returnCode.equals("UA00000")){ //转账成功
+        if (returnCode.equals("UA00000")) { //转账成功
             log.info("====================提现发起成功===========================");
             withdraw.setThirdOrderNo(orderNo);
             withdraw.setReturnMsg("提现发起成功");
-            if("REQUEST_RECEIVE".equals(status)){
+            if ("REQUEST_RECEIVE".equals(status)) {
                 withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.REQUEST_RECEIVE.getValue());
                 withdrawService.updateById(withdraw);
                 return R.status(true);
-            }else if("REQUEST_ACCEPT".equals(status)){
+            } else if ("REQUEST_ACCEPT".equals(status)) {
                 withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.REQUEST_ACCEPT.getValue());
                 withdrawService.updateById(withdraw);
                 return R.status(true);
-            }else if("REMITING".equals(status)){
+            } else if ("REMITING".equals(status)) {
                 withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.REMITING.getValue());
                 withdrawService.updateById(withdraw);
                 return R.status(true);
-            }else if("FAIL".equals(status)){
+            } else if ("FAIL".equals(status)) {
                 withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
                 withdraw.setFailReason(data.getStr("returnMsg"));
                 withdraw.setReturnMsg(data.getStr("returnMsg"));
                 withdrawService.updateById(withdraw);
                 return R.fail(data.getStr("returnMsg"));
-            }else{
+            } else {
                 withdraw.setFailReason(data.getStr("returnMsg"));
                 withdraw.setReturnMsg(data.getStr("returnMsg"));
                 withdrawService.updateById(withdraw);
                 return R.success(data.getStr("returnMsg"));
             }
-        }else{
+        } else {
             log.info("====================提现发起失败===========================");
             log.error("提现请求号:" + withdraw.getRequestNo() + ", 提现商户号:" + withdraw.getMerchantNo() + ", 失败原因:" + data.getStr("returnMsg"));
             withdraw.setFailReason(data.getStr("returnMsg"));
             withdraw.setReturnMsg(data.getStr("returnMsg"));
+            withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
             withdrawService.updateById(withdraw);
             return R.fail(data.getStr("returnMsg"));
         }
     }
+
+
+    public void handleFirstTransferScene(Long firstTransferOrderId) {
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                BussinessTransferOrder firstTransferOrder = bussinessTransferOrderService.getById(firstTransferOrderId);
+                if (firstTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()) {
+                    try {
+                        R result = bussinessTransferOrderService.transferQuery(firstTransferOrder.getId());
+                        if (result.isSuccess()) {
+                            if (result.getData().equals("SUCCESS")) {
+                                String withdrawRate = paramService.getValue("yee_withdraw_rate");
+                                BussinessUserWithdraw withdraw = withdrawService.getByFirstTransferOrderId(firstTransferOrderId);
+                                BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+                                secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+                                secondTransferOrder.setToMerchantNo(withdraw.getMerchantNo());
+                                secondTransferOrder.setTransferUsage("提现前转账");
+                                secondTransferOrder.setOrderAmount((withdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+                                secondTransferOrder.setFeeChargeSide("OUTSIDE");
+                                secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+                                secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+                                secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+                                bussinessTransferOrderService.save(secondTransferOrder);
+                                withdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+                                withdrawService.updateById(withdraw);
+                                R secondTransferResult = transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+                                if (secondTransferResult.isSuccess()) {
+                                    if (secondTransferResult.getMsg().equals("REQUEST_RECEIVE")) {
+                                        handleSecondTransferScene(secondTransferOrder.getId());
+                                    } else if (secondTransferResult.getMsg().equals("SUCCESS")) {
+                                        withdrawOrder(withdraw, secondTransferOrder.getFromMerchantNo());
+                                    }
+                                } else {
+                                    withdraw.setFailReason("代付失败");
+                                    withdraw.setReturnMsg(secondTransferResult.getMsg());
+                                    withdrawService.updateById(withdraw);
+                                }
+                                this.cancel();
+                                timer.cancel();
+                            }
+                        }
+                    } catch (Exception e) {
+                        this.cancel();
+                        timer.cancel();
+                    }
+                } else {
+                    this.cancel();
+                    timer.cancel();
+                }
+            }
+        }, 500, 10000);
+    }
+
+    public void handleSecondTransferScene(Long secondTransferOrderId) {
+        Timer timer = new Timer();
+        timer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                BussinessTransferOrder firstTransferOrder = bussinessTransferOrderService.getById(secondTransferOrderId);
+                if (firstTransferOrder.getTransferStatus().intValue() == SystemConstant.TransferOrderStatus.REQUEST_RECEIVE.getValue()) {
+                    try {
+                        R result = bussinessTransferOrderService.transferQuery(secondTransferOrderId);
+                        if (result.isSuccess()) {
+                            if (result.getData().equals("SUCCESS")) {
+                                BussinessUserWithdraw withdraw = withdrawService.getBySecondTransferOrderId(secondTransferOrderId);
+                                Long userInfoId = withdraw.getUserInfoId();
+                                BussinessUserInfo userInfo = userInfoService.getById(userInfoId);
+                                withdraw.setReturnMsg("提现前第二次转账成功");
+                                withdrawOrder(withdraw, userInfo.getParentMerchantNo());
+                                this.cancel();
+                                timer.cancel();
+                            }
+                        }else{
+                            this.cancel();
+                            timer.cancel();
+                        }
+                    } catch (Exception e) {
+                        this.cancel();
+                        timer.cancel();
+                    }
+                } else {
+                    this.cancel();
+                    timer.cancel();
+                }
+            }
+        }, 500, 10000);
+    }
+
+    private BussinessUserInfo toUserInfoFromImport(WithdrawRequestExcel excel, Long bussinessId) {
+        BussinessUserInfo userInfo = new BussinessUserInfo();
+        userInfo.setUserName(excel.getUserName());
+        userInfo.setUserPhone(excel.getUserPhone());
+        userInfo.setUserShortName(excel.getUserName());
+        userInfo.setUserLicenceNo(excel.getUserLicenceNo());
+        userInfo.setUserLicenceType("ID_CARD");
+        userInfo.setUserCardFrontUrl(excel.getUserCardFrontUrl());
+        userInfo.setUserCardBackUrl(excel.getUserCardBackUrl());
+        userInfo.setThirdUserCardBackUrl(excel.getUserCardBackUrl());
+        userInfo.setBankCode(excel.getBankCode());
+        userInfo.setBankCardNo(excel.getBankCardNo());
+        userInfo.setBankAccountType("DEBIT_CARD");
+        userInfo.setBussinessId(bussinessId);
+        return userInfo;
+    }
+
+    /**
+     * 提现前发起第一次转账到平台商
+     *
+     * @param userInfo
+     * @param merchantNo
+     * @param excel
+     * @return
+     */
+    private R<Long> transferOrderToPlatform(BussinessUserInfo userInfo, String merchantNo, WithdrawRequestExcel excel) {
+        String withdrawRate = paramService.getValue("yee_withdraw_rate");
+        String transferRate = paramService.getValue("yee_transfer_rate");
+        DecimalFormat transferDecimalFormat = new DecimalFormat("0.00");
+        BigDecimal orderAmount = new BigDecimal(transferDecimalFormat.format(excel.getOrderAmount()));
+        BigDecimal withdrawFee = new BigDecimal(withdrawRate);
+        BigDecimal transferFee = new BigDecimal(transferRate);
+        BigDecimal transferAmount = orderAmount.add(withdrawFee).add(transferFee);
+        BussinessTransferOrder firstTransferOrder = new BussinessTransferOrder();
+        firstTransferOrder.setFromMerchantNo(merchantNo);
+        firstTransferOrder.setToMerchantNo(userInfo.getParentMerchantNo());
+        firstTransferOrder.setTransferUsage("提现前转账到平台商");
+        firstTransferOrder.setOrderAmount(transferAmount.toString());
+        firstTransferOrder.setFeeChargeSide("OUTSIDE");
+        firstTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+        firstTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_FIRST_TRANSFER.getValue());
+        firstTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+        this.bussinessTransferOrderService.save(firstTransferOrder);
+        R<BussinessUserWithdraw> withDrawOrderResult = this.createWithDrawOrder(userInfo, firstTransferOrder.getId(), null, null, orderAmount, "受理成功,请等待结果", "提现前第一次转账发起受理成功", null);
+        if (withDrawOrderResult.isSuccess()) {
+            R firstTransferResult = bussinessTransferOrderService.transferOrder(firstTransferOrder, userInfo.getParentMerchantNo());
+            if (firstTransferResult.isSuccess()) {
+                BussinessUserWithdraw dbWithdraw = withDrawOrderResult.getData();
+                dbWithdraw.setFailReason("受理成功,请等待结果");
+                dbWithdraw.setReturnMsg(firstTransferResult.getMsg());
+                this.withdrawService.updateById(dbWithdraw);
+                if (firstTransferResult.getMsg().equals("REQUEST_RECEIVE")) {
+                    this.handleFirstTransferScene(firstTransferOrder.getId());
+                } else if (firstTransferResult.getMsg().equals("SUCCESS")) {
+                    BussinessTransferOrder secondTransferOrder = new BussinessTransferOrder();
+                    secondTransferOrder.setFromMerchantNo(firstTransferOrder.getToMerchantNo());
+                    secondTransferOrder.setToMerchantNo(dbWithdraw.getMerchantNo());
+                    secondTransferOrder.setTransferUsage("提现前转账到小微");
+                    secondTransferOrder.setOrderAmount((dbWithdraw.getOrderAmount().add(new BigDecimal(withdrawRate))).toString());
+                    secondTransferOrder.setFeeChargeSide("OUTSIDE");
+                    secondTransferOrder.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+                    secondTransferOrder.setTransferScene(SystemConstant.TransferScene.FOR_WITHDRAW_SECOND_TRANSFER.getValue());
+                    secondTransferOrder.setTransferStatus(SystemConstant.TransferOrderStatus.WAIT.getValue());
+                    this.bussinessTransferOrderService.save(secondTransferOrder);
+                    dbWithdraw.setSecondTransferOrderId(secondTransferOrder.getId());
+                    this.withdrawService.updateById(dbWithdraw);
+                    R secondTransferResult = this.bussinessTransferOrderService.transferOrder(secondTransferOrder, firstTransferOrder.getToMerchantNo());
+                    if (secondTransferResult.isSuccess()) {
+                        if (secondTransferResult.getMsg().equals("REQUEST_RECEIVE")) {
+                            this.handleSecondTransferScene(secondTransferOrder.getId());
+                        } else if (secondTransferResult.getMsg().equals("SUCCESS")) {
+                            this.withdrawOrder(dbWithdraw, userInfo.getParentMerchantNo());
+                        }
+                    } else {
+                        dbWithdraw.setFailReason("代付失败");
+                        dbWithdraw.setReturnMsg(secondTransferResult.getMsg());
+                        this.withdrawService.updateById(dbWithdraw);
+                        return R.fail("代付失败");
+                    }
+                }
+                return R.success("受理成功,请等待结果");
+            } else {
+                return R.data(400, firstTransferOrder.getId(), firstTransferResult.getMsg());
+            }
+        } else {
+            return R.fail("代付失败(CODE:YWSB)");
+        }
+    }
+
+    private R<BussinessUserWithdraw> createWithDrawOrder(BussinessUserInfo userInfo, Long transferOrderId, String bussinessOrderId, Long userRegisterRequestId, BigDecimal withdrawAmount, String failReason, String returnMsg, String requestIp) {
+        BussinessUserWithdraw withdraw = new BussinessUserWithdraw();
+        withdraw.setUserInfoId(userInfo.getId());
+        withdraw.setMerchantNo(userInfo.getMerchantNo());
+        withdraw.setBankAccountNo(userInfo.getBankCardNo());
+        withdraw.setFirstTransferOrderId(transferOrderId);
+        withdraw.setOrderAmount(withdrawAmount);
+        withdraw.setReceiveType("REAL_TIME");
+        withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.WAIT.getValue());
+        withdraw.setFailReason(failReason);
+        withdraw.setReturnMsg(returnMsg);
+        withdraw.setBussinessOrderId(bussinessOrderId);
+        withdraw.setUserRegisterRequestId(userRegisterRequestId);
+        withdraw.setRequestNo(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
+        withdraw.setRequestIp(requestIp);
+        withdraw.setReceiverAccountName(userInfo.getUserName());
+        withdraw.setBankCode(userInfo.getBankCode());
+        withdraw.setBussinessId(userInfo.getBussinessId());
+        boolean save = this.withdrawService.save(withdraw);
+        if (save) {
+            return R.data(withdraw);
+        } else {
+            return R.fail("提现订单保存失败");
+        }
+    }
+
+    /**
+     * 创建小微用户进件申请和提现账单
+     *
+     * @param userInfo
+     * @param excel
+     * @return
+     */
+    private R userRegisterAndCreateWithdraw(BussinessUserInfo userInfo, WithdrawRequestExcel excel, String requestIp) {
+        DecimalFormat debitDecimalFormat = new DecimalFormat("0.00");
+        //先保存一个进件请求对象
+        BussinessRegisterRequest bussinessRegisterRequest = new BussinessRegisterRequest();
+        bussinessRegisterRequest.setUserInfoId(userInfo.getId());
+        boolean requestSave = this.bussinessRegisterRequestService.save(bussinessRegisterRequest);
+        if (requestSave) {
+            R<BussinessUserWithdraw> result = this.createWithDrawOrder(userInfo, null, null, bussinessRegisterRequest.getId(), new BigDecimal(debitDecimalFormat.format(excel.getOrderAmount())), null, null, requestIp);
+            if (result.isSuccess()) {
+                R registerResult = this.bussinessRegisterRequestService.userRegister(bussinessRegisterRequest.getId(), userInfo.getId());
+                if (registerResult.isSuccess()) {
+                    return R.success("代付受理成功,请等待结果");
+                } else {
+                    BussinessUserWithdraw withdraw = result.getData();
+                    withdraw.setWithdrawStatus(SystemConstant.WithdrawOrderStatus.FAIL.getValue());
+                    withdraw.setFailReason(registerResult.getMsg());
+                    withdraw.setReturnMsg(registerResult.getMsg());
+                    this.withdrawService.updateById(withdraw);
+                    return R.fail("代付失败(CODE:40000)");
+                }
+            } else {
+                return R.fail("代付失败(CODE:40001)");
+            }
+        } else {
+            return R.fail("代付失败(CODE:40002)");
+        }
+    }
+
+    @Async
+    public void importPayToUserList(List<WithdrawRequestExcel> withdrawRequestExcelList, Bussiness bussiness) {
+        Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+        for (WithdrawRequestExcel excel : withdrawRequestExcelList) {
+            if (StringUtil.isBlank(excel.getBankCode())) {
+                continue;
+            }
+            BussinessUserInfo userInfoDTO = this.toUserInfoFromImport(excel, bussiness.getId());
+            userInfoDTO.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+            userInfoDTO.setParentMerchantNo(parentBussiness.getMerchantNo());
+            BussinessUserInfo dbUserInfo = userInfoService.getByNameCardBank(userInfoDTO);
+            if (dbUserInfo == null) {
+                boolean save = this.userInfoService.save(userInfoDTO);
+                if (save) {
+                    //情况一:发起小微用户进件和创建提现订单
+                    this.userRegisterAndCreateWithdraw(userInfoDTO, excel, null);
+                }
+            } else {
+                Integer registerStatus = dbUserInfo.getRegisterStatus();
+                if (registerStatus != null && registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()) {
+                    //情况二:直接发起提现前第一次转账
+                    this.transferOrderToPlatform(dbUserInfo, bussiness.getMerchantNo(), excel);
+                } else if (registerStatus != null && (registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUBMIT_FAIL.getValue()
+                        || registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.FAIL.getValue()
+                        || registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.DOING.getValue())) {
+                    {
+                        userInfoDTO.setId(dbUserInfo.getId());
+                        userInfoDTO.setCreateTime(dbUserInfo.getCreateTime());
+                        BussinessUserInfo userInfo = BeanUtil.copyProperties(userInfoDTO, BussinessUserInfo.class);
+                        boolean update = this.userInfoService.updateById(userInfo);
+                        if (update) {
+                            //情况三:同一个用户之前进件失败,修改了信息只有,现在重新发起一次代付,也是走情况一的录像
+                            this.userRegisterAndCreateWithdraw(userInfoDTO, excel, null);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    @Async
+    public R rePayToUser(Long withdrawId) {
+        BussinessUserWithdraw withdraw = this.withdrawService.getById(withdrawId);
+        org.springframework.util.Assert.notNull(withdraw, "账单记录不存在");
+        Integer withdrawStatus = withdraw.getWithdrawStatus();
+        if(withdrawStatus.intValue() == SystemConstant.WithdrawOrderStatus.SUCCESS.getValue()){
+            return R.fail("交易已成功,请勿重复发起");
+        }
+        String withdrawFlag = withdraw.getWithdrawFlag();
+        char[] chars = withdrawFlag.toCharArray();
+        return R.status(false);
+    }
+
+    public R userSubmit(UserSubmitDto userSubmitDto){
+        BladeUser bladeUser = AuthUtil.getUser();
+        if(bladeUser == null){
+            return R.data(400, "账号不存在");
+        }
+        Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+                .eq(Bussiness::getAccountId, bladeUser.getUserId()).eq(Bussiness::getSecret, userSubmitDto.getSecret()));
+        if(bussiness == null){
+            return R.data(400, "采购商不存在");
+        }
+        if(StringUtil.isBlank(userSubmitDto.getUserId())){
+            //添加
+            BussinessUserInfo newUserInfo = BeanUtil.copyProperties(userSubmitDto, BussinessUserInfo.class);
+            if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.SETTLED_MERCHANT.getValue()){
+                Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+                newUserInfo.setParentMerchantNo(parentBussiness.getMerchantNo());
+                newUserInfo.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+            }else if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue()){
+                newUserInfo.setParentMerchantNo(bussiness.getMerchantNo());
+                newUserInfo.setRateStrategyId(bussiness.getMicroRateStrategyId());
+            }
+            boolean save = this.userInfoService.save(newUserInfo);
+            if(save){
+                return R.fail("用户新增失败");
+            }else{
+                JSONObject data = new JSONObject();
+                data.set("userId", newUserInfo.getId());
+                return R.data(data, "用户新增成功");
+            }
+        }else {
+            //更新
+            Long userId = Func.toLong(userSubmitDto.getUserId());
+            BussinessUserInfo dbUserInfo = this.userInfoService.getById(userId);
+            if (dbUserInfo == null) {
+                return R.fail("用户不存在");
+            } else {
+                Integer registerStatus = dbUserInfo.getRegisterStatus();
+                if (registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()
+                        || registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.SUBMIT_SUCCESS.getValue()
+                        || registerStatus.intValue() == SystemConstant.BussinessRegisterStatus.WAIT_AUDIT.getValue()) {
+                    return R.fail("用户进件审核中,请勿修改");
+                } else {
+                    BussinessUserInfo updateUserInfo = BeanUtil.copyProperties(userSubmitDto, BussinessUserInfo.class);
+                    updateUserInfo.setId(userId);
+                    boolean update = this.userInfoService.updateById(updateUserInfo);
+                    if (update) {
+                        return R.fail("用户更新失败");
+                    } else {
+                        return R.success("用户更新成功");
+                    }
+                }
+            }
+        }
+    }
+
+    public R userRegister(UserRegisterDto userRegisterDto){
+        BladeUser bladeUser = AuthUtil.getUser();
+        if(bladeUser == null){
+            return R.data(400, "FAIL", "账号不存在");
+        }
+        Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+                .eq(Bussiness::getAccountId, bladeUser.getUserId()).eq(Bussiness::getSecret, userRegisterDto.getSecret()));
+        if(bussiness == null){
+            return R.data(400, "FAIL", "采购商不存在");
+        }
+        BussinessUserInfo newUserInfo = BeanUtil.copyProperties(userRegisterDto, BussinessUserInfo.class);
+        if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.SETTLED_MERCHANT.getValue()){
+            Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+            newUserInfo.setParentMerchantNo(parentBussiness.getMerchantNo());
+            newUserInfo.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+        }else if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue()){
+            newUserInfo.setParentMerchantNo(bussiness.getMerchantNo());
+            newUserInfo.setRateStrategyId(bussiness.getMicroRateStrategyId());
+        }
+        newUserInfo.setBussinessId(bussiness.getId());
+        newUserInfo.setRegisterStatus(SystemConstant.BussinessRegisterStatus.SUBMIT_SUCCESS.getValue());
+        boolean save = this.userInfoService.save(newUserInfo);
+        if(save){
+            JSONObject data = new JSONObject();
+            data.set("userId", newUserInfo.getId().toString());
+            BussinessRegisterRequest registerRequest = new BussinessRegisterRequest();
+            registerRequest.setUserInfoId(newUserInfo.getId());
+            boolean requestSave = this.bussinessRegisterRequestService.save(registerRequest);
+            if(requestSave){
+                R registerResult = this.bussinessRegisterRequestService.userRegister(registerRequest.getId(), newUserInfo.getId());
+                if(registerResult.isSuccess()){
+                    data.set("status", "WAIT");
+                    return R.data(data, "送审成功,请等待审核");
+                }else{
+                    return R.fail(registerResult.getMsg());
+                }
+            }else{
+                data.set("status", "FAIL");
+                return R.data(data, "业务进件请求保存失败");
+            }
+        }else{
+            return R.fail("系统业务异常");
+        }
+    }
+
+    public R userRegisterUpdate(UserRegisterDto userRegisterDto){
+        BladeUser bladeUser = AuthUtil.getUser();
+        Assert.notNull(bladeUser, "账号不存在");
+
+        Bussiness bussiness = bussinessService.getBaseMapper().selectOne(new QueryWrapper<>(new Bussiness()).lambda()
+                .eq(Bussiness::getAccountId, bladeUser.getUserId()).eq(Bussiness::getSecret, userRegisterDto.getSecret()));
+        Assert.notNull(bussiness, "采购商不存在");
+        String userId = userRegisterDto.getUserId();
+
+        BussinessUserInfo userInfo = this.userInfoService.getById(userId);
+        Assert.notNull(userInfo, "进件用户不存在,请发起新的进件");
+        int registerStatus = userInfo.getRegisterStatus().intValue();
+        if( registerStatus == SystemConstant.BussinessRegisterStatus.SUBMIT_SUCCESS.getValue()
+            || registerStatus == SystemConstant.BussinessRegisterStatus.WAIT_AUDIT.getValue()
+            || registerStatus == SystemConstant.BussinessRegisterStatus.SUCCESS.getValue()){
+            return R.fail("用户" + userId + "进件中或已完成进件,请勿重新发起");
+        }
+        BussinessUserInfo updateUserInfo = BeanUtil.copyProperties(userRegisterDto, BussinessUserInfo.class);
+        updateUserInfo.setId(Func.toLong(userRegisterDto.getUserId()));
+        if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.SETTLED_MERCHANT.getValue()){
+            Bussiness parentBussiness = bussinessService.getById(bussiness.getParentBussinessId());
+            updateUserInfo.setParentMerchantNo(parentBussiness.getMerchantNo());
+            updateUserInfo.setRateStrategyId(parentBussiness.getMicroRateStrategyId());
+        }else if(bussiness.getBussinessType().intValue() == SystemConstant.BussinessType.PLATFORM_MERCHANT.getValue()){
+            updateUserInfo.setParentMerchantNo(bussiness.getMerchantNo());
+            updateUserInfo.setRateStrategyId(bussiness.getMicroRateStrategyId());
+        }
+        updateUserInfo.setBussinessId(bussiness.getId());
+        updateUserInfo.setRegisterStatus(SystemConstant.BussinessRegisterStatus.SUBMIT_SUCCESS.getValue());
+        boolean update = this.userInfoService.updateById(updateUserInfo);
+        if(update){
+            JSONObject data = new JSONObject();
+            data.set("userId", updateUserInfo.getId().toString());
+            BussinessRegisterRequest registerRequest = new BussinessRegisterRequest();
+            registerRequest.setUserInfoId(updateUserInfo.getId());
+            boolean requestSave = this.bussinessRegisterRequestService.save(registerRequest);
+            if(requestSave){
+                R registerResult = this.bussinessRegisterRequestService.userRegister(registerRequest.getId(), updateUserInfo.getId());
+                if(registerResult.isSuccess()){
+                    data.set("status", "WAIT");
+                    return R.data(data, "送审成功,请等待审核");
+                }else{
+                    return R.fail(registerResult.getMsg());
+                }
+            }else{
+                data.set("status", "FAIL");
+                return R.data(data, "业务进件请求保存失败");
+            }
+        }else{
+            return R.fail("系统业务异常");
+        }
+    }
 }

+ 38 - 3
src/main/java/org/springblade/yeePay/service/YeePayService.java

@@ -154,7 +154,7 @@ public class YeePayService {
 	public R batchTransferToCard(BatchTransferDto batchTransferDto) {
 		YopRequest request = new YopRequest(yeePayConst.getBatchTransferUrl(), "POST");
 		batchTransferDto.setNotifyUrl(yeePayConst.getBatchTransferNotify());
-		batchTransferDto.setParentMerchantNo(yeePayConst.getParentMerchantNo());
+		batchTransferDto.setParentMerchantNo(batchTransferDto.getParentMerchantNo());
 		batchTransferDto.setMerchantNo(batchTransferDto.getMerchantNo());
 //		RequestConfig requestConfig = request.getRequestConfig();
 		request.setContent(JSONObject.toJSONString(batchTransferDto));
@@ -352,7 +352,7 @@ public class YeePayService {
 	 * @param bussinessRegisterRequest
 	 * @return*/
 	public R userRegister(BussinessRegisterRequest bussinessRegisterRequest, String parentMerchantNo){
-		YopRequest request = new YopRequest(yeePayConst.getMerchantRegisterUrl(), "POST");
+		YopRequest request = new YopRequest(yeePayConst.getUserRegisterUrl(), "POST");
 		bussinessRegisterRequest.setNotifyUrl(yeePayConst.getUserRegisterNotify());
 		request.addParameter("parentMerchantNo", parentMerchantNo);
 		addParamsFromObj(bussinessRegisterRequest,request,bussinessRegisterRequest.getClass());
@@ -403,7 +403,6 @@ public class YeePayService {
 	public R merchantRechargeOrder(RechargeDto rechargeDto){
 		YopRequest request = new YopRequest(yeePayConst.getRechargeOrderUrl(), "POST");
 		rechargeDto.setNotifyUrl(yeePayConst.getRechargeOrderNotify());
-		addMerchantNo(request);
 		addParamsFromObj(rechargeDto, request, rechargeDto.getClass());
 		try{
 			log.info("=========================商户充值-网银下单请求数据 =======================");
@@ -547,6 +546,42 @@ public class YeePayService {
 		return execute(request);
 	}
 
+	/**
+	 * 提现:修改提现卡
+	 * @param withdrawCardBindDto 添加信息
+	 * */
+	public R withdrawCardBind(WithdrawCardBindDto withdrawCardBindDto) {
+		YopRequest request = new YopRequest(yeePayConst.getWithdrawCardBind(), "POST");
+		addParamsFromObj(withdrawCardBindDto, request, withdrawCardBindDto.getClass());
+		log.info("======================添加提现卡下发数据=====================");
+		log.info(JSONUtil.toJsonStr(request.getParameters()));
+		return execute(request);
+	}
+
+	/**
+	 * 提现:修改提现卡
+	 * @param withdrawCardModifyDto 修改信息
+	 * */
+	public R withdrawCardModify(WithdrawCardModifyDto withdrawCardModifyDto) {
+		YopRequest request = new YopRequest(yeePayConst.getWithdrawCardModify(), "POST");
+		addParamsFromObj(withdrawCardModifyDto, request, withdrawCardModifyDto.getClass());
+		log.info("======================修改提现卡下发数据=====================");
+		log.info(JSONUtil.toJsonStr(request.getParameters()));
+		return execute(request);
+	}
+
+	/**
+	 * 提现:查询提现卡
+	 * @param merchantNo 查询信息
+	 * */
+	public R withdrawCardQuery(String merchantNo) {
+		YopRequest request = new YopRequest(yeePayConst.getWithdrawCardQuery(), "GET");
+		request.addParameter("merchantNo", merchantNo);
+		log.info("======================查询提现卡下发数据=====================");
+		log.info(JSONUtil.toJsonStr(request.getParameters()));
+		return execute(request);
+	}
+
 	/**
 	 *	分润:交易到银行卡(单笔出款)
 	 * @param payOrderDto 交易信息

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

@@ -13,7 +13,7 @@ pay.secret = MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMk5bBLo0tZ3JYVU77/
 #yee-pay.parentMerchantNo = 10086066206
 #yee-pay.merchantNo = 10086066206
 
-yee-pay.parentMerchantNo = 10086175627
+yee-pay.parentMerchantNo = 10086160953
 yee-pay.sm4Key = M0huZkdCZHhSU0h6YVF3aQ==
 yee-pay.weChatConfigAddUrl = /rest/v2.0/aggpay/wechat-config/add
 yee-pay.weChatConfigQueryUrl = /rest/v2.0/aggpay/wechat-config/query
@@ -31,12 +31,16 @@ yee-pay.privateKey = MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgUiUMy5mYPZ9
 
 yee-pay.qualUpload = /yos/v1.0/sys/merchant/qual/upload
 yee-pay.merchantRegisterUrl = /rest/v2.0/mer/register/saas/merchant
+yee-pay.userRegisterUrl = /rest/v2.0/mer/register/saas/micro
 yee-pay.rechargeOrderUrl = /rest/v1.0/account/recharge/onlinebank/order
 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.transferQueryUrl = /rest/v1.0/account/withdraw/card/query
+yee-pay.withdrawCardBind = /rest/v1.0/account/withdraw/card/bind
+yee-pay.withdrawCardModify = /rest/v1.0/account/withdraw/card/modify
+yee-pay.withdrawCardQuery = /rest/v1.0/account/withdraw/card/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