Commit a0142d4b authored by suntao's avatar suntao

订单状态查询

parent bb1edc18
......@@ -8,6 +8,7 @@ import javax.persistence.Entity;
import javax.persistence.Table;
/**
* 审批时 boss 创建的审批订单记录
* function:
* date: 2019/8/12
*
......@@ -16,8 +17,8 @@ import javax.persistence.Table;
@Data
@Entity
@Table(name = "order")
public class Order extends Primary {
@Table(name = "order_approve")
public class OrderApprove extends Primary {
@Column(name = "channel_order_number")
private String channelOrderNumber;
@Column(name = "credit_number")
......@@ -26,6 +27,8 @@ public class Order extends Primary {
private Long channelId;
@Column(name = "fund_id")
private Integer fundId;
/** 0:非存管;1:存管 */
@Column(name = "fund_type")
private Integer fundType;
@Column(name = "ext_data")
......
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/8/16
*
* @author: suntao
*/
@Data
public class QueryXyqbOrderStatus {
private String status;
private Long updateTime;
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/8/15
*
* @author: suntao
*/
@Data
public class XyqbCurrentOrderStatusServiceResultModel {
private QueryXyqbOrderStatus currentStatus;
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import java.util.List;
/**
* function:
* date: 2019/8/15
*
* @author: suntao
*/
@Data
public class XyqbHistoryOrderStatusServiceResultModel {
private List<QueryXyqbOrderStatus> historyStatus;
}
package cn.quantgroup.cashloanflowboss.api.order.repository;
import cn.quantgroup.cashloanflowboss.api.order.entity.Order;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
......@@ -13,8 +13,9 @@ import org.springframework.stereotype.Repository;
*/
@CashLoanFlowBossDataSource
@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {
public interface OrderRepository extends JpaRepository<OrderApprove, Long> {
Order findOrderByChannelOrderNumber(String channelOrderNumber);
OrderApprove findByChannelOrderNumber(String channelOrderNumber);
OrderApprove findByCreditNumber(String creditOrderNumber);
}
......@@ -3,13 +3,12 @@ package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.api.order.entity.Order;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.api.order.model.*;
import cn.quantgroup.cashloanflowboss.api.order.repository.OrderRepository;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clotho.client.ClothoCenter;
......@@ -90,6 +89,7 @@ public class OrderService {
}, new PageRequest(pageNumber, pageSize));
return page.map(it -> {
OrderVo orderVo = new OrderVo();
orderVo.setId(it.getId());
......@@ -97,16 +97,19 @@ public class OrderService {
orderVo.setChannelOrderNumber(it.getChannelOrderNo());
orderVo.setCreatedAt(it.getCreatedAt().getTime());
OrderVo.OptButton button = new OrderVo.OptButton();
button.setAction(OrderVo.OptButtonAction.audit.name());
button.setName(OrderVo.OptButtonAction.audit.getDesc());
OrderApprove orderApprove = orderRepository.findByCreditNumber(it.getApplyNo());
List<OrderVo.OptButton> buttonList = new ArrayList<>();
buttonList.add(button);
XyqbCurrentOrderStatusServiceResultModel xyqbOrderStatus = xyqbCenterService.getXyqbOrderStatus(it.getApplyNo(), it.getLoanId());
if (xyqbOrderStatus != null) {
QueryXyqbOrderStatus currentStatus = xyqbOrderStatus.getCurrentStatus();
orderVo.setStatus(OrderVo.OptButtonAction.audit.getDesc());
orderVo.setOpt(buttonList);
orderVo.setMessage("");
Tuple<String, List<OrderVo.OptButton>> currentStatusAndButtons = OrderUtil.getCurrentStatusAndButtons(currentStatus, orderApprove);
orderVo.setStatus(currentStatusAndButtons.getKey());
orderVo.setOpt(currentStatusAndButtons.getValue());
orderVo.setMessage("");
} else {
orderVo.setMessage("订单查询错误");
}
return orderVo;
});
}
......@@ -148,15 +151,15 @@ public class OrderService {
approveVo.getPeriod(), fundId);
Order order = new Order();
order.setChannelOrderNumber(approveVo.getChannelOrderNumber());
order.setCreditNumber(orderMapping.getApplyNo());
order.setChannelId(orderMapping.getRegisteredFrom());
order.setFundId(fundId);
order.setFundType(approveVo.getFundType());
order.setCreateTime(new Date());
order.setUpdateTime(new Date());
orderRepository.save(order);
OrderApprove orderApprove = new OrderApprove();
orderApprove.setChannelOrderNumber(approveVo.getChannelOrderNumber());
orderApprove.setCreditNumber(orderMapping.getApplyNo());
orderApprove.setChannelId(orderMapping.getRegisteredFrom());
orderApprove.setFundId(fundId);
orderApprove.setFundType(approveVo.getFundType());
orderApprove.setCreateTime(new Date());
orderApprove.setUpdateTime(new Date());
orderRepository.save(orderApprove);
Map<String, Object> data = new HashMap<>(16);
......@@ -193,7 +196,7 @@ public class OrderService {
boolean result;
Order order = this.orderRepository.findOrderByChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
OrderApprove orderApprove = this.orderRepository.findByChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId());
......@@ -203,12 +206,12 @@ public class OrderService {
// 更新待放款时间
this.xyqbCenterService.updateFundLendingTime(orderMapping.getLoanId());
Map data = this.xyqbCenterService.queryLendingRecordCount(order.getFundId(), 0);
Map data = this.xyqbCenterService.queryLendingRecordCount(orderApprove.getFundId(), 0);
result = this.clothoCenterService.lending(order.getFundId(), new BigDecimal(String.valueOf(data.get("totalAmount"))), Integer.valueOf(String.valueOf(data.get("totalCount"))));
result = this.clothoCenterService.lending(orderApprove.getFundId(), new BigDecimal(String.valueOf(data.get("totalAmount"))), Integer.valueOf(String.valueOf(data.get("totalCount"))));
// 如果是非存管,创建放款MQ
if (order.getFundType() == 0) {
if (orderApprove.getFundType() == 0) {
this.xyqbCenterService.pushLendingResult(orderMapping.getLoanId(), lendingFormModel.getResult() ? 3 : 4);
}
......
package cn.quantgroup.cashloanflowboss.api.order.util;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.model.QueryXyqbOrderStatus;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
/**
* function:
* date: 2019/8/8
......@@ -8,4 +17,108 @@ package cn.quantgroup.cashloanflowboss.api.order.util;
*/
public class OrderUtil {
public static final String financeProductsFormat = "[{\"min\":%s,\"max\":%s,\"terms\":[{\"term\":%s,\"fundInfo\":[{\"fundId\":%s,\"rate\":\"0\",\"rateType\":1,\"priority\":\"1\",\"feeType\":\"1\"}]}]}]";
public static Tuple<String, List<OrderVo.OptButton>> getCurrentStatusAndButtons(QueryXyqbOrderStatus currentStatus, OrderApprove orderApprove) {
Tuple tuple = new Tuple();
List<OrderVo.OptButton> buttonList = new ArrayList<>();
if (currentStatus != null) {
if (StringUtils.isNotEmpty(currentStatus.getStatus())) {
OrderVo.OptButton buttonBeforeCancel = new OrderVo.OptButton();
buttonBeforeCancel.setAction(OrderVo.OptButtonAction.cancel.name());
buttonBeforeCancel.setName(OrderVo.OptButtonAction.cancel.getDesc());
switch (currentStatus.getStatus()) {
case "CREDIT_SUCC" :
// 授信成功 需要 审批
OrderVo.OptButton buttonApprove = new OrderVo.OptButton();
buttonApprove.setAction(OrderVo.OptButtonAction.audit.name());
buttonApprove.setName(OrderVo.OptButtonAction.audit.getDesc());
buttonList.add(buttonApprove);
buttonList.add(buttonBeforeCancel);
tuple.setKey("授信成功");
tuple.setValue(buttonList);
return tuple;
case "APPROVE_ING" :
tuple.setKey("审批中");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "REJECT" :
tuple.setKey("审批拒绝");
tuple.setValue(buttonList);
return tuple;
case "FUAD_ASSIFN_SUCC" :
tuple.setKey("审批通过,待提现");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "WITHDRAW" :
// 提现申请成功 需要放款
tuple.setKey("申请提现成功");
OrderVo.OptButton buttonPaySucc = new OrderVo.OptButton();
buttonPaySucc.setAction(OrderVo.OptButtonAction.pay_succ.name());
buttonPaySucc.setName(OrderVo.OptButtonAction.pay_succ.getDesc());
buttonList.add(buttonPaySucc);
OrderVo.OptButton buttonPayFail = new OrderVo.OptButton();
buttonPayFail.setAction(OrderVo.OptButtonAction.pay_fail.name());
buttonPayFail.setName(OrderVo.OptButtonAction.pay_fail.getDesc());
buttonList.add(buttonPayFail);
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "PAY_ING" :
tuple.setKey("放款中");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "FUND_SUCC" :
if (orderApprove != null && orderApprove.getFundType() != 0) {
// 是存管
tuple.setKey("放款到存管,待提现");
OrderVo.OptButton cancelAfterButton = new OrderVo.OptButton();
cancelAfterButton.setAction(OrderVo.OptButtonAction.cancel_after.name());
cancelAfterButton.setName(OrderVo.OptButtonAction.cancel_after.getDesc());
buttonList.add(cancelAfterButton);
} else {
tuple.setKey("放款成功");
}
tuple.setValue(buttonList);
return tuple;
case "FUND_WITHDRAW_SUCC" :
tuple.setKey("存管提现成功");
tuple.setValue(buttonList);
return tuple;
case "FUND_FAIL" :
tuple.setKey("放款失败");
tuple.setValue(buttonList);
return tuple;
case "ALL_REPAID" :
tuple.setKey("已结清");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_LOAN" :
tuple.setKey("已关单");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_AFTER_LOAN" :
tuple.setKey("存管提现超时或贷后关单");
tuple.setValue(buttonList);
return tuple;
default:
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
}
} else {
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
}
package cn.quantgroup.cashloanflowboss.core.base;
/**
* Created by Miraculous on 15/11/24.
*/
public class Tuple<K, V> {
private K key;
private V value;
public Tuple() {
}
public Tuple(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public Tuple<K, V> setKey(K key) {
this.key = key;
return this;
}
public V getValue() {
return value;
}
public Tuple<K, V> setValue(V value) {
this.value = value;
return this;
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.client;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbCurrentOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbHistoryOrderStatusServiceResultModel;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
......@@ -17,6 +20,12 @@ public interface XYQBCenter {
@PostMapping(value = "/ex/paycenter/pay_notify", consumes = "application/x-www-form-urlencoded")
String pushLendingResult(@RequestParam Map parameter);
@PostMapping(value = "/ex/ka/order/status", consumes = "application/x-www-form-urlencoded")
XyqbCurrentOrderStatusServiceResultModel getOrderStatus(@RequestParam Map orderNo);
@PostMapping(value = "/ex/ka/order/status/history", consumes = "application/x-www-form-urlencoded")
XyqbHistoryOrderStatusServiceResultModel getXyqbOrderHistoryStatus(Map paramMap);
@Component
class Fallback implements XYQBCenter {
......@@ -25,6 +34,16 @@ public interface XYQBCenter {
return null;
}
@Override
public XyqbCurrentOrderStatusServiceResultModel getOrderStatus(Map orderNo) {
return null;
}
@Override
public XyqbHistoryOrderStatusServiceResultModel getXyqbOrderHistoryStatus(Map paramMap) {
return null;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.service;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbCurrentOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbHistoryOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.spi.xyqb.client.XYQBCenter;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.ContractRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.FundLendingRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.util.SignUtil;
import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -77,4 +81,37 @@ public class XYQBCenterService {
}
/**
* 查询订单当前状态
* @param creditOrderNumber
* @param loanId
* @return
*/
public XyqbCurrentOrderStatusServiceResultModel getXyqbOrderStatus(String creditOrderNumber, Long loanId) {
Map paramMap = Maps.newHashMap();
paramMap = SignUtil.sign(SignUtil.KA_API_KEY, paramMap);
paramMap.put("orderNo", creditOrderNumber);
paramMap.put("loanId", loanId);
return xyqbCenter.getOrderStatus(paramMap);
}
/**
* 查询订单当前状态
* @param creditOrderNumber
* @param loanId
* @return
*/
public XyqbHistoryOrderStatusServiceResultModel getXyqbOrderHistoryStatus(String creditOrderNumber, Long loanId) {
Map paramMap = Maps.newHashMap();
paramMap = SignUtil.sign(SignUtil.KA_API_KEY, paramMap);
paramMap.put("orderNo", creditOrderNumber);
paramMap.put("loanId", loanId);
return xyqbCenter.getXyqbOrderHistoryStatus(paramMap);
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.util;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import java.security.SignatureException;
import java.util.*;
/**
* xyqb 加签验证工具类
* @author Feng
* @version 2017.12.22
*/
public class SignUtil {
public static final String KA_API_KEY = "100011";
private static final long MAX_RATIO = 0x258;// 十分钟 10 * 60
private static Map<String, String> apiKeys = new HashMap<>();
static {
apiKeys.put(KA_API_KEY, "aukpaqy3za9lkjisdfaoqtdtxumrjqzm");
}
public static void addKeys(String appid, String key) {
apiKeys.put(appid, key);
}
/**
* 参数签名
*
* @return map 所有参数 以及 sign
*/
public static Map<String, ?> sign(String appid, Map<String, ?> params) {
Map<String, Object> map = new HashMap<String, Object>();
map.putAll(params);
map.put("app_id", appid);
map.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
map.put("noncestr", RandomStringUtils.randomAlphanumeric(8));
String sign = signParams(map, appid);
map.put("sign", sign);
return map;
}
/**
* 签名
*
* @param map
* @return
*/
private static String signParams(Map<String, ?> map, String appid) {
List<String> names = new ArrayList<String>(map.keySet());
Collections.sort(names);
StringBuffer buffer = new StringBuffer();
for (String key : names) {
buffer.append(key).append("=").append(map.get(key)).append("&");
}
buffer.append("security_code=").append(apiKeys.get(appid));
String sign = DigestUtils.md5Hex(buffer.toString());
return sign;
}
/**
* 验证签名
*
* @param params
* 1、参数中必须包含 app_id 、timestamp、noncestr,sign
* @return
* @throws IllegalAccessException
*/
public static boolean checkSign(Map<String, ?> params) throws SignatureException {
String pid = Objects.toString(params.get("app_id"), null);
String noncestr = Objects.toString(params.get("noncestr"), null);
String timestamp = Objects.toString(params.get("timestamp"), null);
String sign = Objects.toString(params.get("sign"), null);
if (StringUtils.isBlank(pid) || StringUtils.isBlank(noncestr) || StringUtils.isBlank(timestamp)
|| StringUtils.isBlank(sign)) {
throw new SignatureException("参数中必须包含 app_id 、timestamp、noncestr 、sign");
}
// 验证时间
if (timestamp.length() == 13) {
long ratio = System.currentTimeMillis() - Long.valueOf(timestamp);
if (ratio > (MAX_RATIO * 1000)) {
throw new SignatureException("request overdue ....");
}
} else {
long ratio = (System.currentTimeMillis() / 1000) - Long.valueOf(timestamp);
if (ratio > MAX_RATIO) {
throw new SignatureException("request overdue ....");
}
}
params.remove("sign");
String signVal = signParams(params, pid);// 签名
return StringUtils.equalsIgnoreCase(signVal,sign);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment