1 package com
.baibao
.loan
.task
.service
.impl
;
3 import java
.math
.BigDecimal
;
4 import java
.math
.RoundingMode
;
5 import java
.text
.SimpleDateFormat
;
6 import java
.util
.ArrayList
;
9 import org
.apache
.commons
.logging
.Log
;
10 import org
.apache
.commons
.logging
.LogFactory
;
11 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
12 import org
.springframework
.beans
.factory
.annotation
.Value
;
13 import org
.springframework
.stereotype
.Service
;
14 import org
.springframework
.transaction
.annotation
.Transactional
;
16 import com
.baibao
.loan
.fuyou
.data
.ChangeCardResponse
;
17 import com
.baibao
.loan
.model
.LoanProduct
;
18 import com
.baibao
.loan
.model
.PublicOrder
;
19 import com
.baibao
.loan
.model
.Repayment
;
20 import com
.baibao
.loan
.model
.TenderRecord
;
21 import com
.baibao
.loan
.service
.BankCardManager
;
22 import com
.baibao
.loan
.service
.LoanProductManager
;
23 import com
.baibao
.loan
.service
.ProfitManager
;
24 import com
.baibao
.loan
.service
.PublicOrderManager
;
25 import com
.baibao
.loan
.service
.RepaymentManager
;
26 import com
.baibao
.loan
.service
.TenderRecordManager
;
27 import com
.baibao
.loan
.task
.service
.LoanTaskService
;
28 import com
.baibao
.message
.data
.MessageType
;
29 import com
.baibao
.message
.service
.SmsRecordManager
;
30 import com
.baibao
.option
.model
.OptionName
;
31 import com
.baibao
.option
.service
.OptionManager
;
32 import com
.baibao
.pay
.GetUniqueNoService
;
33 import com
.baibao
.pay
.PayService
;
34 import com
.baibao
.pay
.data
.HostingRefundRequest
;
35 import com
.baibao
.pay
.data
.HostingRefundResponse
;
36 import com
.baibao
.user
.model
.User
;
37 import com
.baibao
.user
.model
.UserInfo
;
38 import com
.baibao
.user
.service
.UserInfoManager
;
39 import com
.baibao
.user
.service
.UserManager
;
40 import com
.baibao
.utils
.HttpHelper
;
41 import com
.baibao
.utils
.JaxbHelper
;
42 import com
.baibao
.utils
.MapBuilder
;
43 import com
.baibao
.utils
.Utils
;
45 import jodd
.util
.StringUtil
;
47 @Service("loanTaskService")
48 public class LoanTaskServiceImpl
49 implements LoanTaskService
51 private static Log log
= LogFactory
.getLog(LoanTaskServiceImpl
.class);
54 protected RepaymentManager repaymentManager
;
57 protected ProfitManager profitManager
;
60 protected OptionManager optionManager
;
63 protected LoanProductManager loanProductManager
;
66 protected TenderRecordManager tenderRecordManager
;
69 protected PayService payService
;
72 protected PublicOrderManager publicOrderManager
;
75 protected GetUniqueNoService getUniqueNoService
;
78 protected BankCardManager bankCardManager
;
81 protected UserManager userManager
;
84 protected UserInfoManager userInfoManager
;
87 protected SmsRecordManager smsRecordManager
;
89 @Value("${service-tel}")
90 protected String serviceTel
;
94 public Repayment
processOverdue(Repayment repayment
)
98 Utils
.betweenDays(repayment
.getRepaymentTime(), Utils
.now());
100 if (overdueDays
<= 0)
103 double overdueRate
= optionManager
.getDoubleValue(
104 OptionName
.OVERDUERATE
, 0.005);
105 double overdueRate2
= optionManager
.getDoubleValue(
106 OptionName
.OVERDUERATE2
, 0.01);
107 long overdueDaysLimit
= optionManager
.getLongValue(
108 OptionName
.OVERDUEDAYS
, 30l);
111 repayment
.getInterest().add(repayment
.getCapital());
113 repayment
.setOverDueDays(overdueDays
);
115 long overdueDays1
= 0, overdueDays2
= 0;
117 if (overdueDays
> overdueDaysLimit
)
119 overdueDays1
= overdueDaysLimit
;
120 overdueDays2
= overdueDays
- overdueDaysLimit
;
123 overdueDays1
= overdueDays
;
127 BigDecimal overDueAmount1
= total
128 .multiply(new BigDecimal(overdueRate
))
129 .multiply(new BigDecimal(overdueDays1
));
131 BigDecimal overDueAmount2
= total
132 .multiply(new BigDecimal(overdueRate
))
133 .multiply(new BigDecimal(overdueDays2
));
135 BigDecimal overDueAmount
=
136 overDueAmount1
.add(overDueAmount2
)
137 .setScale(2, RoundingMode
.HALF_UP
);
139 repayment
.setOverDueAmount(overDueAmount
);
141 repayment
.setPrincipal(
142 overDueAmount
.add(total
).add(
143 repayment
.getOverDuePunishScore() != null?
144 repayment
.getOverDuePunishScore():
147 repayment
.setStatus(Repayment
.Status
.overDue
.getCode());
149 repaymentManager
.save(repayment
);
156 public LoanProduct
processCancelProduct(LoanProduct loanProduct
)
158 loanProduct
.setStatus(LoanProduct
.Status
.cancel
.getCode());
160 loanProductManager
.save(loanProduct
);
167 public TenderRecord
returnTender(TenderRecord tender
)
169 if (TenderRecord
.TradeStatus
.success
!=
170 TenderRecord
.TradeStatus
.valueOf(tender
.getStatus()))
176 HostingRefundRequest request
= new HostingRefundRequest();
178 request
.setReason(HostingRefundRequest
.Reason
.cancelMark
);
179 request
.setAccountId(tender
.getAccountNo());
181 (long) (tender
.getAmount().doubleValue() * 100));
182 request
.setOrgiTradeNo(tender
.getResponseNo());
184 HostingRefundResponse response
=
185 payService
.hostingRefund(request
);
186 if (!response
.isOk())
190 tender
.setStatus(TenderRecord
.TradeStatus
.cancel
.getCode());
191 tender
.setTransTime(Utils
.now());
193 tenderRecordManager
.save(tender
);
200 public PublicOrder
processPublicOrder(PublicOrder order
)
202 if (StringUtil
.isBlank(order
.getBussType()))
205 Integer bussType
= Integer
.parseInt(order
.getBussType());
207 log
.info(String
.format("public order: %d %s",
208 bussType
, order
.getBussDesc()));
210 if (PublicOrder
.BussType
.recharge
.getCode() == bussType
)
212 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
214 publicOrderManager
.save(order
);
216 if (PublicOrder
.BussType
.withdraw
.getCode() == bussType
)
218 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
220 publicOrderManager
.save(order
);
222 if (PublicOrder
.BussType
.other
.getCode() == bussType
)
224 if ("redirect.modifyCard".equals(order
.getBussDesc()))
226 Map
<String
, String
> params
=
227 new MapBuilder
<String
, String
>()
228 .append("mchnt_cd", payService
.getMerchantId())
229 .append("mchnt_txn_ssn", getUniqueNoService
.getCommTransFlow())
230 .append("login_id", order
.getCustNo())
231 .append("txn_ssn", order
.getFlowNo())
234 params
.put("signature", payService
.signature(new String
[] {
235 params
.get("login_id"),
236 params
.get("mchnt_cd"),
237 params
.get("mchnt_txn_ssn"),
238 params
.get("txn_ssn")
241 String url
= payService
.getUrl("/jzh/queryChangeCard.action");
245 String result
= HttpHelper
.sendGet(url
, params
);
247 ChangeCardResponse response
=
248 JaxbHelper
.convert(result
, ChangeCardResponse
.class);
250 ChangeCardResponse
.Plain plain
= response
.getPlain();
252 if (plain
.getExamine_st().equals("1"))
254 order
.setStatus(PublicOrder
.Status
.success
.getCode());
256 bankCardManager
.updateBankCard(
258 plain
.getBank_nm(), plain
.getCard_no());
260 if (response
.getPlain().getExamine_st().equals("2"))
262 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
265 publicOrderManager
.save(order
);
268 log
.error("error", e
);
272 if ("redirect.modifyPassword".equals(order
.getBussDesc()))
274 order
.setStatus(PublicOrder
.Status
.success
.getCode());
276 publicOrderManager
.save(order
);
278 if ("redirect.modifyPhone".equals(order
.getBussDesc()))
280 order
.setStatus(PublicOrder
.Status
.success
.getCode());
282 publicOrderManager
.save(order
);
290 public Repayment
sendSmsRepayment(Repayment repayment
)
292 SimpleDateFormat format
= new SimpleDateFormat("yyyy-MM-dd");
294 User user
= userManager
.findByCustNo(repayment
.getCustNo());
296 userInfoManager
.findByCustNo(repayment
.getCustNo());
298 if (repayment
.getStatus() ==
299 Repayment
.Status
.overDue
.getCode())
301 smsRecordManager
.sendSms(
302 MessageType
.REPAY3
, user
.getMobile(),
303 new MapBuilder
<String
, Object
>()
304 .append("#name#", userInfo
.getRealName())
305 .append("#total#", repayment
.getPrincipal())
306 .append("#repaymentAmount#",
307 repayment
.getCapital().add(repayment
.getInterest()))
308 .append("#overdueDays#", repayment
.getOverDueDays())
309 .append("#overdueFee#", repayment
.getOverDueAmount())
310 .append("#telephone#", serviceTel
)
313 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
314 //已逾期#overdueDays#天,逾期罚息共#overdueFee#元,
315 //请您积极筹措资金,尽快归还。如有疑问请你致电#telephone#
320 repayment
.getRepaymentTime(), Utils
.now());
322 if (days
== 7 || days
== 3)
324 smsRecordManager
.sendSms(
325 MessageType
.REPAY1
, user
.getMobile(),
326 new MapBuilder
<String
, Object
>()
327 .append("#name#", userInfo
.getRealName())
328 .append("#repaymentAmount#",
329 repayment
.getCapital().add(repayment
.getInterest()))
330 .append("#repaymentDate#",
331 format
.format(repayment
.getRepaymentTime()))
332 .append("#day#", days
)
333 .append("#telephone#", serviceTel
)
336 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
337 //距离还款日#repaymentDate#还有#day#天,请您及时还款,
338 //以免发生逾期,如有疑问请你致电#telephone#
342 smsRecordManager
.sendSms(
343 MessageType
.REPAY2
, user
.getMobile(),
344 new MapBuilder
<String
, Object
>()
345 .append("#name#", userInfo
.getRealName())
346 .append("#repaymentAmount#",
347 repayment
.getCapital().add(repayment
.getInterest()))
348 .append("#telephone#", serviceTel
)
351 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
352 //请您本日24点之前还款完成,以免发生逾期,
353 //如有疑问请你致电#telephone#