OrderDunTask.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. package com.goafanti.common.task;
  2. import java.io.UnsupportedEncodingException;
  3. import java.math.BigDecimal;
  4. import java.util.*;
  5. import javax.mail.MessagingException;
  6. import com.goafanti.common.bo.ErrorDunListBo;
  7. import com.goafanti.order.bo.*;
  8. import com.goafanti.order.service.LegalAffairsService;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.scheduling.annotation.Scheduled;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestMethod;
  19. import org.springframework.web.bind.annotation.ResponseBody;
  20. import com.goafanti.common.bo.EmailBo;
  21. import com.goafanti.common.constant.AFTConstants;
  22. import com.goafanti.common.dao.PaymentNodeMapper;
  23. import com.goafanti.common.dao.TArrearsDunMapper;
  24. import com.goafanti.common.dao.TOrderMidMapper;
  25. import com.goafanti.common.dao.TOrderNewMapper;
  26. import com.goafanti.common.enums.NoticeStatus;
  27. import com.goafanti.common.model.Notice;
  28. import com.goafanti.common.model.PaymentNode;
  29. import com.goafanti.common.model.TArrearsDun;
  30. import com.goafanti.common.model.TOrderDun;
  31. import com.goafanti.common.model.TOrderMid;
  32. import com.goafanti.common.model.TOrderNew;
  33. import com.goafanti.common.utils.AsyncUtils;
  34. import com.goafanti.common.utils.LoggerUtils;
  35. import com.goafanti.order.enums.OrderDunProjectType;
  36. import com.goafanti.order.service.NewOrderDunService;
  37. import com.goafanti.order.service.OrderNewService;
  38. import com.goafanti.order.service.OrderProjectService;
  39. import com.goafanti.organization.bo.OutPaymentNode;
  40. @Component
  41. @Controller
  42. public class OrderDunTask {
  43. @Autowired
  44. private OrderNewService orderNewService;
  45. @Autowired
  46. private NewOrderDunService newOrderDunService;
  47. @Autowired
  48. private TOrderNewMapper tOrderNewMapper;
  49. @Autowired
  50. private TArrearsDunMapper tArrearsDunMapper;
  51. @Autowired
  52. private TOrderMidMapper tOrderMidMapper;
  53. @Autowired
  54. private PaymentNodeMapper paymentNodeMapper;
  55. @Autowired
  56. private OrderProjectService orderProjectService;
  57. @Autowired
  58. private LegalAffairsService legalAffairsService;
  59. @Value(value = "${dev.name}")
  60. private String devName=null;
  61. @Autowired
  62. private AsyncUtils asyncUtils;
  63. Logger logger = LoggerFactory.getLogger(OrderDunTask.class);
  64. /**
  65. * 每天凌晨3点轮
  66. */
  67. // @ResponseBody
  68. // @Scheduled(cron = "0 0 3 * * ?")
  69. // @RequestMapping(value = "/open/test", method = RequestMethod.GET)
  70. @Scheduled(cron = "0 0 11 * * ?")
  71. @Transactional(rollbackFor=Exception.class)
  72. public void startTask() throws InterruptedException {
  73. updateNewOrderDun();
  74. Thread.sleep(2000);
  75. updatePaymentNode();
  76. Thread.sleep(2000);
  77. pushLegalAffairs();
  78. }
  79. /**
  80. * 法务订单催款处理
  81. */
  82. @RequestMapping(value = "/open/pushLegalAffairs", method = RequestMethod.GET)
  83. public void pushLegalAffairs() {
  84. InputOrderListBo in = new InputOrderListBo();
  85. in.setType(0);
  86. in.setLegalAffairs(0);
  87. List<OutOrderLegalAffairsListBo> list=legalAffairsService.getLegalAffairsOrder(in);
  88. ArrayList<String> addList = new ArrayList<>();
  89. Date now=new Date();
  90. for (OutOrderLegalAffairsListBo out : list) {
  91. Long l=out.getDunStartTime().getTime()+AFTConstants.DUN_START_LIMIT_MS;
  92. if (l<now.getTime()){
  93. addList.add(out.getOrderNo());
  94. }
  95. }
  96. List<String> addList2=new ArrayList<>();
  97. if (!addList.isEmpty())
  98. for (int i=0;i<addList.size();i++){
  99. addList2.add(addList.get(i));
  100. if (50 == addList2.size() || i == addList.size() - 1){
  101. tOrderMidMapper.updateByList(addList2);
  102. legalAffairsService.addLagalAffairsLogList(addList2);
  103. addList2.clear();
  104. }
  105. }
  106. }
  107. /**
  108. * 询处理需要新催款的信息
  109. */
  110. @RequestMapping(value = "/open/updateNewOrderDun", method = RequestMethod.GET)
  111. public void updateNewOrderDun(){
  112. try {
  113. LoggerUtils.debug(logger, "======================新催款任务轮询启动===================");
  114. List<OutNewOrderDunBo> list= newOrderDunService.selectAllOrderDun();
  115. Calendar now=Calendar.getInstance();
  116. Calendar now2=Calendar.getInstance();
  117. Date date =new Date();
  118. for (OutNewOrderDunBo o : list) {
  119. now.setTime(date);
  120. now2.setTime(o.getCreateTime());
  121. //计算特批首期款 特批通过 为催款为首期款 催款时间不为空则计算触发
  122. if (o.getApproval()!=null&& o.getApproval()==2&& o.getDunType()==1&&o.getWaitDay()!=null) {
  123. now2.add(Calendar.DATE, o.getWaitDay());
  124. updateOrderDun(o,now,now2);
  125. //会员-期限计算
  126. }else if(o.getProjectType().equals(OrderDunProjectType.HY.getCode())&&o.getDunType()==2) {
  127. now2.add(Calendar.DATE, o.getEffectiveCount()*180);
  128. CalendarTimeCleared(now2);
  129. updateOrderDun(o,now,now2);
  130. //财税-期限 计算时间
  131. } else if(o.getProjectType().equals(OrderDunProjectType.CS.getCode())&&o.getDunType()==2) {
  132. //获取年
  133. int year = now2.get(Calendar.YEAR);
  134. //获取月份,0表示1月份
  135. int month = now2.get(Calendar.MONTH) + 1;
  136. if(month<10)year=year+1;
  137. if(month>9)year=year+2;
  138. now2.set(year, 5, 1);
  139. CalendarTimeCleared(now2);
  140. updateOrderDun(o,now,now2);
  141. //自定义 超过设置的时间则触发
  142. }else if (o.getDunType()==0) {
  143. now2.setTime(o.getCustomizeTime());
  144. CalendarTimeCleared(now);
  145. updateOrderDun(o,now,now2);
  146. }
  147. }
  148. // calibrationDun();
  149. } catch (Exception e) {
  150. EmailBo emailBo = new EmailBo( "催款处理失败", AFTConstants.ADMIN_EMAIL, "超管", "平台", "系统", devName+"催款处理失败");
  151. asyncUtils.send(emailBo);
  152. LoggerUtils.error(getClass(), "===================新催款的信息处理失败======================", e);
  153. }
  154. }
  155. /**
  156. * 如果有不对的数据就校准数据
  157. */
  158. private void calibrationDun() {
  159. List<ErrorDunListBo> el = tOrderMidMapper.selectErrorDun();
  160. if (!el.isEmpty()){
  161. StringBuffer sb=new StringBuffer();
  162. for (ErrorDunListBo e : el) {
  163. sb.append(e.toString());
  164. }
  165. EmailBo emailBo=new EmailBo("催款异常核对",AFTConstants.ADMIN_EMAIL,sb.toString());
  166. asyncUtils.send(emailBo);
  167. tOrderMidMapper.updateErrorDun();
  168. }
  169. }
  170. /**
  171. * 处理付款催款
  172. */
  173. private void updatePaymentNode() {
  174. LoggerUtils.debug(logger, "======================催款任务结束,付款催款开始===================");
  175. Calendar now=Calendar.getInstance();
  176. Calendar now2=Calendar.getInstance();
  177. try {
  178. List<OutPaymentNode> list2=paymentNodeMapper.selectByStatus(0);
  179. for (OutPaymentNode pn : list2) {
  180. now2.setTime(pn.getCreateTime());
  181. if(pn.getProjectType().equals(OrderDunProjectType.HY.getCode())&&pn.getDunType()==2) {
  182. now2.add(Calendar.DATE, pn.getEffectiveCount()*180);
  183. CalendarTimeCleared(now2);
  184. }else if(pn.getProjectType().equals(OrderDunProjectType.CS.getCode())&&pn.getDunType()==2) {
  185. // 获取年
  186. int year = now2.get(Calendar.YEAR);
  187. //获取月份,0表示1月份
  188. int month = now2.get(Calendar.MONTH) + 1;
  189. if(month<10)year=year+1;
  190. if(month>9)year=year+2;
  191. now2.set(year, 5, 1);
  192. CalendarTimeCleared(now2);
  193. }else if (pn.getDunType()==0) {
  194. now2.setTime(pn.getPartyTime());
  195. CalendarTimeCleared(now);
  196. }
  197. if (now.getTimeInMillis() > now2.getTimeInMillis()) {//当前时间大于计算后时间则触发
  198. updatePaymentNode(pn);
  199. Thread.sleep(1000);
  200. }
  201. }
  202. } catch (InterruptedException e) {
  203. LoggerUtils.error(getClass(), "===========================付款催款失败==========================", e);
  204. }
  205. }
  206. /**
  207. * 每月1号凌晨4点轮询处理需要欠款催款的信息
  208. *
  209. */
  210. @Scheduled(cron = "0 0 4 1 * ?")
  211. @RequestMapping(value = "/open/pushOrderArrearsDun", method = RequestMethod.GET)
  212. public void pushOrderArrearsDun(){
  213. try {
  214. LoggerUtils.debug(logger, "======================欠款催款启动===================");
  215. Date date=new Date();
  216. //运算 list(未启动) list2(催款中) list3(已完成)订单的欠款催款
  217. List<TArrearsDun> list=tArrearsDunMapper.selectStatusAll(0);
  218. List<TArrearsDun> list2=tArrearsDunMapper.selectStatusAll(1);
  219. List<TArrearsDun> list3=tArrearsDunMapper.selectStatusAndAmount(2);
  220. for (TArrearsDun td : list) {
  221. TOrderMid tm=tOrderMidMapper.selectByOrderNo(td.getOrderNo());
  222. //如果欠款大于0则需要触发邮件
  223. System.out.println(tm.toString());
  224. System.out.println(tm.getOrderArrears());
  225. if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
  226. td.setDunStatus(1);
  227. td.setStartTime(date);
  228. td.setOrderArrears(tm.getOrderArrears());
  229. td.setOrderReceivables(tm.getOrderReceivables());
  230. addNotic(td.getOrderNo(),td,NoticeStatus.ORDER_ARREARS_DUN.getCode());
  231. tArrearsDunMapper.updateByPrimaryKeySelective(td);
  232. }else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
  233. td.setDunStatus(2);
  234. td.setEndTime(date);
  235. td.setOrderArrears(tm.getOrderArrears());
  236. tArrearsDunMapper.updateByPrimaryKeySelective(td);
  237. }
  238. Thread.sleep(2000);
  239. }
  240. for (TArrearsDun ta : list2) {
  241. TOrderMid tm=tOrderMidMapper.selectByOrderNo(ta.getOrderNo());
  242. //如果欠款大于0则需要触发邮件
  243. if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
  244. ta.setDunStatus(3);
  245. tArrearsDunMapper.updateByPrimaryKeySelective(ta);
  246. ta.setId(null);
  247. ta.setDunStatus(1);
  248. ta.setStartTime(date);
  249. ta.setOrderArrears(tm.getOrderArrears());
  250. ta.setOrderReceivables(tm.getOrderReceivables());
  251. tArrearsDunMapper.insertSelective(ta);
  252. addNotic(ta.getOrderNo(),ta,NoticeStatus.ORDER_ARREARS_DUN.getCode());
  253. }else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
  254. ta.setDunStatus(2);
  255. ta.setOrderArrears(tm.getOrderArrears());
  256. tArrearsDunMapper.updateByPrimaryKeySelective(ta);
  257. }
  258. Thread.sleep(2000);
  259. }
  260. for (TArrearsDun ta : list3) {
  261. TOrderMid tm=tOrderMidMapper.selectByOrderNo(ta.getOrderNo());
  262. //如果欠款大于0则需要触发邮件
  263. if (tm.getOrderArrears().compareTo(new BigDecimal(0))>0) {
  264. ta.setDunStatus(3);
  265. tArrearsDunMapper.updateByPrimaryKeySelective(ta);
  266. ta.setId(null);
  267. ta.setDunStatus(1);
  268. ta.setStartTime(date);
  269. ta.setOrderArrears(tm.getOrderArrears());
  270. ta.setOrderReceivables(tm.getOrderReceivables());
  271. tArrearsDunMapper.insertSelective(ta);
  272. addNotic(ta.getOrderNo(),ta,NoticeStatus.ORDER_ARREARS_DUN.getCode());
  273. }else if(tm.getOrderArrears().compareTo(new BigDecimal(0))<1) {
  274. ta.setDunStatus(2);
  275. ta.setOrderReceivables(tm.getOrderReceivables());
  276. ta.setOrderArrears(tm.getOrderArrears());
  277. tArrearsDunMapper.updateByPrimaryKeySelective(ta);
  278. }
  279. Thread.sleep(2000);
  280. }
  281. } catch (Exception e) {
  282. LoggerUtils.error(getClass(), "===========================欠款催款失败==========================", e);
  283. }
  284. }
  285. // /**
  286. // * 旧催款处理
  287. // *
  288. // */
  289. // public void updateorderDun(){
  290. // try {
  291. // LoggerUtils.debug(logger, "======================催款任务轮询启动===================");
  292. // List<OrderDunTaskBo> list=orderNewService.selectAllOrderDun();
  293. // for (OrderDunTaskBo t : list) {
  294. // if (t.getDunSubject()/10==1) {//1则为订单催款信息否则为项目催款信息
  295. // if (t.getDunSubject()%10==t.getOrderStatus()&&t.getSettlementAmount().compareTo(t.getMoney()) == -1) {
  296. // updateOrderDun(t);
  297. // Thread.sleep(2000);
  298. // }
  299. // }else {
  300. // if (t.getDunSubject()%10>=t.getProjectStatus()&&t.getSettlementAmount().compareTo(t.getMoney()) == -1) {
  301. // updateOrderDun(t);
  302. // Thread.sleep(2000);
  303. // }
  304. // }
  305. // }
  306. // } catch (Exception e) {
  307. // LoggerUtils.error(getClass(), "==========================催款的信息处理失败==========================", e);
  308. // }
  309. //
  310. // }
  311. private void updatePaymentNode(OutPaymentNode pn) {
  312. PaymentNode p=new PaymentNode();
  313. p.setId(pn.getId());
  314. p.setDunStatus(1);
  315. p.setStartTime(new Date());
  316. paymentNodeMapper.updateByPrimaryKeySelective(p);
  317. orderProjectService.addNoticAndEmail(pn,NoticeStatus.PAYMENT_DUN.getCode());
  318. }
  319. private void CalendarTimeCleared(Calendar now) {
  320. now.set(Calendar.HOUR_OF_DAY, 0);
  321. now.set(Calendar.MINUTE, 0);
  322. now.set(Calendar.SECOND, 0);
  323. now.set(Calendar.MILLISECOND, 0);
  324. }
  325. /**
  326. * 定时催款触发
  327. * 如果当前时间大于等于触发时间才触发流程
  328. * @param t
  329. * @param now 当前时间
  330. * @param now2 触发时间
  331. */
  332. private void updateOrderDun(OutNewOrderDunBo t,Calendar now,Calendar now2) {
  333. if (now.getTimeInMillis() >= now2.getTimeInMillis()) {
  334. InputNewOrderDunBo o=new InputNewOrderDunBo();
  335. TOrderNew orderNew=tOrderNewMapper.selectByPrimaryKey(t.getOrderNo());
  336. Date date = new Date();
  337. o.setId(t.getId());
  338. o.setStatus(1);
  339. o.setStartTime(date);
  340. if (t.getMoney()==null)t.setMoney(new BigDecimal(0));
  341. newOrderDunService.updateDun(o);
  342. TOrderMid tm=orderNewService.pushOrderMidDun(t.getOrderNo(),orderNew.getSettlementAmount(),date,t);
  343. TArrearsDun td=new TArrearsDun();
  344. td.setOrderArrears(tm.getOrderArrears());
  345. td.setOrderReceivables(tm.getOrderReceivables());
  346. if (tArrearsDunMapper.checkOrderNo(t.getOrderNo(),null)<1) {
  347. td.setOrderNo(t.getOrderNo());
  348. tArrearsDunMapper.insertSelective(td);
  349. }else if(tArrearsDunMapper.checkOrderNo(t.getOrderNo(),0)>0){
  350. Integer i=tArrearsDunMapper.selectByStatus(t.getOrderNo(), 0);
  351. td.setId(i);
  352. tArrearsDunMapper.updateByPrimaryKeySelective(td);
  353. }
  354. orderNewService.addTimingTaskNewDunNoticAndSendEmail(orderNew, t);
  355. try {
  356. Thread.sleep(2000);
  357. } catch (InterruptedException e) {
  358. e.printStackTrace();
  359. }
  360. }
  361. }
  362. private void addNotic(String orderNo, TArrearsDun td, Integer code) {
  363. TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(orderNo);
  364. StringBuffer str =new StringBuffer().append(b.getUserName()).append(", 合同编号-").append(b.getContractNo())
  365. .append(", 订单编号-").append(orderNo).append(", 操作人: ").append(b.getSalesmanName()).append("。");
  366. Notice n =new Notice();
  367. n.setId(UUID.randomUUID().toString());
  368. n.setAid(b.getSalesmanId());
  369. n.setNoticeType(code);
  370. n.setContent(str.toString());
  371. n.setReaded(0);//未读
  372. asyncUtils.addNotice(n);
  373. }
  374. private void updateOrderDun(OrderDunTaskBo t) throws UnsupportedEncodingException, MessagingException {
  375. LoggerUtils.debug(logger, "======================修改催款任务===================");
  376. TOrderDun tDun=new TOrderDun();
  377. tDun.setId(t.getId());
  378. tDun.setDunStatus(1);
  379. tDun.setStartTime(new Date());
  380. orderNewService.updateOrderDun(tDun);
  381. orderNewService.addNoticAndSendEmail(t.getOrderNo(),t,NoticeStatus.ORDER_DUN.getCode());
  382. }
  383. }