OrderDunTask.java 14 KB

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