惠支付服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gratia-pay-parent/service/src/main/java/com/hfkj/channel/lakala/LaKaLaTradeSeparateService....

284 lines
14 KiB

package com.hfkj.channel.lakala;
import com.alibaba.fastjson.JSONObject;
import com.hfkj.channel.lakala.config.LaKaLaConfig;
import com.hfkj.common.exception.ErrorCode;
import com.hfkj.common.exception.ErrorHelp;
import com.hfkj.common.exception.SysCode;
import com.hfkj.common.utils.DateUtil;
import com.hfkj.common.utils.HttpsUtils;
import com.hfkj.common.utils.ImageUtils;
import com.hfkj.common.utils.UnionUtils;
import com.hfkj.config.CommonSysConst;
import com.hfkj.entity.*;
import com.hfkj.model.MerBasisModel;
import com.hfkj.service.*;
import com.hfkj.sysenum.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
/**
* 拉卡拉分账
* @author hurui
*/
@Service
public class LaKaLaTradeSeparateService {
@Resource
private BsTradeOrderService tradeOrderService;
@Resource
private BsTradeOrderProfitSharingService tradeOrderProfitSharingService;
@Resource
private BsTradeOrderProfitSharingReceiverService tradeOrderProfitSharingReceiverService;
/**
* 发起分账
* @param profitSharingOrderNo
* @return
*/
public BsTradeOrderProfitSharing separate(String profitSharingOrderNo) {
// 交易分账
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getDetailByProfitSharingOrderNo(profitSharingOrderNo);
if (null == tradeOrderProfitSharing) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "未找到交易分账记录");
}
if (!tradeOrderProfitSharing.getStatus().equals(ProfitSharingStatusEnum.status0.getNumber())) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "业务不处于待处理状态");
}
// 查询交易详情
BsTradeOrder tradeOrder = tradeOrderService.getOrderByTradeNoId(tradeOrderProfitSharing.getTradeOrderId());
// 分账接收方
List<BsTradeOrderProfitSharingReceiver> profitSharingReceiverList = tradeOrderProfitSharingReceiverService.getReceiverListByProfitSharingId(tradeOrderProfitSharing.getId());
Map<String, Object> commonParam = new HashMap<>();
commonParam.put("req_time", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
commonParam.put("version", "3.0");
Map<String, Object> map = new HashMap<>();
map.put("merchant_no", tradeOrder.getPlatformMerNo());
map.put("log_no", tradeOrder.getPlatformLogNo());
map.put("log_date", DateUtil.date2String(tradeOrder.getPayTime(), "yyyyMMdd"));
map.put("out_separate_no", tradeOrderProfitSharing.getProfitSharingOrderNo());
map.put("total_amt", tradeOrderProfitSharing.getProfitSharingAmoun().multiply(new BigDecimal("100")).longValue());
map.put("lkl_org_no", "1");
map.put("cal_type", "0");
List<Map<String,Object>> recvDatasMapList = new ArrayList<>();
Map<String,Object> recvDatasMap;
for (BsTradeOrderProfitSharingReceiver receiver : profitSharingReceiverList) {
if (receiver.getReceiverAmount().compareTo(new BigDecimal("0")) != 0) {
recvDatasMap = new HashMap<>();
recvDatasMap.put("recv_no", receiver.getReceiverAccount());
recvDatasMap.put("separate_value", receiver.getReceiverAmount().multiply(new BigDecimal("100")).longValue());
recvDatasMapList.add(recvDatasMap);
}
}
map.put("recv_datas", recvDatasMapList);
commonParam.put("req_data", map);
Map<String, Object> reqParam = LaKaLaConfig.generateSignParamsV3(JSONObject.parseObject(JSONObject.toJSONString(commonParam)));
// 头部参数
Map<String, Object> heard = new HashMap<>();
heard.put("Authorization", reqParam.get("Authorization"));
JSONObject responseBody = HttpsUtils.doPost(CommonSysConst.getSysConfig().getLkl_request_url() + "/api/v3/sacs/separate", commonParam, heard);
System.out.println("body:" + JSONObject.toJSONString(commonParam));
System.out.println("response:" + responseBody.toJSONString());
if (!responseBody.getString("code").equals("SACS0000")) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, responseBody.getString("msg"));
}
JSONObject respData = responseBody.getJSONObject("resp_data");
// 分账状态 处理中:PROCESSING, 已受理:ACCEPTED, 成功:SUCCESS, 失败:FAIL
String statusCode = respData.getString("status");
if (statusCode.equals("PROCESSING")) {
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status2.getNumber());
} else if (statusCode.equals("ACCEPTED")) {
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status3.getNumber());
} else if (statusCode.equals("SUCCESS")) {
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status1.getNumber());
tradeOrderProfitSharing.setProfitSharingTime(new Date());
tradeOrderProfitSharing.setFinishTime(new Date());
} else if (statusCode.equals("FAIL")) {
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status4.getNumber());
}
tradeOrderProfitSharing.setProfitSharingOrderNo(respData.getString("separate_no"));
tradeOrderProfitSharingService.editData(tradeOrderProfitSharing);
// 处理接收方数据
if (tradeOrderProfitSharing.equals(ProfitSharingStatusEnum.status1.getName())) {
for (BsTradeOrderProfitSharingReceiver receiver : profitSharingReceiverList) {
receiver.setStatus(ProfitSharingReceiverStatusEnum.status1.getNumber());
receiver.setProfitSharingTime(new Date());
receiver.setFinishTime(new Date());
tradeOrderProfitSharingReceiverService.editData(receiver);
}
}
return tradeOrderProfitSharing;
}
public JSONObject queryAmt(String profitSharingOrderNo) {
// 交易订单分账
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getDetailByProfitSharingOrderNo(profitSharingOrderNo);
if (null == tradeOrderProfitSharing) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "未找到交易分账记录");
}
// 查询交易详情
BsTradeOrder tradeOrder = tradeOrderService.getOrderByTradeNoId(tradeOrderProfitSharing.getTradeOrderId());
Map<String, Object> commonParam = new HashMap<>();
commonParam.put("req_time", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
commonParam.put("version", "3.0");
Map<String, Object> map = new HashMap<>();
map.put("merchant_no", tradeOrderProfitSharing.getPlatformMerNo());
map.put("log_no", tradeOrder.getPlatformLogNo());
map.put("log_date", DateUtil.date2String(tradeOrder.getPayTime(), "yyyyMMdd"));
commonParam.put("req_data", map);
Map<String, Object> reqParam = LaKaLaConfig.generateSignParamsV3(JSONObject.parseObject(JSONObject.toJSONString(commonParam)));
// 头部参数
Map<String, Object> heard = new HashMap<>();
heard.put("Authorization", reqParam.get("Authorization"));
JSONObject responseBody = HttpsUtils.doPost(CommonSysConst.getSysConfig().getLkl_request_url() + "/api/v3/sacs/queryAmt", commonParam, heard);
System.out.println("body:" + JSONObject.toJSONString(commonParam));
System.out.println("response:" + responseBody.toJSONString());
if (!responseBody.getString("code").equals("SACS0000")) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, responseBody.getString("msg"));
}
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status2.getNumber());
tradeOrderProfitSharingService.editData(tradeOrderProfitSharing);
return responseBody.getJSONObject("resp_data");
}
/**
* 分账撤销
* @param profitSharingOrderNo
* @return
*/
public JSONObject cancel(String profitSharingOrderNo) {
// 交易订单分账
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getDetailByProfitSharingOrderNo(profitSharingOrderNo);
if (null == tradeOrderProfitSharing) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "未找到交易分账记录");
}
Map<String, Object> commonParam = new HashMap<>();
commonParam.put("req_time", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
commonParam.put("version", "3.0");
Map<String, Object> map = new HashMap<>();
map.put("merchant_no", tradeOrderProfitSharing.getPlatformMerNo());
map.put("origin_out_separate_no", tradeOrderProfitSharing.getOriginProfitSharingOrderNo());
map.put("out_separate_no", tradeOrderProfitSharing.getProfitSharingOrderNo());
map.put("total_amt", tradeOrderProfitSharing.getProfitSharingAmoun().multiply(new BigDecimal("100")).longValue());
commonParam.put("req_data", map);
Map<String, Object> reqParam = LaKaLaConfig.generateSignParamsV3(JSONObject.parseObject(JSONObject.toJSONString(commonParam)));
// 头部参数
Map<String, Object> heard = new HashMap<>();
heard.put("Authorization", reqParam.get("Authorization"));
JSONObject responseBody = HttpsUtils.doPost(CommonSysConst.getSysConfig().getLkl_request_url() + "/api/v3/sacs/cancel", commonParam, heard);
System.out.println("body:" + JSONObject.toJSONString(commonParam));
System.out.println("response:" + responseBody.toJSONString());
if (!responseBody.getString("code").equals("SACS0000")) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, responseBody.getString("msg"));
}
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status2.getNumber());
tradeOrderProfitSharingService.editData(tradeOrderProfitSharing);
return responseBody;
}
/**
* todo 目前未开发,目前的场景用不到
* 分账回退
* @param profitSharingOrderNo 交易订单号
* @return
*/
public JSONObject fallback(String profitSharingOrderNo) {
// 交易订单分账
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getDetailByProfitSharingOrderNo(profitSharingOrderNo);
if (null == tradeOrderProfitSharing) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "未找到交易分账记录");
}
Map<String, Object> commonParam = new HashMap<>();
commonParam.put("req_time", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
commonParam.put("version", "3.0");
Map<String, Object> map = new HashMap<>();
map.put("merchant_no", tradeOrderProfitSharing.getPlatformMerNo());
map.put("origin_out_separate_no", tradeOrderProfitSharing.getProfitSharingOrderNo());
map.put("out_separate_no", tradeOrderProfitSharing.getProfitSharingOrderNo()+"1");
map.put("total_amt", "24");
// 回退分账金额,只能回退一个商户
List<Map<String, Object>> originRecvDatas = new ArrayList<>();
Map<String, Object> originRecv = new HashMap<>();
originRecv.put("recv_no", "SR2023042415050");
originRecv.put("amt", "24");
originRecvDatas.add(originRecv);
map.put("origin_recv_datas", originRecvDatas);
commonParam.put("req_data", map);
Map<String, Object> reqParam = LaKaLaConfig.generateSignParamsV3(JSONObject.parseObject(JSONObject.toJSONString(commonParam)));
// 头部参数
Map<String, Object> heard = new HashMap<>();
heard.put("Authorization", reqParam.get("Authorization"));
JSONObject responseBody = HttpsUtils.doPost(CommonSysConst.getSysConfig().getLkl_request_url() + "/api/v3/sacs/fallback", commonParam, heard);
System.out.println("body:" + JSONObject.toJSONString(commonParam));
System.out.println("response:" + responseBody.toJSONString());
if (!responseBody.getString("code").equals("SACS0000")) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, responseBody.getString("msg"));
}
tradeOrderProfitSharing.setStatus(ProfitSharingStatusEnum.status2.getNumber());
tradeOrderProfitSharingService.editData(tradeOrderProfitSharing);
return responseBody;
}
/**
* 分账结果查询
* @param profitSharingOrderNo 交易订单号
* @return
*/
public JSONObject query(String profitSharingOrderNo) {
// 交易订单分账
BsTradeOrderProfitSharing tradeOrderProfitSharing = tradeOrderProfitSharingService.getDetailByProfitSharingOrderNo(profitSharingOrderNo);
if (null == tradeOrderProfitSharing) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.REQ_PARAMS_ERROR, "未找到交易分账记录");
}
Map<String, Object> commonParam = new HashMap<>();
commonParam.put("req_time", DateUtil.format(new Date(), "yyyyMMddHHmmss"));
commonParam.put("version", "3.0");
Map<String, Object> map = new HashMap<>();
map.put("merchant_no", tradeOrderProfitSharing.getPlatformMerNo());
map.put("out_separate_no", tradeOrderProfitSharing.getProfitSharingOrderNo());
commonParam.put("req_data", map);
Map<String, Object> reqParam = LaKaLaConfig.generateSignParamsV3(JSONObject.parseObject(JSONObject.toJSONString(commonParam)));
// 头部参数
Map<String, Object> heard = new HashMap<>();
heard.put("Authorization", reqParam.get("Authorization"));
JSONObject responseBody = HttpsUtils.doPost(CommonSysConst.getSysConfig().getLkl_request_url() + "/api/v3/sacs/query", commonParam, heard);
System.out.println("body:" + JSONObject.toJSONString(commonParam));
System.out.println("response:" + responseBody.toJSONString());
if (!responseBody.getString("code").equals("SACS0000")) {
throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, responseBody.getString("msg"));
}
return responseBody.getJSONObject("resp_data");
}
}