.
[baibao-modules.git] / loan / loan-task / src / main / java / com / baibao / loan / task / service / impl / LoanTaskServiceImpl.java
bloba5a2819f16010e0ecbb9df084ebbaff5741217d2
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;
7 import java.util.Map;
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);
53 @Autowired
54 protected RepaymentManager repaymentManager;
56 @Autowired
57 protected ProfitManager profitManager;
59 @Autowired
60 protected OptionManager optionManager;
62 @Autowired
63 protected LoanProductManager loanProductManager;
65 @Autowired
66 protected TenderRecordManager tenderRecordManager;
68 @Autowired
69 protected PayService payService;
71 @Autowired
72 protected PublicOrderManager publicOrderManager;
74 @Autowired
75 protected GetUniqueNoService getUniqueNoService;
77 @Autowired
78 protected BankCardManager bankCardManager;
80 @Autowired
81 protected UserManager userManager;
83 @Autowired
84 protected UserInfoManager userInfoManager;
86 @Autowired
87 protected SmsRecordManager smsRecordManager;
89 @Value("${service-tel}")
90 protected String serviceTel;
92 @Override
93 @Transactional
94 public Repayment processOverdue(Repayment repayment)
96 long overdueDays =
97 Utils.betweenDays(repayment.getRepaymentTime(), Utils.now());
99 if (overdueDays <= 0)
100 return null;
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);
109 BigDecimal total =
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;
120 } else
122 overdueDays1 = overdueDays;
123 overdueDays2 = 0l;
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():
144 new BigDecimal(0)));
146 repayment.setStatus(Repayment.Status.overDue.getCode());
148 repaymentManager.save(repayment);
150 return repayment;
153 @Override
154 @Transactional
155 public LoanProduct processCancelProduct(LoanProduct loanProduct)
157 loanProduct.setStatus(LoanProduct.Status.cancel.getCode());
159 loanProductManager.save(loanProduct);
161 return loanProduct;
164 @Override
165 @Transactional
166 public TenderRecord returnTender(TenderRecord tender)
168 if (TenderRecord.TradeStatus.success !=
169 TenderRecord.TradeStatus.valueOf(tender.getStatus()))
170 return tender;
172 //todo: 记录
174 {//退款
175 HostingRefundRequest request = new HostingRefundRequest();
177 request.setReason(HostingRefundRequest.Reason.cancelMark);
178 request.setAccountId(tender.getAccountNo());
179 request.setAmount(
180 (long) (tender.getAmount().doubleValue() * 100));
181 request.setOrgiTradeNo(tender.getResponseNo());
183 HostingRefundResponse response =
184 payService.hostingRefund(request);
185 if (!response.isOk())
186 return tender;
189 tender.setStatus(TenderRecord.TradeStatus.cancel.getCode());
190 tender.setTransTime(Utils.now());
192 tenderRecordManager.save(tender);
194 return tender;
197 @Override
198 @Transactional
199 public PublicOrder processPublicOrder(PublicOrder order)
201 if (StringUtil.isBlank(order.getBussType()))
202 return order;
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);
214 } else
215 if (PublicOrder.BussType.withdraw.getCode() == bussType)
217 order.setStatus(PublicOrder.Status.failed.getCode());
219 publicOrderManager.save(order);
220 } else
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())
231 .toMap();
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")
238 }));
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(
256 plain.getLogin_id(),
257 plain.getBank_nm(), plain.getCard_no());
258 } else
259 if (response.getPlain().getExamine_st().equals("2"))
261 order.setStatus(PublicOrder.Status.failed.getCode());
264 publicOrderManager.save(order);
265 } catch(Exception e)
267 log.error("error", e);
270 } else
271 if ("redirect.modifyPassword".equals(order.getBussDesc()))
273 order.setStatus(PublicOrder.Status.success.getCode());
275 publicOrderManager.save(order);
276 } else
277 if ("redirect.modifyPhone".equals(order.getBussDesc()))
279 order.setStatus(PublicOrder.Status.success.getCode());
281 publicOrderManager.save(order);
285 return null;
288 @Override
289 public Repayment sendSmsRepayment(Repayment repayment)
291 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
293 User user = userManager.findByCustNo(repayment.getCustNo());
294 UserInfo userInfo =
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)
310 .toMap());
312 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
313 //已逾期#overdueDays#天,逾期罚息共#overdueFee#元,
314 //请您积极筹措资金,尽快归还。如有疑问请你致电#telephone#
315 } else
317 int days =
318 Utils.betweenDays(
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)
333 .toMap());
335 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
336 //距离还款日#repaymentDate#还有#day#天,请您及时还款,
337 //以免发生逾期,如有疑问请你致电#telephone#
338 } else
339 if (days == 0)
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)
348 .toMap());
350 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
351 //请您本日24点之前还款完成,以免发生逾期,
352 //如有疑问请你致电#telephone#
356 return repayment;