.
[baibao-modules.git] / loan / loan-task / src / main / java / com / baibao / loan / task / service / impl / LoanTaskServiceImpl.java
blobe94cb6fa656eadb80a42684d4217b13cb7f1b449
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 //TODO 罚息算法还没定
97 long overdueDays =
98 Utils.betweenDays(repayment.getRepaymentTime(), Utils.now());
100 if (overdueDays <= 0)
101 return null;
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);
110 BigDecimal total =
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;
121 } else
123 overdueDays1 = overdueDays;
124 overdueDays2 = 0l;
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():
145 new BigDecimal(0)));
147 repayment.setStatus(Repayment.Status.overDue.getCode());
149 repaymentManager.save(repayment);
151 return repayment;
154 @Override
155 @Transactional
156 public LoanProduct processCancelProduct(LoanProduct loanProduct)
158 loanProduct.setStatus(LoanProduct.Status.cancel.getCode());
160 loanProductManager.save(loanProduct);
162 return loanProduct;
165 @Override
166 @Transactional
167 public TenderRecord returnTender(TenderRecord tender)
169 if (TenderRecord.TradeStatus.success !=
170 TenderRecord.TradeStatus.valueOf(tender.getStatus()))
171 return tender;
173 //todo: 记录
175 {//退款
176 HostingRefundRequest request = new HostingRefundRequest();
178 request.setReason(HostingRefundRequest.Reason.cancelMark);
179 request.setAccountId(tender.getAccountNo());
180 request.setAmount(
181 (long) (tender.getAmount().doubleValue() * 100));
182 request.setOrgiTradeNo(tender.getResponseNo());
184 HostingRefundResponse response =
185 payService.hostingRefund(request);
186 if (!response.isOk())
187 return tender;
190 tender.setStatus(TenderRecord.TradeStatus.cancel.getCode());
191 tender.setTransTime(Utils.now());
193 tenderRecordManager.save(tender);
195 return tender;
198 @Override
199 @Transactional
200 public PublicOrder processPublicOrder(PublicOrder order)
202 if (StringUtil.isBlank(order.getBussType()))
203 return order;
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);
215 } else
216 if (PublicOrder.BussType.withdraw.getCode() == bussType)
218 order.setStatus(PublicOrder.Status.failed.getCode());
220 publicOrderManager.save(order);
221 } else
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())
232 .toMap();
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")
239 }));
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(
257 plain.getLogin_id(),
258 plain.getBank_nm(), plain.getCard_no());
259 } else
260 if (response.getPlain().getExamine_st().equals("2"))
262 order.setStatus(PublicOrder.Status.failed.getCode());
265 publicOrderManager.save(order);
266 } catch(Exception e)
268 log.error("error", e);
271 } else
272 if ("redirect.modifyPassword".equals(order.getBussDesc()))
274 order.setStatus(PublicOrder.Status.success.getCode());
276 publicOrderManager.save(order);
277 } else
278 if ("redirect.modifyPhone".equals(order.getBussDesc()))
280 order.setStatus(PublicOrder.Status.success.getCode());
282 publicOrderManager.save(order);
286 return null;
289 @Override
290 public Repayment sendSmsRepayment(Repayment repayment)
292 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
294 User user = userManager.findByCustNo(repayment.getCustNo());
295 UserInfo userInfo =
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)
311 .toMap());
313 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
314 //已逾期#overdueDays#天,逾期罚息共#overdueFee#元,
315 //请您积极筹措资金,尽快归还。如有疑问请你致电#telephone#
316 } else
318 int days =
319 Utils.betweenDays(
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)
334 .toMap());
336 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
337 //距离还款日#repaymentDate#还有#day#天,请您及时还款,
338 //以免发生逾期,如有疑问请你致电#telephone#
339 } else
340 if (days == 0)
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)
349 .toMap());
351 //【佰宝金服】亲爱的用户#name#,您在佰宝金服本期应还款#repaymentAmount#元,
352 //请您本日24点之前还款完成,以免发生逾期,
353 //如有疑问请你致电#telephone#
357 return repayment;