|
@@ -44,6 +44,7 @@ import javax.annotation.Resource;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
|
|
+import java.lang.reflect.Field;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.text.SimpleDateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
@@ -611,7 +612,7 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
|
|
throw new Exception("退款子订单信息错误!");
|
|
throw new Exception("退款子订单信息错误!");
|
|
}
|
|
}
|
|
Double refundOnlineFee = returnedPurchase.getRefundOnlineFee();
|
|
Double refundOnlineFee = returnedPurchase.getRefundOnlineFee();
|
|
- theOnlineRefund(shopOrderIds,refundOnlineFee);
|
|
|
|
|
|
+ theOnlineRefund(shopOrderIds, refundOnlineFee);
|
|
}
|
|
}
|
|
|
|
|
|
//二手订单交易全退,标记未售
|
|
//二手订单交易全退,标记未售
|
|
@@ -753,39 +754,68 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
|
|
*
|
|
*
|
|
* @param shopOrderIds
|
|
* @param shopOrderIds
|
|
*/
|
|
*/
|
|
- public void theOnlineRefund(List<Integer> shopOrderIds,Double refundOnlineFee) {
|
|
|
|
|
|
+ public void theOnlineRefund(List<Integer> shopOrderIds, Double refundOnlineFee) {
|
|
List<CmReceiptOrderRelation> relationList = cmReceiptOrderRelationDao.findByShopOrderIds(shopOrderIds);
|
|
List<CmReceiptOrderRelation> relationList = cmReceiptOrderRelationDao.findByShopOrderIds(shopOrderIds);
|
|
-// AtomicDouble allRefund = new AtomicDouble(0);
|
|
|
|
-// relationList.forEach(r -> allRefund.getAndSet(Double.parseDouble(r.getAssociateAmount())));
|
|
|
|
if (null != relationList && relationList.size() > 0) {
|
|
if (null != relationList && relationList.size() > 0) {
|
|
for (CmReceiptOrderRelation orderRelation : relationList) {
|
|
for (CmReceiptOrderRelation orderRelation : relationList) {
|
|
//cdr表payway为1纯线上收款
|
|
//cdr表payway为1纯线上收款
|
|
if ("1".equals(orderRelation.getPayWay())) {
|
|
if ("1".equals(orderRelation.getPayWay())) {
|
|
- String value="";
|
|
|
|
- refundOnlineFee=MathUtil.sub(refundOnlineFee,Double.parseDouble(orderRelation.getAssociateAmount())).doubleValue();
|
|
|
|
- if(refundOnlineFee>0){
|
|
|
|
|
|
+ String value = "";
|
|
|
|
+ refundOnlineFee = MathUtil.sub(refundOnlineFee, Double.parseDouble(orderRelation.getAssociateAmount())).doubleValue();
|
|
|
|
+ if (refundOnlineFee > 0) {
|
|
//要退的钱大于本次交易金额
|
|
//要退的钱大于本次交易金额
|
|
- value=orderRelation.getAssociateAmount();
|
|
|
|
|
|
+ value = orderRelation.getAssociateAmount();
|
|
}
|
|
}
|
|
- if(refundOnlineFee<0){
|
|
|
|
- value=refundOnlineFee.toString();
|
|
|
|
|
|
+ if (refundOnlineFee < 0) {
|
|
|
|
+ value = refundOnlineFee.toString();
|
|
}
|
|
}
|
|
//不同产品区分
|
|
//不同产品区分
|
|
if ("12".equals(orderRelation.getPayType()) || "17".equals(orderRelation.getPayType())) {
|
|
if ("12".equals(orderRelation.getPayType()) || "17".equals(orderRelation.getPayType())) {
|
|
- //已分帐应该先转回佣金
|
|
|
|
-
|
|
|
|
|
|
+ if (1 == orderRelation.getSplitStatus()) {
|
|
|
|
+ //已分帐应该先转回佣金
|
|
|
|
+ //如果已转回则不再转。
|
|
|
|
+ Double refundTransfer = cmReturnedPurchaseDao.findRefundTransfer(orderRelation.getOrderRequestNo());
|
|
|
|
+ if (0 == refundTransfer) {
|
|
|
|
+ Double brokerage = cmReturnedPurchaseDao.findBrokerage(orderRelation.getOrderRequestNo());
|
|
|
|
+ if (brokerage > 0) {
|
|
|
|
+ //0.1%手续费,转回金额*99.9%=brokerage
|
|
|
|
+ Double v = MathUtil.div(brokerage, 0.999, 2).doubleValue();
|
|
|
|
+ transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 2);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
//手续费转给供应商
|
|
//手续费转给供应商
|
|
|
|
+ Double refundTransfer = cmReturnedPurchaseDao.findRefundCharge(orderRelation.getOrderRequestNo());
|
|
|
|
+ if (0 == refundTransfer) {
|
|
|
|
+ //计算手续费
|
|
|
|
+ Double payAmount = cmReturnedPurchaseDao.findPayAmount(orderRelation.getOrderRequestNo());
|
|
|
|
+ //0.1%手续费,转回金额*99.9%=payAmount
|
|
|
|
+ Double v = MathUtil.div(payAmount, 0.999, 2).doubleValue();
|
|
|
|
+ transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 1);
|
|
|
|
|
|
|
|
+ }
|
|
//网银
|
|
//网银
|
|
unionRefund(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
|
|
unionRefund(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
|
|
} else {
|
|
} else {
|
|
// 已分帐应该先转回佣金
|
|
// 已分帐应该先转回佣金
|
|
-
|
|
|
|
|
|
+ if (1 == orderRelation.getSplitStatus()) {
|
|
|
|
+ //已分帐应该先转回佣金
|
|
|
|
+ //如果已转回则不再转。
|
|
|
|
+ Double refundTransfer = cmReturnedPurchaseDao.findRefundTransfer(orderRelation.getOrderRequestNo());
|
|
|
|
+ if (0 == refundTransfer) {
|
|
|
|
+ Double brokerage = cmReturnedPurchaseDao.findBrokerage(orderRelation.getOrderRequestNo());
|
|
|
|
+ if (brokerage > 0) {
|
|
|
|
+ //0.1%手续费,转回金额*99.9%=brokerage
|
|
|
|
+ Double v = MathUtil.div(brokerage, 0.999, 2).doubleValue();
|
|
|
|
+ transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 2);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
//扫码
|
|
//扫码
|
|
- onlinePay(orderRelation.getOrderRequestNo(),value, orderRelation.getShopOrderId());
|
|
|
|
|
|
+ onlinePay(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
|
|
}
|
|
}
|
|
|
|
|
|
- if(0==refundOnlineFee){
|
|
|
|
|
|
+ if (0 == refundOnlineFee) {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -793,6 +823,83 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public void transferMoney(Double v, Integer shopOrderId, String orderRequestNo, Integer flag) {
|
|
|
|
+ try {
|
|
|
|
+ AccountPayOrder accountPayOrder = new AccountPayOrder();
|
|
|
|
+ accountPayOrder.setP1_bizType("AccountPaySub");
|
|
|
|
+ accountPayOrder.setP2_signType("MD5");
|
|
|
|
+ String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
|
|
|
|
+ accountPayOrder.setP3_timestamp(format1);
|
|
|
|
+ String substring = format1.substring(20);
|
|
|
|
+ // fz+当前微秒时间+原唯一订单号
|
|
|
|
+ accountPayOrder.setP4_orderId("FZ" + substring + orderRequestNo);
|
|
|
|
+ //付款账户子订单绑定商户号(这里从佣金转出)
|
|
|
|
+ accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
|
|
|
|
+ AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
|
|
|
|
+ //收款账户商编 填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
|
|
|
|
+ accountPayOrderExt.setInMerchantNo(cmReturnedPurchaseDao.findSplitCode(shopOrderId));
|
|
|
|
+ accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
|
|
|
|
+ accountPayOrderExt.setAmount(BigDecimal.valueOf(v));
|
|
|
|
+ accountPayOrderExt.setServerCallbackUrl("");
|
|
|
|
+ accountPayOrderExt.setGoodsName("退款转账");
|
|
|
|
+ String ext = JSON.toJSONString(accountPayOrderExt);
|
|
|
|
+ logger.info("退款转账分账规则串json串:" + ext);
|
|
|
|
+ accountPayOrder.setP6_ext(ext);
|
|
|
|
+ // 生成签名
|
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
|
+ builder.append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
|
|
|
|
+ .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
|
|
|
|
+ .append(Constant.XUNI);
|
|
|
|
+ String sign = Disguiser.disguiseMD5(builder.toString().trim());
|
|
|
|
+ Map<String, String> bean = convertBean(accountPayOrder);
|
|
|
|
+ logger.info("--------------------> 发送退款转账参数: " + bean);
|
|
|
|
+ Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
|
|
|
|
+ logger.info("----------------退款转账数据: " + map.toString());
|
|
|
|
+ if (map != null) {
|
|
|
|
+ String code = map.get("rt5_retCode");
|
|
|
|
+ if (!"0000".equals(code)) {
|
|
|
|
+ String msg = map.get("rt6_retMsg");
|
|
|
|
+ logger.info("【退款转账】>>>>>>>>>>退款转账失败>>>>>>>msg:" + msg);
|
|
|
|
+ } else {
|
|
|
|
+ CmRefundTransfer cmRefundTransfer = new CmRefundTransfer();
|
|
|
|
+ cmRefundTransfer.setTransferType(flag);
|
|
|
|
+ cmRefundTransfer.setTransferAmount(v);
|
|
|
|
+ cmRefundTransfer.setOrderRequestNo(orderRequestNo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error("【退款转账】>>>>>>>>>>错误信息", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public Map<String, String> convertBean(Object bean) {
|
|
|
|
+ Class clazz = bean.getClass();
|
|
|
|
+ Field[] fields = clazz.getDeclaredFields();
|
|
|
|
+ for (Field f : fields) {
|
|
|
|
+ f.setAccessible(true);
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ Map<String, String> retMap = new LinkedHashMap<>();
|
|
|
|
+ for (Field f : fields) {
|
|
|
|
+ String key = f.toString().substring(f.toString().lastIndexOf(".") + 1);
|
|
|
|
+ Object value = f.get(bean);
|
|
|
|
+ if (value == null) {
|
|
|
|
+ value = "";
|
|
|
|
+ }
|
|
|
|
+ retMap.put(key, (String) value);
|
|
|
|
+ }
|
|
|
|
+ return retMap;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.info("分账", e);
|
|
|
|
+ throw new IllegalStateException("分账异常", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
public void onlinePay(String orderRequestNo, String money, Integer shopOrderId) {
|
|
public void onlinePay(String orderRequestNo, String money, Integer shopOrderId) {
|
|
AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
|
|
AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
|
|
orderVo.setP1_bizType("AppPayRefund");
|
|
orderVo.setP1_bizType("AppPayRefund");
|
|
@@ -896,7 +1003,7 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
|
|
|
|
|
|
+ public <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
|
|
FormBody.Builder builder = new FormBody.Builder();
|
|
FormBody.Builder builder = new FormBody.Builder();
|
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
|
builder.add(entry.getKey(), entry.getValue());
|
|
builder.add(entry.getKey(), entry.getValue());
|