Sunshine
2024-11-04 177f10973fd9bc1f0930369bb086ad9f0053440c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package com.nova.sankuai.domain.api.yangqianguan.dto;
 
import cn.hutool.core.date.DateUtil;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.nova.sankuai.domain.api.yangqianguan.YqgUtil;
import com.nova.sankuai.domain.api.yangqianguan.vo.RepayDetailVo;
import com.nova.sankuai.domain.api.yixin.response.YxRepaymentPlanQueryResponse;
import com.nova.sankuai.domain.api.yixin.vo.YxpkgListVo;
import com.nova.sankuai.domain.entity.YqgRepayOrder;
import com.nova.sankuai.infra.utils.ConstantsUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang.StringUtils;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
 
/**
 * 还款结果反馈Dto
 */
@Data
@ApiModel(value = "还款结果Dto")
public class RepayResultReturnDto {
 
    @JsonProperty("order_no")
    @ApiModelProperty(value = "订单编号")
    private String orderNo;
 
    @ApiModelProperty(value = "还款编号")
    @JsonProperty("repay_no")
    private String repayNo;
 
    @ApiModelProperty(value = "还款状态")
    private Integer status;
 
    @ApiModelProperty(value = "机构还款编号")
    @JsonProperty("agency_repay_no")
    private String agencyRepayNo;
 
    @ApiModelProperty(value = "还款方式 参照YqgRepayOrder的type字段取值")
    private Integer type;
 
    @ApiModelProperty(value = "还款金额")
    private Double amount;
 
    @ApiModelProperty(value = "本金")
    private Double principal;
 
    @ApiModelProperty(value = "利息")
    private Double interest;
 
    @ApiModelProperty(value = "罚息")
    @JsonProperty("overdue_interest")
    private Double overdueInterest;
 
    @ApiModelProperty(value = "服务费")
    @JsonProperty("service_fee")
    private Double serviceFee;
 
    @ApiModelProperty(value = "其他费用")
    @JsonProperty("other_fee")
    private Double otherFee;
 
    @ApiModelProperty(value = "特殊情况 0:无 1:线下减免")
    private Integer tag;
 
    @ApiModelProperty(value = "减免金额 tag为1时非空")
    @JsonProperty("reduce_fee")
    private Double reduceFee;
 
    @ApiModelProperty(value = "银行卡号")
    @JsonProperty("bank_card")
    private String bankCard;
 
    @ApiModelProperty(value = "还款成功时间")
    @JsonProperty("success_time")
    private Long successTime;
 
    @ApiModelProperty(value = "还款明细")
    @JsonProperty("repay_details")
    private List<RepayDetailVo> repayDetails;
 
    @ApiModelProperty(value = "备注")
    private String remark;
 
    public static RepayResultReturnDto parseDto(YqgRepayOrder yqgRepayOrder, YxRepaymentPlanQueryResponse planQuery) {
        RepayResultReturnDto feedBackDto = new RepayResultReturnDto();
        feedBackDto.setOrderNo(yqgRepayOrder.getOrderNo());
        feedBackDto.setRepayNo(yqgRepayOrder.getRepayNo());
        feedBackDto.setStatus(yqgRepayOrder.getStatus());
        feedBackDto.setAgencyRepayNo(yqgRepayOrder.getRepayApplyNo());
        feedBackDto.setType(yqgRepayOrder.getType());
        feedBackDto.setRemark("");
        if (YqgRepayOrder.STATUS_SUCCESS.equals(yqgRepayOrder.getStatus())) {
            if (planQuery != null && planQuery.isSuccess()) {
                List<YxpkgListVo> pkgListVos = planQuery.getPkgList();
                if (pkgListVos != null && pkgListVos.size() > 0) {
                    String periodNos = yqgRepayOrder.getPeriodNos();
                    String[] split = periodNos.split(",");
                    pkgListVos = pkgListVos.stream().filter(i -> Arrays.asList(split).contains(i.getRepayTerm()))
                            .collect(Collectors.toList());
                    feedBackDto.setTag(0);
                    Double amount = 0.00d;
                    Double principal = 0.00d;
                    Double interest = 0.00d;
                    Double overdueInterest = 0.00d;
                    Double serviceFee = 0.00d;
                    Double otherFee = 0.00d;
                    if (StringUtils.isNotEmpty(yqgRepayOrder.getRepayTime())) {
                        feedBackDto.setSuccessTime(DateUtil.parse(yqgRepayOrder.getRepayTime()).getTime());
                    } else {
                        feedBackDto.setSuccessTime(new Date().getTime());
                    }
                    List<RepayDetailVo> repayDetailVos = new ArrayList<>();
                    for (YxpkgListVo yxpkgListVo : pkgListVos) {
                        RepayDetailVo repayDetailVo = RepayDetailVo.parseVo(yxpkgListVo);
                        serviceFee = serviceFee + repayDetailVo.getServiceFee();
                        otherFee = otherFee + repayDetailVo.getOtherFee();
                        amount = amount + repayDetailVo.getAmount();
                        principal = principal + repayDetailVo.getPrincipal();
                        interest = interest + repayDetailVo.getInterest();
                        overdueInterest = overdueInterest + repayDetailVo.getOverdueInterest();
                        repayDetailVos.add(repayDetailVo);
                    }
                    feedBackDto.setBankCard(yqgRepayOrder.getBankCard());
                    feedBackDto.setRepayDetails(repayDetailVos);
                    feedBackDto.setAmount(ConstantsUtil.formatPrice(amount.toString()));
                    feedBackDto.setPrincipal(ConstantsUtil.formatPrice(principal.toString()));
                    feedBackDto.setInterest(ConstantsUtil.formatPrice(interest.toString()));
                    feedBackDto.setOverdueInterest(ConstantsUtil.formatPrice(overdueInterest.toString()));
                    feedBackDto.setServiceFee(ConstantsUtil.formatPrice(serviceFee.toString()));
                    feedBackDto.setOtherFee(ConstantsUtil.formatPrice(otherFee.toString()));
                    String remark = YqgUtil.parseRemark(principal, interest, serviceFee, overdueInterest, otherFee);
                    feedBackDto.setRemark(remark);
                    return feedBackDto;
                }
            }
            return null;
        } else if (YqgRepayOrder.STATUS_FAIL.equals(yqgRepayOrder.getStatus())) {
            feedBackDto.setRemark(yqgRepayOrder.getRemark());
        }
        return feedBackDto;
    }
}