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
)
97 Utils
.betweenDays(repayment
.getRepaymentTime(), Utils
.now());
102 double overdueRate
= optionManager
.getDoubleValue(
103 OptionName
.OVERDUERATE
, 0.005);
104 double overdueRate2
= optionManager
.getDoubleValue(
105 OptionName
.OVERDUERATE2
, 0.01);
106 long overdueDaysLimit
= optionManager
.getLongValue(
107 OptionName
.OVERDUEDAYS
, 30l);
110 repayment
.getInterest().add(repayment
.getCapital());
112 repayment
.setOverDueDays(overdueDays
);
114 long overdueDays1
= 0, overdueDays2
= 0;
116 if (overdueDays
> overdueDaysLimit
)
118 overdueDays1
= overdueDaysLimit
;
119 overdueDays2
= overdueDays
- overdueDaysLimit
;
122 overdueDays1
= overdueDays
;
126 BigDecimal overDueAmount1
= total
127 .multiply(new BigDecimal(overdueRate
))
128 .multiply(new BigDecimal(overdueDays1
));
130 BigDecimal overDueAmount2
= total
131 .multiply(new BigDecimal(overdueRate2
))
132 .multiply(new BigDecimal(overdueDays2
));
134 BigDecimal overDueAmount
=
135 overDueAmount1
.add(overDueAmount2
)
136 .setScale(2, RoundingMode
.HALF_UP
);
138 repayment
.setOverDueAmount(overDueAmount
);
140 repayment
.setPrincipal(
141 overDueAmount
.add(total
).add(
142 repayment
.getOverDuePunishScore() != null?
143 repayment
.getOverDuePunishScore():
146 repayment
.setStatus(Repayment
.Status
.overDue
.getCode());
148 repaymentManager
.save(repayment
);
155 public LoanProduct
processCancelProduct(LoanProduct loanProduct
)
157 loanProduct
.setStatus(LoanProduct
.Status
.cancel
.getCode());
159 loanProductManager
.save(loanProduct
);
166 public TenderRecord
returnTender(TenderRecord tender
)
168 if (TenderRecord
.TradeStatus
.success
!=
169 TenderRecord
.TradeStatus
.valueOf(tender
.getStatus()))
175 HostingRefundRequest request
= new HostingRefundRequest();
177 request
.setReason(HostingRefundRequest
.Reason
.cancelMark
);
178 request
.setAccountId(tender
.getAccountNo());
180 (long) (tender
.getAmount().doubleValue() * 100));
181 request
.setOrgiTradeNo(tender
.getResponseNo());
183 HostingRefundResponse response
=
184 payService
.hostingRefund(request
);
185 if (!response
.isOk())
189 tender
.setStatus(TenderRecord
.TradeStatus
.cancel
.getCode());
190 tender
.setTransTime(Utils
.now());
192 tenderRecordManager
.save(tender
);
199 public PublicOrder
processPublicOrder(PublicOrder order
)
201 if (StringUtil
.isBlank(order
.getBussType()))
204 Integer bussType
= Integer
.parseInt(order
.getBussType());
206 log
.info(String
.format("public order: %d %s",
207 bussType
, order
.getBussDesc()));
209 if (PublicOrder
.BussType
.recharge
.getCode() == bussType
)
211 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
213 publicOrderManager
.save(order
);
215 if (PublicOrder
.BussType
.withdraw
.getCode() == bussType
)
217 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
219 publicOrderManager
.save(order
);
221 if (PublicOrder
.BussType
.other
.getCode() == bussType
)
223 if ("redirect.modifyCard".equals(order
.getBussDesc()))
225 Map
<String
, String
> params
=
226 new MapBuilder
<String
, String
>()
227 .append("mchnt_cd", payService
.getMerchantId())
228 .append("mchnt_txn_ssn", getUniqueNoService
.getCommTransFlow())
229 .append("login_id", order
.getCustNo())
230 .append("txn_ssn", order
.getFlowNo())
233 params
.put("signature", payService
.signature(new String
[] {
234 params
.get("login_id"),
235 params
.get("mchnt_cd"),
236 params
.get("mchnt_txn_ssn"),
237 params
.get("txn_ssn")
240 String url
= payService
.getUrl("/jzh/queryChangeCard.action");
244 String result
= HttpHelper
.sendGet(url
, params
);
246 ChangeCardResponse response
=
247 JaxbHelper
.convert(result
, ChangeCardResponse
.class);
249 ChangeCardResponse
.Plain plain
= response
.getPlain();
251 if (plain
.getExamine_st().equals("1"))
253 order
.setStatus(PublicOrder
.Status
.success
.getCode());
255 bankCardManager
.updateBankCard(
257 plain
.getBank_nm(), plain
.getCard_no());
259 if (response
.getPlain().getExamine_st().equals("2"))
261 order
.setStatus(PublicOrder
.Status
.failed
.getCode());
264 publicOrderManager
.save(order
);
267 log
.error("error", e
);
271 if ("redirect.modifyPassword".equals(order
.getBussDesc()))
273 order
.setStatus(PublicOrder
.Status
.success
.getCode());
275 publicOrderManager
.save(order
);
277 if ("redirect.modifyPhone".equals(order
.getBussDesc()))
279 order
.setStatus(PublicOrder
.Status
.success
.getCode());
281 publicOrderManager
.save(order
);
289 public Repayment
sendSmsRepayment(Repayment repayment
)
291 SimpleDateFormat format
= new SimpleDateFormat("yyyy-MM-dd");
293 User user
= userManager
.findByCustNo(repayment
.getCustNo());
295 userInfoManager
.findByCustNo(repayment
.getCustNo());
297 if (repayment
.getStatus() ==
298 Repayment
.Status
.overDue
.getCode())
300 smsRecordManager
.sendSms(
301 MessageType
.REPAY3
, user
.getMobile(),
302 new MapBuilder
<String
, Object
>()
303 .append("#name#", userInfo
.getRealName())
304 .append("#total#", repayment
.getPrincipal())
305 .append("#repaymentAmount#",
306 repayment
.getCapital().add(repayment
.getInterest()))
307 .append("#overdueDays#", repayment
.getOverDueDays())
308 .append("#overdueFee#", repayment
.getOverDueAmount())
309 .append("#telephone#", serviceTel
)
312 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
313 //已逾期#overdueDays#天,逾期罚息共#overdueFee#元,
314 //请您积极筹措资金,尽快归还。如有疑问请你致电#telephone#
319 repayment
.getRepaymentTime(), Utils
.now());
321 if (days
== 7 || days
== 3)
323 smsRecordManager
.sendSms(
324 MessageType
.REPAY1
, user
.getMobile(),
325 new MapBuilder
<String
, Object
>()
326 .append("#name#", userInfo
.getRealName())
327 .append("#repaymentAmount#",
328 repayment
.getCapital().add(repayment
.getInterest()))
329 .append("#repaymentDate#",
330 format
.format(repayment
.getRepaymentTime()))
331 .append("#day#", days
)
332 .append("#telephone#", serviceTel
)
335 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
336 //距离还款日#repaymentDate#还有#day#天,请您及时还款,
337 //以免发生逾期,如有疑问请你致电#telephone#
341 smsRecordManager
.sendSms(
342 MessageType
.REPAY2
, user
.getMobile(),
343 new MapBuilder
<String
, Object
>()
344 .append("#name#", userInfo
.getRealName())
345 .append("#repaymentAmount#",
346 repayment
.getCapital().add(repayment
.getInterest()))
347 .append("#telephone#", serviceTel
)
350 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
351 //请您本日24点之前还款完成,以免发生逾期,
352 //如有疑问请你致电#telephone#