Commit 2b5f4331 authored by 王俊权's avatar 王俊权

Merge remote-tracking branch 'origin/v1' into v1

# Conflicts:
#	src/main/java/cn/quantgroup/cashloanflowboss/api/order/service/OrderService.java
parents 2a775e59 5f90a8d1
...@@ -25,9 +25,9 @@ public class ChannelConfController { ...@@ -25,9 +25,9 @@ public class ChannelConfController {
/** /**
* 查询渠道列表 * 查询渠道列表,如果是渠道角色登陆,只能查询自己渠道
* *
* @param channelId 在接受参数时,必须放到第一个参数位置 * @param channelId
* @param pageNumber * @param pageNumber
* @param pageSize * @param pageSize
* @return * @return
...@@ -38,6 +38,12 @@ public class ChannelConfController { ...@@ -38,6 +38,12 @@ public class ChannelConfController {
return Result.buildSuccess(channelConfService.getChannelInfo(pageNumber, pageSize, channelId)); return Result.buildSuccess(channelConfService.getChannelInfo(pageNumber, pageSize, channelId));
} }
/**
* 查询单个渠道配置
* 去过是渠道用户,只能查自己,查询条件置灰
* @param channelId
* @return
*/
@ChannelIdInit @ChannelIdInit
@CheckChannelRole @CheckChannelRole
@GetMapping("/cfg/info") @GetMapping("/cfg/info")
...@@ -46,6 +52,11 @@ public class ChannelConfController { ...@@ -46,6 +52,11 @@ public class ChannelConfController {
} }
/**
* 修改渠道配置,如果是渠道角色登陆 只能修改自己渠道信息
* @param channelConfVo
* @return
*/
@CheckChannelRole(isObjParam = true, paramClazz = ChannelConfVo.class) @CheckChannelRole(isObjParam = true, paramClazz = ChannelConfVo.class)
@PostMapping("/cfg/info") @PostMapping("/cfg/info")
public Result editChannelConfInfo(@RequestBody @Valid ChannelConfVo channelConfVo) { public Result editChannelConfInfo(@RequestBody @Valid ChannelConfVo channelConfVo) {
......
...@@ -6,6 +6,7 @@ import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo; ...@@ -6,6 +6,7 @@ import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.service.OrderService; import cn.quantgroup.cashloanflowboss.api.order.service.OrderService;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit; import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole; import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.base.Result; import cn.quantgroup.cashloanflowboss.core.base.Result;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -28,13 +29,13 @@ public class OrderController { ...@@ -28,13 +29,13 @@ public class OrderController {
private OrderService orderService; private OrderService orderService;
/** /**
* 订单查询接口 * 订单查询列表接口
* *
* @param channelId * @param channelId
* @param channelOrderNumber * @param channelOrderNumber
* @param pageNumber * @param pageNumber
* @param pageSize * @param pageSize
* @return * @return 返回中包含当前订单可操作的 button
*/ */
@ChannelIdInit @ChannelIdInit
@CheckChannelRole @CheckChannelRole
...@@ -85,4 +86,19 @@ public class OrderController { ...@@ -85,4 +86,19 @@ public class OrderController {
public Result<Boolean> cancelAfterLoan(@RequestParam @Valid String channelOrderNumber) { public Result<Boolean> cancelAfterLoan(@RequestParam @Valid String channelOrderNumber) {
return Result.buildSuccess(this.orderService.cancelAfterLoan(channelOrderNumber)); return Result.buildSuccess(this.orderService.cancelAfterLoan(channelOrderNumber));
} }
/**
* 订单历史状态查询接口
*
* @param channelOrderNumber
* @return
*/
@ChannelIdInit
@CheckChannelRoleByChannelOrderNumber
@GetMapping("/history/status")
public Result getOrderHistoryStatus(String channelOrderNumber) {
return Result.buildSuccess(orderService.getOrderHistoryStatus(channelOrderNumber));
}
} }
...@@ -10,6 +10,7 @@ import javax.persistence.Entity; ...@@ -10,6 +10,7 @@ import javax.persistence.Entity;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* 审批时 boss 创建的审批订单记录
* function: * function:
* date: 2019/8/12 * date: 2019/8/12
* *
...@@ -18,8 +19,8 @@ import javax.persistence.Table; ...@@ -18,8 +19,8 @@ import javax.persistence.Table;
@Data @Data
@Entity @Entity
@Table(name = "order") @Table(name = "order_approve")
public class Order extends Primary { public class OrderApprove extends Primary {
@Column(name = "channel_order_number") @Column(name = "channel_order_number")
private String channelOrderNumber; private String channelOrderNumber;
@Column(name = "credit_number") @Column(name = "credit_number")
...@@ -28,6 +29,8 @@ public class Order extends Primary { ...@@ -28,6 +29,8 @@ public class Order extends Primary {
private Long channelId; private Long channelId;
@Column(name = "fund_id") @Column(name = "fund_id")
private Integer fundId; private Integer fundId;
/** 0:非存管;1:存管 */
@Column(name = "fund_type") @Column(name = "fund_type")
private Integer fundType; private Integer fundType;
@Column(name = "ext_data") @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; 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 cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -13,8 +13,9 @@ import org.springframework.stereotype.Repository; ...@@ -13,8 +13,9 @@ import org.springframework.stereotype.Repository;
*/ */
@CashLoanFlowBossDataSource @CashLoanFlowBossDataSource
@Repository @Repository
public interface OrderRepository extends JpaRepository<Order, Long> { public interface OrderApproveRepository extends JpaRepository<OrderApprove, Long> {
Order findOrderByChannelOrderNumber(String channelOrderNumber); OrderApprove findByChannelOrderNumber(String channelOrderNumber);
OrderApprove findByCreditNumber(String creditOrderNumber);
} }
...@@ -3,13 +3,14 @@ package cn.quantgroup.cashloanflowboss.api.order.service; ...@@ -3,13 +3,14 @@ package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf; import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository; import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil; import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.api.order.entity.Order; import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo; import cn.quantgroup.cashloanflowboss.api.order.model.*;
import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel; import cn.quantgroup.cashloanflowboss.api.order.repository.OrderApproveRepository;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.repository.OrderRepository;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil; import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.core.Application; import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping; import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository; import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenter; import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenter;
...@@ -54,7 +55,7 @@ public class OrderService { ...@@ -54,7 +55,7 @@ public class OrderService {
@Autowired @Autowired
private ChannelConfRepository channelConfRepository; private ChannelConfRepository channelConfRepository;
@Autowired @Autowired
private OrderRepository orderRepository; private OrderApproveRepository orderApproveRepository;
@Autowired @Autowired
private XyqbUserService xyqbUserService; private XyqbUserService xyqbUserService;
...@@ -102,6 +103,7 @@ public class OrderService { ...@@ -102,6 +103,7 @@ public class OrderService {
}, new PageRequest(pageNumber, pageSize)); }, new PageRequest(pageNumber, pageSize));
return page.map(it -> { return page.map(it -> {
OrderVo orderVo = new OrderVo(); OrderVo orderVo = new OrderVo();
orderVo.setId(it.getId()); orderVo.setId(it.getId());
...@@ -109,16 +111,20 @@ public class OrderService { ...@@ -109,16 +111,20 @@ public class OrderService {
orderVo.setChannelOrderNumber(it.getChannelOrderNo()); orderVo.setChannelOrderNumber(it.getChannelOrderNo());
orderVo.setCreatedAt(it.getCreatedAt().getTime()); orderVo.setCreatedAt(it.getCreatedAt().getTime());
OrderVo.OptButton button = new OrderVo.OptButton(); OrderApprove orderApprove = orderApproveRepository.findByCreditNumber(it.getApplyNo());
button.setAction(OrderVo.OptButtonAction.audit.name());
button.setName(OrderVo.OptButtonAction.audit.getDesc());
List<OrderVo.OptButton> buttonList = new ArrayList<>(); ServiceResult<XyqbCurrentOrderStatusServiceResultModel> xyqbCenterServiceXyqbOrderStatus = xyqbCenterService.getXyqbOrderStatus(it.getApplyNo(), it.getLoanId());
buttonList.add(button); log.info("[xyqbCenterService.getXyqbOrderStatus]xyqbOrderStatus={}", JSONTools.serialize(xyqbCenterServiceXyqbOrderStatus));
if (xyqbCenterServiceXyqbOrderStatus.isSuccess()) {
QueryXyqbOrderStatus currentStatus = xyqbCenterServiceXyqbOrderStatus.getData().getCurrentStatus();
orderVo.setStatus(OrderVo.OptButtonAction.audit.getDesc()); Tuple<String, List<OrderVo.OptButton>> currentStatusAndButtons = OrderUtil.getCurrentStatusAndButtons(currentStatus, orderApprove);
orderVo.setOpt(buttonList); orderVo.setStatus(currentStatusAndButtons.getKey());
orderVo.setOpt(currentStatusAndButtons.getValue());
orderVo.setMessage(""); orderVo.setMessage("");
} else {
orderVo.setMessage("订单查询错误");
}
return orderVo; return orderVo;
}); });
} }
...@@ -160,15 +166,15 @@ public class OrderService { ...@@ -160,15 +166,15 @@ public class OrderService {
approveVo.getPeriod(), fundId); approveVo.getPeriod(), fundId);
Order order = new Order(); OrderApprove orderApprove = new OrderApprove();
order.setChannelOrderNumber(approveVo.getChannelOrderNumber()); orderApprove.setChannelOrderNumber(approveVo.getChannelOrderNumber());
order.setCreditNumber(orderMapping.getApplyNo()); orderApprove.setCreditNumber(orderMapping.getApplyNo());
order.setChannelId(orderMapping.getRegisteredFrom()); orderApprove.setChannelId(orderMapping.getRegisteredFrom());
order.setFundId(fundId); orderApprove.setFundId(fundId);
order.setFundType(approveVo.getFundType()); orderApprove.setFundType(approveVo.getFundType());
order.setCreateTime(new Date()); orderApprove.setCreateTime(new Date());
order.setUpdateTime(new Date()); orderApprove.setUpdateTime(new Date());
orderRepository.save(order); orderApproveRepository.save(orderApprove);
Map<String, Object> data = new HashMap<>(16); Map<String, Object> data = new HashMap<>(16);
...@@ -205,7 +211,7 @@ public class OrderService { ...@@ -205,7 +211,7 @@ public class OrderService {
boolean result; boolean result;
Order order = this.orderRepository.findOrderByChannelOrderNumber(lendingFormModel.getChannelOrderNumber()); OrderApprove orderApprove = this.orderApproveRepository.findByChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId()); ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId());
...@@ -215,12 +221,12 @@ public class OrderService { ...@@ -215,12 +221,12 @@ public class OrderService {
// 更新待放款时间 // 更新待放款时间
this.xyqbCenterService.updateFundLendingTime(orderMapping.getLoanId()); 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 // 如果是非存管,创建放款MQ
if (order.getFundType() == 0) { if (orderApprove.getFundType() == 0) {
this.xyqbCenterService.pushLendingResult(orderMapping.getLoanId(), lendingFormModel.getResult() ? 3 : 4); this.xyqbCenterService.pushLendingResult(orderMapping.getLoanId(), lendingFormModel.getResult() ? 3 : 4);
} }
...@@ -228,6 +234,47 @@ public class OrderService { ...@@ -228,6 +234,47 @@ public class OrderService {
} }
public boolean cancel(OrderVo orderVo) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(orderVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("cancel,关单失败,无订单 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("cancel,关单失败,未找到用户 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
Long userId = xUser.getId();
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
ArrayList<Object> cancel_list = Lists.newArrayList();
cancel_list.add("update xyqb.quota_credit set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.quota_account set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set progress=16 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set is_active=0 where user_id=" + userId);
cancel_list.add("delete from apply_quota_record where user_id=" + userId);
cancel_list.add("delete from user_operation_history where user_id=" + userId);
data.put("sql", cancel_list);
String cancel_result = jolyneCenter.cancel(JSONTools.serialize(data));
return "success".equals(cancel_result);
}
public XyqbHistoryOrderStatusServiceResultModel getOrderHistoryStatus(String channelOrderNumber) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
return new XyqbHistoryOrderStatusServiceResultModel();
}
ServiceResult<XyqbHistoryOrderStatusServiceResultModel> xyqbOrderHistoryStatusResult = xyqbCenterService.getXyqbOrderHistoryStatus(orderMapping.getApplyNo(), orderMapping.getLoanId());
if (xyqbOrderHistoryStatusResult.isSuccess()) {
log.info("[getOrderHistoryStatus]查询成功channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
return xyqbOrderHistoryStatusResult.getData();
} else {
log.info("[getOrderHistoryStatus]查询失败channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
return new XyqbHistoryOrderStatusServiceResultModel();
}
}
/** /**
* 贷前关单 * 贷前关单
* *
...@@ -280,6 +327,4 @@ public class OrderService { ...@@ -280,6 +327,4 @@ public class OrderService {
return true; return true;
} }
} }
package cn.quantgroup.cashloanflowboss.api.order.util; 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: * function:
* date: 2019/8/8 * date: 2019/8/8
...@@ -8,4 +17,108 @@ package cn.quantgroup.cashloanflowboss.api.order.util; ...@@ -8,4 +17,108 @@ package cn.quantgroup.cashloanflowboss.api.order.util;
*/ */
public class OrderUtil { 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 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.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
@Target({METHOD})
@Retention(RUNTIME)
public @interface CheckChannelRoleByChannelOrderNumber {
}
...@@ -5,9 +5,13 @@ import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil; ...@@ -5,9 +5,13 @@ import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.core.Application; import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit; import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole; import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.base.Result; import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus; import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
...@@ -15,6 +19,7 @@ import org.aspectj.lang.annotation.Aspect; ...@@ -15,6 +19,7 @@ import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature; import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -42,6 +47,9 @@ public class RoleLoadAspect { ...@@ -42,6 +47,9 @@ public class RoleLoadAspect {
@Pointcut("channelController() || orderController() ") @Pointcut("channelController() || orderController() ")
private void doSomeRole() {} private void doSomeRole() {}
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
@Around(value = "doSomeRole()") @Around(value = "doSomeRole()")
public Object around(ProceedingJoinPoint pjp) { public Object around(ProceedingJoinPoint pjp) {
...@@ -101,6 +109,32 @@ public class RoleLoadAspect { ...@@ -101,6 +109,32 @@ public class RoleLoadAspect {
} }
// ======================================== CheckChannelRole end ========================================== // ======================================== CheckChannelRole end ==========================================
// 如果是渠道用户登陆,参数中channelOrderNumber 不是登陆用户channelOrderNumber,返回 拒绝请求
CheckChannelRoleByChannelOrderNumber checkChannelRoleByChannelOrderNumber = method.getAnnotation(CheckChannelRoleByChannelOrderNumber.class);
if (checkChannelRoleByChannelOrderNumber != null && Application.getPrincipal().isChannel()) {
String[] paramNames = ((CodeSignature) pjp.getSignature()).getParameterNames();
String channelOrderNumber = "";
for (int i = 0; i < paramNames.length; i++) {
if ("channelOrderNumber".equals(paramNames[i])) {
channelOrderNumber = String.valueOf(args[i]);
}
}
if (StringUtils.isEmpty(channelOrderNumber)) {
log.info("[CheckChannelRoleByChannelOrderNumber]参数channelOrderNumber不能为空");
return Result.buildFial(ApplicationStatus.ARGUMENT_VALID_EXCEPTION);
}
ClfOrderMapping clfOrderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (clfOrderMapping == null) {
log.info("[CheckChannelRoleByChannelOrderNumber]无channelOrderNumber数据,channelOrderNumber={}",channelOrderNumber);
return Result.buildFial(ApplicationStatus.ARGUMENT_VALID_EXCEPTION, "未找到该订单");
}
if (!clfOrderMapping.getRegisteredFrom().equals(Application.getPrincipal().getChannelId())) {
log.info("[CheckChannelRoleByChannelOrderNumber]不是该渠道的订单,channelOrderNumber={}",channelOrderNumber);
return Result.buildFial(ApplicationStatus.INVALID_AUTHORITY);
}
}
// ======================================== CheckChannelRoleByChannelOrderNumber end ==========================================
try { try {
return pjp.proceed(args); return pjp.proceed(args);
} catch (Throwable throwable) { } catch (Throwable throwable) {
......
...@@ -3,6 +3,7 @@ package cn.quantgroup.cashloanflowboss.core.base; ...@@ -3,6 +3,7 @@ package cn.quantgroup.cashloanflowboss.core.base;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus; import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.core.dictionary.Status; import cn.quantgroup.cashloanflowboss.core.dictionary.Status;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.Objects; import java.util.Objects;
...@@ -17,7 +18,7 @@ public class Result<T> { ...@@ -17,7 +18,7 @@ public class Result<T> {
/** /**
* 状态码 * 状态码
*/ */
private int code; private Integer code;
/** /**
* 描述信息 * 描述信息
...@@ -85,5 +86,4 @@ public class Result<T> { ...@@ -85,5 +86,4 @@ public class Result<T> {
return new Result(ApplicationStatus.FAILURE, data, message); return new Result(ApplicationStatus.FAILURE, data, message);
} }
} }
package cn.quantgroup.cashloanflowboss.core.base;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.core.dictionary.Status;
import lombok.Data;
import java.util.Objects;
/**
* 请求返回数据结构实体类
* <p>
* Created by WeiWei on 2017/5/2.
*/
@Data
public class ServiceResult<T> {
/**
* 状态码
*/
private Integer code;
/**
* 描述信息
*/
private String message;
/**
* 返回结果
*/
private T data;
public ServiceResult() {}
public ServiceResult(Status status) {
this(status, null);
}
public ServiceResult(Status status, T data) {
this(status, data, null);
}
public ServiceResult(Status status, T data, String message) {
if (Objects.nonNull(status)) {
this.code = status.getCode();
this.message = Objects.isNull(message) ? status.getMessage() : message;
this.data = data;
}
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildSuccess(T data) {
return new ServiceResult(ApplicationStatus.SUCCESS, data);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildSuccess(T data, String message) {
return new ServiceResult(ApplicationStatus.SUCCESS, data, message);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildFial(T data) {
return new ServiceResult(ApplicationStatus.FAILURE, data);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildFial(String message) {
return new ServiceResult(ApplicationStatus.FAILURE, null, message);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildFial() {
return new ServiceResult(ApplicationStatus.FAILURE, null, null);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildFial(ApplicationStatus applicationStatus) {
return new ServiceResult(applicationStatus, null, null);
}
@SuppressWarnings("unchecked")
public static <T> ServiceResult<T> buildFial(T data, String message) {
return new ServiceResult(ApplicationStatus.FAILURE, data, message);
}
public Boolean isSuccess(){
return Objects.nonNull(this.code) && this.code == 0;
}
}
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.core.configuration;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* FeignClient配置
* <p>
* Created by WeiWei on 2018/11/12.
*/
@Configuration
public class FeignClientConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.client; package cn.quantgroup.cashloanflowboss.spi.xyqb.client;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbCurrentOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbHistoryOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -17,6 +20,12 @@ public interface XYQBCenter { ...@@ -17,6 +20,12 @@ public interface XYQBCenter {
@PostMapping(value = "/ex/paycenter/pay_notify", consumes = "application/x-www-form-urlencoded") @PostMapping(value = "/ex/paycenter/pay_notify", consumes = "application/x-www-form-urlencoded")
String pushLendingResult(@RequestParam Map parameter); String pushLendingResult(@RequestParam Map parameter);
@PostMapping(value = "/ex/ka/order/status", consumes = "application/x-www-form-urlencoded")
ServiceResult<XyqbCurrentOrderStatusServiceResultModel> getOrderStatus(@RequestParam Map paramMap);
@PostMapping(value = "/ex/ka/order/status/history", consumes = "application/x-www-form-urlencoded")
ServiceResult<XyqbHistoryOrderStatusServiceResultModel> getXyqbOrderHistoryStatus(@RequestParam Map paramMap);
@Component @Component
class Fallback implements XYQBCenter { class Fallback implements XYQBCenter {
...@@ -25,6 +34,17 @@ public interface XYQBCenter { ...@@ -25,6 +34,17 @@ public interface XYQBCenter {
return null; return null;
} }
@Override
public ServiceResult<XyqbCurrentOrderStatusServiceResultModel> getOrderStatus(Map orderNo) {
return null;
}
@Override
public ServiceResult<XyqbHistoryOrderStatusServiceResultModel> getXyqbOrderHistoryStatus(Map paramMap) {
return null;
}
} }
} }
package cn.quantgroup.cashloanflowboss.spi.xyqb.service; 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.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.spi.xyqb.client.XYQBCenter; import cn.quantgroup.cashloanflowboss.spi.xyqb.client.XYQBCenter;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.ContractRepository; import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.ContractRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.FundLendingRepository; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -77,4 +83,41 @@ public class XYQBCenterService { ...@@ -77,4 +83,41 @@ public class XYQBCenterService {
} }
/**
* 查询订单当前状态
* @param creditOrderNumber
* @param loanId
* @return
*/
public ServiceResult<XyqbCurrentOrderStatusServiceResultModel> getXyqbOrderStatus(String creditOrderNumber, Long loanId) {
Map paramMap = Maps.newHashMap();
paramMap.put("orderNo", creditOrderNumber);
if (loanId != null) {
paramMap.put("loanId", loanId);
}
paramMap = SignUtil.sign(SignUtil.KA_API_KEY, paramMap);
return xyqbCenter.getOrderStatus(paramMap);
}
/**
* 查询订单当前状态
* @param creditOrderNumber
* @param loanId
* @return
*/
public ServiceResult<XyqbHistoryOrderStatusServiceResultModel> getXyqbOrderHistoryStatus(String creditOrderNumber, Long loanId) {
Map paramMap = Maps.newHashMap();
paramMap.put("orderNo", creditOrderNumber);
if (loanId != null) {
paramMap.put("loanId", loanId);
}
paramMap = SignUtil.sign(SignUtil.KA_API_KEY, paramMap);
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