Commit 8bec6774 authored by suntao's avatar suntao

订单列表查询(缺订单状态)

parent e4685308
...@@ -79,6 +79,12 @@ ...@@ -79,6 +79,12 @@
<artifactId>commons-core</artifactId> <artifactId>commons-core</artifactId>
</dependency> </dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- <dependency> <!-- <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId> <artifactId>spring-cloud-netflix-core</artifactId>
......
package cn.quantgroup.cashloanflowboss.api.order.controller;
import cn.quantgroup.cashloanflowboss.api.order.service.OrderService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* function:
* date: 2019/8/8
* @author: suntao
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@RequestMapping("/info")
public Result getOrders(Long channelId, String channelOrderNumber, Integer pageNumber, Integer pageSize) {
return Result.buildSuccess(orderService.getOrders(channelId, channelOrderNumber, pageNumber, pageSize));
}
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Data
public class OrderVo {
private Long id;
private Long channelId;
private String channelOrderNumber;
private Long createdAt;
private String status;
/**
* [ {action:"audit",name:"审核"},{},{}... ]
*/
private String opt;
private String message;
@Data
public static class OptButton {
private String action;
private String name;
}
public enum OptButtonAction {
audit("审批"),
cancel("贷前关单"),
pay_succ("放款成功"),
pay_fail("放款失败"),
withdraw2_succ("二次提现成功"),
cancel_after("贷后关单");
OptButtonAction(String desc) {
this.desc = desc;
}
private String desc;
public String getDesc(){
return this.desc;
}
}
}
package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Service
public class OrderService {
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
public Page<OrderVo> getOrders(Long channelId, String channelOrderNo, Integer pageNumber, Integer pageSize) {
Page<ClfOrderMapping> page = this.clfOrderMappingRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("registeredFrom"), channelId.longValue()));
}
if (StringUtils.isNotEmpty(channelOrderNo)) {
predicates.add(criteriaBuilder.equal(root.get("channelOrderNo"), channelOrderNo));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}, new PageRequest(pageNumber, pageSize));
return page.map(it-> {
OrderVo orderVo = new OrderVo();
orderVo.setId(it.getId());
orderVo.setChannelId(it.getRegisteredFrom());
orderVo.setChannelOrderNumber(it.getChannelOrderNo());
orderVo.setCreatedAt(it.getCreatedAt().getTime());
orderVo.setStatus("");
orderVo.setOpt("");
orderVo.setMessage("");
return orderVo;
});
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
*
*/
@Data
@Entity
@Table(name = "order_mapping",catalog = "cash_loan_flow" )
public class ClfOrderMapping {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "channel_order_no")
private String channelOrderNo;
@Column(name = "channel_payment_no")
private String channelPaymentNo;
@Column(name = "apply_no")
private String applyNo;
@Column(name = "loan_id")
private Long loanId;
@Column(name = "registered_from")
private Long registeredFrom;
@Column(name = "order_extend")
private String orderExtend;
@Column(name = "qg_user_id")
private Long qgUserId;
@Column(name = "payment_at")
private Timestamp paymentAt;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.sql.Timestamp;
import java.util.List;
public interface ClfOrderMappingRepository extends PagingAndSortingRepository<ClfOrderMapping, Long>, JpaSpecificationExecutor<ClfOrderMapping> {
List<ClfOrderMapping> findByChannelOrderNoAndRegisteredFrom(String channelOrderNo, Long registeredFrom);
ClfOrderMapping findByChannelPaymentNoAndRegisteredFrom(String channelOrderNo, Long registeredFrom);
List<ClfOrderMapping> findByApplyNo(String applyNo);
@Query(value = "select * from order_mapping where apply_no =?1 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByApplyNoLastOne(String applyNo);
ClfOrderMapping findByLoanId(long loanApplicationHistoryId);
ClfOrderMapping findByChannelOrderNoAndChannelPaymentNo(String channelOrderNo, String paymentNo);
@Query(value = "select * from order_mapping where channel_order_no =?1 AND order_extend like ?2 limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoAndChannelPaymentNoInOrderExtend(String channelOrderNo, String channelPaymentNo);
@Query(value = "select * from order_mapping where loan_id IN ?1 AND registered_from = ?2", nativeQuery = true)
List<ClfOrderMapping> findChannelOrderNoByLoanIdList(List<String> loanIdList, Long registeredFrom);
@Query(value = "select * from order_mapping where channel_order_no = ?1 AND registered_from = ?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoAndRegisteredFromLastOne(String channelApplyNo, Long registeredfrom);
@Query(value = "select * from order_mapping where channel_order_no = ?1 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoLastOne(String channelApplyNo);
@Query(value = "select * from order_mapping where loan_id is NULL AND apply_no = ?1", nativeQuery = true)
ClfOrderMapping findByApplyNoAndLoanIdIsNull(String applyNo);
@Query(value = "select * from order_mapping where created_at >?1 and created_at <=?2 and registered_from =?3 and order_extend is null", nativeQuery = true)
List<ClfOrderMapping> findByCreatedAtBeginAndEndAndRegisteredFrom(Timestamp begin, Timestamp end, Long registeredFrom);
@Query(value = "select * from order_mapping where qg_user_id =?1 and registered_from =?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByUserIdAndRegisteredFromLastOne(Long qgUserId, Long registeredFrom);
@Query(value = "select * from order_mapping where apply_no =?1 and registered_from = ?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByApplyNoAndRegisteredFromLastOne(String applyNo, Long registeredFrom);
@Query(value = "select * from order_mapping where qg_user_id =?1 and registered_from = ?2 ORDER BY created_at ASC", nativeQuery = true)
List<ClfOrderMapping> findByQgUserId(Long qgUserId, Long registeredFrom);
// 监控 begin
@Query(value = "select om.registered_from,count(1) from order_mapping om where om.created_at > ?1 AND om.created_at <= ?2 group by om.registered_from", nativeQuery = true)
List<Object[]> findBetweenCreatedAtGroupByRegisteredFrom(Timestamp begin, Timestamp end);
@Query(value = "select count(1) from order_mapping om where om.created_at > ?1 AND om.created_at <= ?2", nativeQuery = true)
Integer findBetweenCreatedAt(Timestamp begin, Timestamp end);
// 监控 end
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.model;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
/**
* Created by suntao on 18/01/15.
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class JsonResult<T> implements Serializable {
String ZERO_FILL_TEMPLATE = "%04d";
String SUCCESS_BUSINESS_CODE = "0000";
String SUCCESS_STRING_CODE = "0000";
public static final Long SUCCESS_CODE = 0L;
private String msg = "";
private String code = "0000";
// 业务错误码
private String businessCode = "0000";
private T data = null;
public JsonResult(String msg, Long code, T data) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
}
public JsonResult(String msg, Long code, T data, Long businessCode) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
this.businessCode = String.format(ZERO_FILL_TEMPLATE, businessCode);
}
/**
* 构造成功的JsonResult
* @param msg String
* @param data Object
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static<T> JsonResult buildSuccess(String msg, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, 0L);
}
/**
* 构造状态不正确的JsonResult
* @param msg String
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static JsonResult buildError(String msg) {
return new JsonResult(msg, SUCCESS_CODE, null, 1L);
}
/**
* 构造状态不正确的JsonResult
* @param msg String
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static<T> JsonResult buildError(String msg, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, 1L);
}
@SuppressWarnings("unchecked")
public static JsonResult buildError(String msg, Long busniessId) {
return new JsonResult(msg, SUCCESS_CODE, null, busniessId);
}
@SuppressWarnings("unchecked")
public static<T> JsonResult buildError(String msg, Long busniessId, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, busniessId);
}
/**
* 是否成功状态
* @return
*/
public boolean isSuccess(){
return SUCCESS_STRING_CODE.equals(this.getCode()) && SUCCESS_BUSINESS_CODE.equals(this.getBusinessCode());
}
public String getMessage() {
return this.msg;
}
@Override
public String toString() {
return JSONTools.serialize(this);
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 查询订单状态 model
* Created with suntao on 2018/12/26
*/
@Data
@NoArgsConstructor
public class OrderStatusQueryModel {
/** APPROVE 时 非空,元 */
private String drawTryAmount;
/** APPROVE 时 非空,元 */
private String drawTryTerm;
private ClfOrderMapping orderMapping;
/** 可以为空 */
private QueryType queryType;
public OrderStatusQueryModel(ClfOrderMapping orderMapping) {
this.orderMapping = orderMapping;
}
public enum QueryType {
APPROVE("审批状态查询"),
WITHDRAW("提现状态查询,贷前提现"),
CANCEL_LOAN("取消借款"),
CANCEL_AFTER_LOAN("取消借款,贷后,退款"),
PAY("放款状态查询"),
ALL_REPAID("结清状态查询");
private String desc;
public String getDesc(){
return this.desc;
}
QueryType(String desc) {
this.desc = desc;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import lombok.Data;
import java.util.Date;
/**
* Created with suntao on 2018/12/26
*/
@Data
public class OrderStatusQueryResultOnlyStatus {
private String applyNo;
private Long loanId;
private KANoticeType kaNoticeType;
private Date updateTime;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created with suntao on 2018/5/23
*/
public class ProductUtil {
public static String getProductId(Long registeredFrom) {
String productId = product.get(registeredFrom);
if (StringUtils.isNotEmpty(productId)) {
return productId;
} else {
return "1";
}
}
public static Integer getIntProductId(Long registeredFrom) {
String productId = product.get(registeredFrom);
if (StringUtils.isNotEmpty(productId)) {
return Integer.valueOf(productId);
} else {
return 1;
}
}
static Map<Long, String> product = new HashMap<>(4);
static {
product.put(159509L,"3");
product.put(159858L,"900");
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import com.google.gson.annotations.JsonAdapter;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* Created by zhaojiankun on 2018/4/10.
*/
@Data
public class QuotaCreditInfo implements Serializable {
private static final long serialVersionUID = -1L;
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 渠道
*/
private Long channel;
/**
* 和授信中心关联字段
*/
private String orderNo;
/**
* 授信状态
*/
private int creditStatus;
/**
* 授信信息来源
*/
private int creditSource;
/**
* 产品id,关联产品表
* KA 渠道来的数据,会提前把这个值传过来,需要存下来之后用
*/
private Long productId;
/**
* 授信状态
*/
private String remark;
/**
* 接收到风控回调时间,yyyy-MM-dd HH:mm:ss
*/
private Timestamp receiveAt;
private Timestamp createdAt;
private Timestamp updatedAt;
/**
* 马甲包数据
*/
private String loanVestInfo;
/**
* app 渠道
*/
private String appChannel;
/**
* 借款用途
*/
private String purpose;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.*;
/**
* Created with suntao on 2018/4/8
*/
@Data
@Slf4j
public class QuotaInfo {
private Account account;
private Rule rule;
@Data
public class Account {
private Long id;
private Long userId;
private Long productId;
/** 授信额度 */
private BigDecimal totalAmount;
/** 可用额度 */
private BigDecimal availableAmount;
/** 已使用额度 */
private BigDecimal usedAmount;
/** 冻结额度 */
private BigDecimal freezeAmount;
}
@Data
public class Rule {
private Long fundCorpId;
// /** 期数 {\"3000\":[3,6],\"6000\":[3,6,9]} */
// private String terms;
/** 期数 {\"3000\":[3,6],\"6000\":[3,6,9]} */
private Map<String, TreeSet<Integer>> inputRule;
/** 授信额度 */
private BigDecimal maxAmount;
/** 日利率 */
private BigDecimal dayRate;
/** 月利率 */
private BigDecimal monthlyInterestRate;
/** 年利率 == 综合利率 */
private BigDecimal annualInterestRate;
/** 月服务费 */
private BigDecimal serviceFeeRate;
// 外加属性,额度和期数的集合
private List<TermsDetail> termsDetailList;
// 所有期数 用逗号隔开
private String termsStr;
public TermsDetail getMaxAmountAndTerm() {
if (CollectionUtils.isEmpty(termsDetailList)) {
try {
loadTermsDetail();
} catch (Exception e) {
return null;
}
return termsDetailList.get(termsDetailList.size() - 1);
}else {
return termsDetailList.get(termsDetailList.size() - 1);
}
}
/**
* 初始化额度-提现期数关系
*/
public void loadTermsDetail() {
TreeSet<Integer> termsSetAll = new TreeSet<>();
if (CollectionUtils.isEmpty(termsDetailList)) {
termsDetailList = new ArrayList<>();
// Map<String,Integer[]> inputRule = Constants.GSON.fromJson(terms, new TypeToken<Map<String, Integer[]>>() {}.getType());
// for (Map.Entry<String,Integer[]> entry : inputRule.entrySet()) {
// TermsDetail termsDetailInner = new TermsDetail();
// termsDetailInner.setAmount(Long.valueOf(entry.getKey()));
// Integer[] termValues = entry.getValue();
// termsDetailInner.setTermDetail(termValues);
// Arrays.sort(termValues);
// termsDetailInner.setMinTerm(termValues[0]);
// termsDetailInner.setMaxTerm(termValues[termValues.length-1]);
// termsDetail.add(termsDetailInner);
// }
for (Map.Entry<String,TreeSet<Integer>> entry : inputRule.entrySet()) {
TermsDetail termsDetailInner = new TermsDetail();
termsDetailInner.setAmount(Long.valueOf(entry.getKey()));
TreeSet<Integer> termValues = entry.getValue();
termsDetailInner.setTerms(termValues);
termsSetAll.addAll(termValues);
termsDetailInner.setMinTerm(termValues.first());
termsDetailInner.setMaxTerm(termValues.last());
termsDetailList.add(termsDetailInner);
}
// 排序,按照额度升序排序
Collections.sort(termsDetailList,(TermsDetail t1,TermsDetail t2)->{
// 当compareTo的返回值大于0的时候,进行元素的移位,其他情况,不作处理
try {
if (!Objects.isNull(t1.getAmount()) && !Objects.isNull(t2.getAmount())) {
// (x < y) ? -1 : ((x == y) ? 0 : 1);
return t1.getAmount().compareTo(t2.getAmount());
}
else {
return Objects.isNull(t1.getAmount()) ? (Objects.isNull(t2.getAmount()) ? 0 : 1) : -1;
}
} catch (Exception ex) {
return 0;
}
});
}
if (StringUtils.isEmpty(termsStr)) {
if (CollectionUtils.isNotEmpty(termsSetAll)) {
// // 排序,按照额度升序排序
termsStr = StringUtils.join(termsSetAll,",");
}
}
}
}
@Data
public class TermsDetail {
private Long amount;
private TreeSet<Integer> terms;
private int maxTerm;
private int minTerm;
}
/**
* 验证 查询额度 有效性
* @param quotaInfo
* @return
*/
public static boolean validationQuotaInfo(QuotaInfo quotaInfo) {
if (quotaInfo == null) {
return false;
}
if (quotaInfo.getAccount() == null || quotaInfo.getRule() == null) {
return false;
}
if (quotaInfo.getRule().getInputRule() == null) {
return false;
}
try {
QuotaInfo.TermsDetail maxAmountAndTerm = quotaInfo.getRule().getMaxAmountAndTerm();
if (maxAmountAndTerm == null) {
return false;
}
if (StringUtils.isEmpty(quotaInfo.getRule().termsStr)) {
return false;
}
} catch (Exception e) {
log.error("[exception][validationQuotaInfo]",e);
return false;
}
return true;
}
}
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