Commit bb3e79cc authored by suntao's avatar suntao

审批

parent 819062a9
...@@ -79,6 +79,19 @@ ...@@ -79,6 +79,19 @@
<artifactId>commons-core</artifactId> <artifactId>commons-core</artifactId>
</dependency> </dependency>
<!-- user sdk -->
<dependency>
<groupId>cn.quantgroup</groupId>
<artifactId>quantgroup-user-sdk</artifactId>
<version>1.1.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <dependency>
<groupId>commons-collections</groupId> <groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId> <artifactId>commons-collections</artifactId>
......
package cn.quantgroup.cashloanflowboss.api.order.controller; package cn.quantgroup.cashloanflowboss.api.order.controller;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
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.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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/** /**
* function: * function:
* date: 2019/8/8 * date: 2019/8/8
...@@ -29,4 +33,11 @@ public class OrderController { ...@@ -29,4 +33,11 @@ public class OrderController {
return Result.buildSuccess(orderService.getOrders(channelId, channelOrderNumber, pageNumber, pageSize)); return Result.buildSuccess(orderService.getOrders(channelId, channelOrderNumber, pageNumber, pageSize));
} }
@ChannelIdInit
@CheckChannelRole
@RequestMapping("/approve")
public Result approveOpt(@RequestBody @Valid ApproveVo approveVo) {
return Result.buildSuccess(orderService.approveOpt(approveVo));
}
} }
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Data
public class ApproveVo {
@NotNull(message = "审批,订单号不能为空")
private String channelOrderNumber;
@NotNull(message = "审批,金额不能为空")
private String amount;
@NotNull(message = "审批,期数不能为空")
private Integer period;
@NotNull(message = "审批,资金类型不能为空")
private Integer fundType;
@NotNull(message = "审批,期望mock结果不能为空")
private Boolean isPass;
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Data
public class ClothoApproveModel {
private Integer code = 0;
private String msg = "success";
private Long bizChannel;
private String uuid;
private String bizNo;
private Integer bizType;
private Boolean auditResult;
private String amount;
private Long deadLine;
private String extData;
/**
* [{"min":10000,"max":10000,"terms":[{"term":6,"fundInfo":[{"fundId":480,"rate":"0","rateType":1,"priority":"1","feeType":"1"}]}]}]
*/
private String financeProducts;
}
package cn.quantgroup.cashloanflowboss.api.order.service; package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.channel.entity.boss.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.repository.boss.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.model.ClothoApproveModel;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo; import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
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.user.service.UserSysService;
import cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService;
import cn.quantgroup.cashloanflowboss.spi.util.HttpService;
import cn.quantgroup.user.retbean.XUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
/** /**
* function: * function:
...@@ -21,11 +30,21 @@ import java.util.Objects; ...@@ -21,11 +30,21 @@ import java.util.Objects;
* @author: suntao * @author: suntao
*/ */
@Slf4j
@Service @Service
public class OrderService { public class OrderService {
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired @Autowired
private ClfOrderMappingRepository clfOrderMappingRepository; private ClfOrderMappingRepository clfOrderMappingRepository;
@Autowired
private XyqbUserService xyqbUserService;
@Autowired
private HttpService httpService;
//@Value("${fund.pay.api-host}")
private String clothoHttp;
public Page<OrderVo> getOrders(Long channelId, String channelOrderNo, Integer pageNumber, Integer pageSize) { public Page<OrderVo> getOrders(Long channelId, String channelOrderNo, Integer pageNumber, Integer pageSize) {
...@@ -66,4 +85,59 @@ public class OrderService { ...@@ -66,4 +85,59 @@ public class OrderService {
}); });
} }
public Boolean approveOpt(ApproveVo approveVo) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(approveVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("approveOpt,审批失败,无订单 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("approveOpt,审批失败,未找到用户 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
ChannelConf channelConf = channelConfRepository.getByChannelId(orderMapping.getRegisteredFrom());
if (channelConf == null) {
log.info("approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
// 额度有效期
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 7);
// 资方 及 期数额度规则
Integer fundType = approveVo.getFundType();
Integer fundId;
if (fundType == 0) {
fundId = channelConf.getFundId();
} else {
fundId = channelConf.getP2pFundId();
}
String fundFormat = String.format(OrderUtil.financeProductsFormat, approveVo.getAmount(), approveVo.getAmount(),
approveVo.getPeriod(), fundId);
ClothoApproveModel clothoApproveModel = new ClothoApproveModel();
clothoApproveModel.setCode(0);
clothoApproveModel.setMsg("success");
clothoApproveModel.setBizChannel(orderMapping.getRegisteredFrom());
clothoApproveModel.setUuid(xUser.getUuid());
clothoApproveModel.setBizNo(orderMapping.getChannelOrderNo());
clothoApproveModel.setBizType(channelConf.getBizType());
clothoApproveModel.setAuditResult(approveVo.getIsPass());
clothoApproveModel.setAmount(approveVo.getAmount());
clothoApproveModel.setDeadLine(calendar.getTime().getTime());
clothoApproveModel.setExtData("");
clothoApproveModel.setFinanceProducts(fundFormat);
//httpService.post(clothoHttp.concat("/external/quota/auth_amount_audit/notify"), );
return true;
}
} }
package cn.quantgroup.cashloanflowboss.api.order.util;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
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\"}]}]}]";
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.user.IUserSdkService;
/**
* Created by Miraculous on 2017/2/15.
*/
public interface UserSysService {
/**
* 获取http调用service
* @return
*/
IUserSdkService getService();
/**
* 获取motan调用service
* @return
*/
IUserSdkService getMotanService();
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.cashloanflowboss.spi.user.service.UserSysService;
import cn.quantgroup.user.IUserSdkService;
import cn.quantgroup.user.UserSdkServiceFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* Created by Miraculous on 2017/2/15.
*/
@Service
@Slf4j
public class UserSysServiceImpl implements UserSysService {
@Autowired
@Qualifier("httpClient")
private CloseableHttpClient httpClient;
@Value("${passportapi.http}")
private String passportapiHttp;
private IUserSdkService userSdkService; // http调用sdk
@PostConstruct
private void init() {
userSdkService = UserSdkServiceFactory.generateSDKService(passportapiHttp, httpClient);
}
@Override
public IUserSdkService getService() {
return userSdkService;
}
@Override
public IUserSdkService getMotanService() {
return userSdkService;
}
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.user.bean.UserInfo;
import cn.quantgroup.user.retbean.XUser;
import cn.quantgroup.user.retbean.XUserDetail;
/**
* Created by Rocky on 2016/6/23.
*/
public interface XyqbUserService {
/**
* 查询用户
*/
XUser findXUserById(Long userId);
/**
* 查询用户detail
*/
XUserDetail findUserDetailByUserId(Long userId);
/**
* get uuid
* @param phoneNo 手机号
* @return String token
*/
String getUuid(String phoneNo);
/**
* 通过手机号码 查询xyqb-user
* @param phoneNo
* @return
*/
XUser findUserByPhoneNo(String phoneNo);
/**
* 判断是否老用户
* @param phoneNo 手机号
* @return 老用户 true;新用户 false
*/
boolean isOldUser(String phoneNo);
/**
* 用户detail信息
* @param uuid
* @return
*/
UserInfo findUserByUuid(String uuid);
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.cashloanflowboss.spi.util.HttpService;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.cashloanflowboss.utils.MD5Tools;
import cn.quantgroup.user.bean.UserInfo;
import cn.quantgroup.user.retbean.XUser;
import cn.quantgroup.user.retbean.XUserDetail;
import cn.quantgroup.user.vo.UserSysResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* Created by Rocky on 2016/6/23.
*/
@Service
public class XyqbUserServiceImpl implements XyqbUserService {
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(XyqbUserServiceImpl.class);
@Autowired
private UserSysService userSysService;
@Autowired
private HttpService httpService;
@Value("${passportapi.http}")
private String passportapiHttp;
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 查询用户
*
* @param userId
* @return XyqbUser
*/
@Override
public XUser findXUserById(Long userId) {
UserSysResult<XUser> userSysResult = userSysService.getService().findUserByUserId(userId);
if (!userSysResult.isSuccess() || userSysResult.getData() == null) {
LOGGER.error("用户不存在,userId=[{}]", userId);
return null;
}
return userSysResult.getData();
}
@Override
public XUserDetail findUserDetailByUserId(Long userId) {
UserSysResult<XUserDetail> userDetailResult = userSysService.getService().findUserDetailByUserId(userId);
if (!userDetailResult.isSuccess() || userDetailResult.getData() == null) {
LOGGER.error("[findUserDetailByUserId_{}]向用户中心查询用户详情失败,userId={},result={}", userId, JSONTools.serialize(userDetailResult));
return null;
}
return userDetailResult.getData();
}
@Override
public String getUuid(String phoneNo) {
if (StringUtils.isEmpty(phoneNo)) {
return null;
}
UserSysResult<XUser> user = userSysService.getService().findUserByPhoneNo(phoneNo);
if (Objects.isNull(user) || Objects.isNull(user.getData())) {
return null;
}
return user.getData().getUuid();
}
@Override
public XUser findUserByPhoneNo(String phoneNo) {
UserSysResult<XUser> xuserResult = userSysService.getService().findUserByPhoneNo(phoneNo);
if (xuserResult == null || xuserResult.getData() == null || !xuserResult.isSuccess()) {
LOGGER.info("[findUserByPhoneNo]用户中心无用户信息,phoneNo={},phoneDd5={}", phoneNo, MD5Tools.md5(phoneNo));
return null;
}
return xuserResult.getData();
}
/**
* 判断是否老用户
*
* @param phoneNo 手机号
* @return 老用户 true;新用户 false
*/
@Override
public boolean isOldUser(String phoneNo) {
UserSysResult<XUser> userData = userSysService.getService().findUserByPhoneNo(phoneNo);
if (userData == null) {
LOGGER.error("[user_isOldUser]查询用户失败, phoneNo={}", phoneNo);
return false;
}
if (userData.getData() == null) {
LOGGER.info("[user_isOldUser]没有查询到用户, phoneNo={}", phoneNo);
return false;
} else {
return true;
}
}
/**
* 用户detail信息
*/
@Override
public UserInfo findUserByUuid(String uuid) {
UserSysResult<UserInfo> userInfo = userSysService.getService().findUserInfoByUuid(uuid);
if (!userInfo.isSuccess() || userInfo.getData() == null) {
return null;
}
return userInfo.getData();
}
}
...@@ -43,7 +43,7 @@ import org.apache.http.message.BasicNameValuePair; ...@@ -43,7 +43,7 @@ import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
...@@ -234,6 +234,7 @@ public class HttpService { ...@@ -234,6 +234,7 @@ public class HttpService {
* @throws NoSuchAlgorithmException * @throws NoSuchAlgorithmException
* @throws KeyManagementException * @throws KeyManagementException
*/ */
@Bean("httpClient")
public CloseableHttpClient httpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { public CloseableHttpClient httpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
// socket factory // socket factory
ConnectionSocketFactory plainSocketFactory = new PlainConnectionSocketFactory(); ConnectionSocketFactory plainSocketFactory = new PlainConnectionSocketFactory();
......
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