ScheduleTask9.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. package com.malk.eastar.schedule;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.malk.eastar.service.AitableService;
  4. import com.malk.eastar.service.DDCoreClient;
  5. import com.malk.eastar.service.YidaService;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.scheduling.annotation.EnableScheduling;
  12. import org.springframework.scheduling.annotation.Scheduled;
  13. import java.text.SimpleDateFormat;
  14. import java.util.*;
  15. /**
  16. * 多系统数据计算定时任务
  17. */
  18. @Slf4j
  19. @Configuration
  20. @EnableScheduling
  21. @ConditionalOnProperty(name = {"enable.scheduling"})
  22. public class ScheduleTask9 {
  23. @Autowired
  24. private AitableService aitableService;
  25. @Autowired
  26. private YidaService yidaService;
  27. @Autowired
  28. private DDCoreClient ddCoreClient;
  29. /**
  30. * 计算新老客户
  31. */
  32. @Scheduled(cron = "0 45 6 * * ?")
  33. public void calculateNewOrOldCustomers() {
  34. log.info("计算新老客户开始");
  35. /*
  36. 查询确认收款数据
  37. */
  38. log.info("查询确认收款数据");
  39. List<Map> confirmedReceiptData = new ArrayList<>();
  40. try {
  41. confirmedReceiptData = yidaService.queryConfirmedReceiptData();
  42. log.info("确认收款记录数量="+confirmedReceiptData.size());
  43. } catch (Exception e) {
  44. log.error("查询确认收款数据异常",e);
  45. return;
  46. }
  47. /*
  48. 最近一年大货打款客户为老客户
  49. */
  50. Set<String> oldCustomerCodes = new HashSet<>();
  51. String customerCode;
  52. List<Map> subTableData;
  53. for (Map confirmedReceiptRecord : confirmedReceiptData){
  54. customerCode = (String) confirmedReceiptRecord.get("customerCode");
  55. subTableData = (List<Map>) confirmedReceiptRecord.get("subTableData");
  56. for (Map subTableRecord : subTableData){
  57. if(subTableRecord.get("customerCode") != null && customerCode.equals(subTableRecord.get("customerCode"))){
  58. //仅大货打款为老客户
  59. if("全款".equals(subTableRecord.get("receiptType"))
  60. || "大货定金".equals(subTableRecord.get("receiptType"))
  61. || "大货尾款".equals(subTableRecord.get("receiptType"))){
  62. oldCustomerCodes.add(customerCode);
  63. }
  64. }else{
  65. log.info("客户(主表)与客户(子表)不一致:"+confirmedReceiptRecord.get("processInstanceId"));
  66. }
  67. }
  68. }
  69. log.info("最近一年大货打款客户数量="+oldCustomerCodes.size());
  70. /*
  71. 查询(易思达)客户名册所有记录
  72. */
  73. log.info("查询(易思达)客户名册所有记录");
  74. List<Map> ltcCustomerData = new ArrayList<>();
  75. try {
  76. ltcCustomerData = yidaService.queryLtcAllCustomerData();
  77. } catch (Exception e) {
  78. log.error("查询(易思达)客户名册异常",e);
  79. return;
  80. }
  81. /*
  82. 更新老客户
  83. */
  84. String newOrOldFlag; //新老客户
  85. String formInstId;
  86. int count = 0;
  87. String customerAiTableId;
  88. Map syncLog;
  89. for (String oldCustomerCode : oldCustomerCodes){
  90. try {
  91. for (Map ltcCustomerRecord : ltcCustomerData){
  92. if(oldCustomerCode.equals(ltcCustomerRecord.get("customerCode"))){
  93. newOrOldFlag = ltcCustomerRecord.get("newOrOld").toString();
  94. if("新".equals(newOrOldFlag)){
  95. formInstId = ltcCustomerRecord.get("formInstId").toString();
  96. log.info("修改为老客户:"+ltcCustomerRecord.get("customerName").toString());
  97. yidaService.updateLtcCustomerNewOrOld(formInstId, "老");
  98. Thread.sleep(3000);
  99. syncLog = new HashMap();
  100. syncLog.put("logType","新老客户变更同步");
  101. customerAiTableId = ltcCustomerRecord.get("aiTableId").toString();
  102. syncLog.put("aiTableID",customerAiTableId);
  103. syncLog.put("newOrOld","老客户");
  104. log.info("数据同步日志:"+JSONObject.toJSONString(syncLog));
  105. yidaService.addSyncLog(syncLog);
  106. count++;
  107. }
  108. //已找到该客户
  109. break;
  110. }
  111. }
  112. } catch (Exception e) {
  113. log.error("修改为老客户异常",e);
  114. }
  115. }
  116. if (count == 0){
  117. log.info("没有需要修改为老客户的记录");
  118. }
  119. /*
  120. 筛选老客户标签的客户记录
  121. */
  122. log.info("筛选老客户标签的客户记录");
  123. List<Map> ltcCustomerDataFilter = new ArrayList<>();
  124. for (Map ltcCustomerRecord : ltcCustomerData){
  125. newOrOldFlag = ltcCustomerRecord.get("newOrOld").toString();
  126. if("老".equals(newOrOldFlag)){
  127. ltcCustomerDataFilter.add(ltcCustomerRecord);
  128. }
  129. }
  130. /*
  131. 查询项目总表售前台账数据
  132. */
  133. log.info("查询项目总表售前台账数据");
  134. List<Map> sys1SaleData = new ArrayList<>();
  135. try {
  136. sys1SaleData = aitableService.querySys1AllSaleData();
  137. log.info("项目总表售前台账记录数量="+sys1SaleData.size());
  138. } catch (Exception e) {
  139. log.error("查询所有项目总表售前台账数据异常",e);
  140. return;
  141. }
  142. /*
  143. 筛选实际成单日期在最近1年的记录
  144. */
  145. List<Map> sys1SaleDataFilter = new ArrayList<>();
  146. Long actualCloseDate; //实际成单日期
  147. Long beginTime = System.currentTimeMillis() - 31536000000L; //起始时间(一年前)
  148. Long endTime = System.currentTimeMillis(); //结束时间(当前时间)
  149. for (Map sys1SaleRecord : sys1SaleData){
  150. if(sys1SaleRecord.get("actualCloseDate") == null){
  151. continue;
  152. }
  153. actualCloseDate = Long.parseLong(sys1SaleRecord.get("actualCloseDate").toString());
  154. if(actualCloseDate >= beginTime && actualCloseDate < endTime){
  155. sys1SaleDataFilter.add(sys1SaleRecord);
  156. }
  157. }
  158. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  159. log.info("实际成单日期在"+sdf.format(new Date(beginTime))+"至"+sdf.format(new Date(endTime))+"的记录数量="+sys1SaleDataFilter.size());
  160. /*
  161. 最近1年有实际成单日期项目的关联客户以及有打款记录的客户保留老客户标识,其他客户更新为新客户标识
  162. */
  163. boolean isOrdered;
  164. count = 0;
  165. for (Map ltcCustomerRecord : ltcCustomerDataFilter){ //遍历老客户
  166. // System.out.println("老客户:" + ltcCustomerRecord.get("customerName").toString());
  167. customerCode = ltcCustomerRecord.get("customerCode").toString();
  168. if(oldCustomerCodes.contains(customerCode)){
  169. //有打款记录,保留老客户标识
  170. continue;
  171. }
  172. if(ltcCustomerRecord.get("aiTableId") == null){
  173. continue;
  174. }
  175. customerAiTableId = ltcCustomerRecord.get("aiTableId").toString();
  176. isOrdered = false;
  177. for (Map sys1SaleRecord : sys1SaleDataFilter){
  178. if(sys1SaleRecord.get("customerId") == null){
  179. continue;
  180. }
  181. if(customerAiTableId.equals(sys1SaleRecord.get("customerId"))){
  182. actualCloseDate = Long.parseLong(sys1SaleRecord.get("actualCloseDate").toString());
  183. // System.out.println("实际成单日期:" + sdf.format(new Date(actualCloseDate)));
  184. //有实际成单日期项目,保留老客户标识
  185. isOrdered = true;
  186. break;
  187. }
  188. }
  189. if(!isOrdered){
  190. try {
  191. formInstId = ltcCustomerRecord.get("formInstId").toString();
  192. //最近1年无实际成单日期项目,修改为新客户
  193. log.info("修改为新客户:" + ltcCustomerRecord.get("customerName").toString());
  194. yidaService.updateLtcCustomerNewOrOld(formInstId, "新");
  195. Thread.sleep(3000);
  196. syncLog = new HashMap();
  197. syncLog.put("logType","新老客户变更同步");
  198. customerAiTableId = ltcCustomerRecord.get("aiTableId").toString();
  199. syncLog.put("aiTableID",customerAiTableId);
  200. syncLog.put("newOrOld","新客户");
  201. yidaService.addSyncLog(syncLog);
  202. count++;
  203. } catch (Exception e) {
  204. log.error("修改为新客户异常",e);
  205. }
  206. }
  207. }
  208. if(count == 0){
  209. log.info("没有需要修改为新客户的记录");
  210. }
  211. log.info("计算新老客户结束");
  212. }
  213. /**
  214. * 计算业务员私海客户数量
  215. */
  216. @Scheduled(cron = "0 30 10,16 * * ?")
  217. public void calculateBusinessUserPrivateCustomerNum() {
  218. log.info("计算业务员私海客户数量开始");
  219. /*
  220. 查询易思达系统所有在职业务员档案
  221. */
  222. log.info("查询易思达系统所有在职业务员档案");
  223. List<Map> ltcBusinessUserData = new ArrayList<>();
  224. try {
  225. ltcBusinessUserData = yidaService.queryEmployedBusinessUserData();
  226. log.info("所有在职业务员档案数量="+ltcBusinessUserData.size());
  227. } catch (Exception e) {
  228. log.error("查询易思达系统所有在职业务员档案异常",e);
  229. return;
  230. }
  231. /*
  232. 1、获取userId列表和unionId列表
  233. 2、获取userId与formInstId映射
  234. 3、获取unionId与formInstId映射
  235. */
  236. List<String> userIdList = new ArrayList<>();
  237. List<String> unionIdList = new ArrayList<>();
  238. Map<String, String> userIdFormInstIdMap = new HashMap<>();
  239. Map<String, String> unionIdFormInstIdMap = new HashMap<>();
  240. String userId;
  241. String unionId;
  242. String formInstId;
  243. for(Map ltcBusinessUserRecord : ltcBusinessUserData){
  244. userId = "";
  245. unionId = "";
  246. formInstId = "";
  247. try {
  248. userId = ltcBusinessUserRecord.get("userId").toString();
  249. if(userId == null || StringUtils.isEmpty(userId)){
  250. System.out.println("userId为空!");
  251. continue;
  252. }
  253. unionId = ddCoreClient.getUnionIdByUserId(userId);
  254. if(unionId == null || StringUtils.isEmpty(unionId)){
  255. System.out.println("userId="+userId+",unionId为空!");
  256. continue;
  257. }
  258. userIdList.add(userId);
  259. unionIdList.add(unionId);
  260. formInstId = ltcBusinessUserRecord.get("formInstId").toString();
  261. userIdFormInstIdMap.put(userId, formInstId);
  262. unionIdFormInstIdMap.put(unionId, formInstId);
  263. } catch (Exception e) {
  264. System.out.println(userId);
  265. log.error("获取userId和unionId映射关系异常",e);
  266. return;
  267. }
  268. }
  269. /*
  270. 查询(易思达)客户名册所有记录
  271. */
  272. log.info("查询(易思达)客户名册所有记录");
  273. List<Map> ltcCustomerData = new ArrayList<>();
  274. try {
  275. ltcCustomerData = yidaService.queryLtcAllCustomerData();
  276. log.info("易思达系统客户数量="+ltcCustomerData.size());
  277. } catch (Exception e) {
  278. log.error("查询(易思达)客户名册异常",e);
  279. return;
  280. }
  281. /*
  282. 从项目总表(系统1)获取客户数据
  283. */
  284. log.info("查询项目总表客户名册所有记录");
  285. List<Map> sys1CustomerData = new ArrayList<>();
  286. try {
  287. sys1CustomerData = aitableService.querySys1CustomerData();
  288. log.info("项目总表客户数量="+sys1CustomerData.size());
  289. } catch (Exception e) {
  290. log.error("查询项目总表客户数据异常",e);
  291. return;
  292. }
  293. String testUseFlag; //测试使用
  294. String seaType; //公海/私海
  295. String newOrOldFlag; //新老客户
  296. String businessUserId; //业务员userId
  297. String businessUnionId; //业务员unionId
  298. Map<String, Integer> privateCustomerNumMap; //业务员私海客户数量
  299. int numOfPrivateCustomer;
  300. Map<String, Integer> privateNewCustomerNumMap; //业务员新客户数量
  301. int numOfPrivateNewCustomer;
  302. Map<String, Integer> privateOldCustomerNumMap; //业务员老客户数量
  303. int numOfPrivateOldCustomer;
  304. /*
  305. 统计易思达系统私海客户数量
  306. 同时按新老客户统计
  307. */
  308. privateCustomerNumMap = new HashMap<>();
  309. privateNewCustomerNumMap = new HashMap<>();
  310. privateOldCustomerNumMap = new HashMap<>();
  311. for(Map ltcCustomerRecord : ltcCustomerData){
  312. businessUserId = "";
  313. try {
  314. testUseFlag = "";
  315. if(ltcCustomerRecord.get("testUseFlag") != null){
  316. testUseFlag = ltcCustomerRecord.get("testUseFlag").toString();
  317. }
  318. if(!"否".equals(testUseFlag)){
  319. //忽略测试使用的客户
  320. continue;
  321. }
  322. seaType = "";
  323. if(ltcCustomerRecord.get("seaType") != null){
  324. seaType = ltcCustomerRecord.get("seaType").toString();
  325. }
  326. if(!"私".equals(seaType)){
  327. //忽略非私海客户
  328. continue;
  329. }
  330. if(ltcCustomerRecord.get("userId") != null && StringUtils.isNotEmpty(ltcCustomerRecord.get("userId").toString())){
  331. businessUserId = ltcCustomerRecord.get("userId").toString();
  332. if(userIdList.contains(businessUserId)){
  333. if(privateCustomerNumMap.containsKey(businessUserId)){
  334. privateCustomerNumMap.put(businessUserId, privateCustomerNumMap.get(businessUserId) + 1);
  335. }else{
  336. privateCustomerNumMap.put(businessUserId, 1);
  337. }
  338. newOrOldFlag = ltcCustomerRecord.get("newOrOld").toString();
  339. if("新".equals(newOrOldFlag)){
  340. if(privateNewCustomerNumMap.containsKey(businessUserId)){
  341. privateNewCustomerNumMap.put(businessUserId, privateNewCustomerNumMap.get(businessUserId) + 1);
  342. }else{
  343. privateNewCustomerNumMap.put(businessUserId, 1);
  344. }
  345. }else if("老".equals(newOrOldFlag)){
  346. if(privateOldCustomerNumMap.containsKey(businessUserId)){
  347. privateOldCustomerNumMap.put(businessUserId, privateOldCustomerNumMap.get(businessUserId) + 1);
  348. }else{
  349. privateOldCustomerNumMap.put(businessUserId, 1);
  350. }
  351. }else{
  352. //忽略非新老客户
  353. }
  354. }else{
  355. log.info("业务员已离职:" + businessUserId);
  356. }
  357. }else{
  358. log.info("私海客户["+ltcCustomerRecord.get("customerName")+"]业务员为空");
  359. }
  360. } catch (Exception e) {
  361. log.info("业务员ID:" + businessUserId);
  362. log.error("匹配客户名册表业务员与业务员档案表业务员异常",e);
  363. }
  364. }
  365. // if(privateCustomerNumMap.isEmpty()){
  366. // log.info("业务员私海客户数量获取不正确");
  367. // return;
  368. // }
  369. /*
  370. 更新各业务员私海客户数量
  371. */
  372. // for (String userIdKey : userIdList){
  373. // if(privateCustomerNumMap.containsKey(userIdKey)){
  374. // numOfPrivateCustomer = privateCustomerNumMap.get(userIdKey);
  375. // }else{
  376. // //私海客户归0
  377. // numOfPrivateCustomer = 0;
  378. // }
  379. // try {
  380. // formInstId = userIdFormInstIdMap.get(userIdKey);
  381. // log.info("更新各业务员私海客户数量:" + formInstId + " " + numOfPrivateCustomer);
  382. // yidaService.updateLtcBusinessUserPrivateCustomerNum(formInstId, numOfPrivateCustomer);
  383. // } catch (Exception e) {
  384. // log.error("更新各业务员私海客户数量异常",e);
  385. // }
  386. // if(privateNewCustomerNumMap.containsKey(userIdKey)){
  387. // numOfPrivateNewCustomer = privateNewCustomerNumMap.get(userIdKey);
  388. // }else{
  389. // //新客户归0
  390. // numOfPrivateNewCustomer = 0;
  391. // }
  392. // try {
  393. // formInstId = userIdFormInstIdMap.get(userIdKey);
  394. // log.info("更新各业务员新客户数量:" + formInstId + " " + numOfPrivateNewCustomer);
  395. // yidaService.updateLtcBusinessUserPrivateNewCustomerNum(formInstId, numOfPrivateNewCustomer);
  396. // } catch (Exception e) {
  397. // log.error("更新各业务员新客户数量异常",e);
  398. // }
  399. // if(privateOldCustomerNumMap.containsKey(userIdKey)){
  400. // numOfPrivateOldCustomer = privateOldCustomerNumMap.get(userIdKey);
  401. // }else{
  402. // //老客户归0
  403. // numOfPrivateOldCustomer = 0;
  404. // }
  405. // try {
  406. // formInstId = userIdFormInstIdMap.get(userIdKey);
  407. // log.info("更新各业务员老客户数量:" + formInstId + " " + numOfPrivateOldCustomer);
  408. // yidaService.updateLtcBusinessUserPrivateOldCustomerNum(formInstId, numOfPrivateOldCustomer);
  409. // } catch (Exception e) {
  410. // log.error("更新各业务员老客户数量异常",e);
  411. // }
  412. // }
  413. /*
  414. 统计项目总表私海客户数量
  415. 私海客户总数
  416. 同时按新老客户统计
  417. */
  418. privateCustomerNumMap = new HashMap<>();
  419. privateNewCustomerNumMap = new HashMap<>();
  420. privateOldCustomerNumMap = new HashMap<>();
  421. for(Map sys1CustomerRecord : sys1CustomerData){
  422. try {
  423. testUseFlag = "";
  424. if(sys1CustomerRecord.get("testUseFlag") != null){
  425. testUseFlag = sys1CustomerRecord.get("testUseFlag").toString();
  426. }
  427. if(!"否".equals(testUseFlag)){
  428. //忽略测试使用的客户
  429. continue;
  430. }
  431. if(sys1CustomerRecord.get("businessUserUnionId") != null && StringUtils.isNotEmpty(sys1CustomerRecord.get("businessUserUnionId").toString())){
  432. businessUnionId = sys1CustomerRecord.get("businessUserUnionId").toString();
  433. if(unionIdList.contains(businessUnionId)){
  434. if(privateCustomerNumMap.containsKey(businessUnionId)){
  435. privateCustomerNumMap.put(businessUnionId, privateCustomerNumMap.get(businessUnionId) + 1);
  436. }else{
  437. privateCustomerNumMap.put(businessUnionId, 1);
  438. }
  439. newOrOldFlag = sys1CustomerRecord.get("newOrOld").toString();
  440. if("新".equals(newOrOldFlag)){
  441. if(privateNewCustomerNumMap.containsKey(businessUnionId)){
  442. privateNewCustomerNumMap.put(businessUnionId, privateNewCustomerNumMap.get(businessUnionId) + 1);
  443. }else{
  444. privateNewCustomerNumMap.put(businessUnionId, 1);
  445. }
  446. }else if("老".equals(newOrOldFlag)){
  447. if(privateOldCustomerNumMap.containsKey(businessUnionId)){
  448. privateOldCustomerNumMap.put(businessUnionId, privateOldCustomerNumMap.get(businessUnionId) + 1);
  449. }else{
  450. privateOldCustomerNumMap.put(businessUnionId, 1);
  451. }
  452. }else{
  453. //忽略非新老客户
  454. }
  455. }else{
  456. log.info("业务员已离职:" + businessUnionId);
  457. }
  458. }
  459. } catch (Exception e) {
  460. log.error("匹配项目总表客户名册表业务员与业务员档案表业务员异常",e);
  461. }
  462. }
  463. if(privateCustomerNumMap.isEmpty()){
  464. log.info("业务员私海客户数量(项目总表)获取不正确");
  465. return;
  466. }
  467. /*
  468. 更新各业务员私海客户数量(项目总表)
  469. */
  470. for (String unionIdKey : unionIdList){
  471. if(privateCustomerNumMap.containsKey(unionIdKey)){
  472. numOfPrivateCustomer = privateCustomerNumMap.get(unionIdKey);
  473. }else{
  474. //私海客户归0
  475. numOfPrivateCustomer = 0;
  476. }
  477. try {
  478. formInstId = unionIdFormInstIdMap.get(unionIdKey);
  479. log.info("更新各业务员私海客户数量(项目总表):" + formInstId + " " + numOfPrivateCustomer);
  480. yidaService.updateLtcBusinessUserPrivateCustomerNum2(formInstId, numOfPrivateCustomer);
  481. } catch (Exception e) {
  482. log.error("更新各业务员私海客户数量(项目总表)异常",e);
  483. }
  484. if(privateNewCustomerNumMap.containsKey(unionIdKey)){
  485. numOfPrivateNewCustomer = privateNewCustomerNumMap.get(unionIdKey);
  486. }else{
  487. //新客户归0
  488. numOfPrivateNewCustomer = 0;
  489. }
  490. try {
  491. formInstId = unionIdFormInstIdMap.get(unionIdKey);
  492. log.info("更新各业务员新客户数量(项目总表):" + formInstId + " " + numOfPrivateNewCustomer);
  493. yidaService.updateLtcBusinessUserPrivateNewCustomerNum2(formInstId, numOfPrivateNewCustomer);
  494. } catch (Exception e) {
  495. log.error("更新各业务员新客户数量(项目总表)异常",e);
  496. }
  497. if(privateOldCustomerNumMap.containsKey(unionIdKey)){
  498. numOfPrivateOldCustomer = privateOldCustomerNumMap.get(unionIdKey);
  499. }else{
  500. //老客户归0
  501. numOfPrivateOldCustomer = 0;
  502. }
  503. try {
  504. formInstId = unionIdFormInstIdMap.get(unionIdKey);
  505. log.info("更新各业务员老客户数量(项目总表):" + formInstId + " " + numOfPrivateOldCustomer);
  506. yidaService.updateLtcBusinessUserPrivateOldCustomerNum2(formInstId, numOfPrivateOldCustomer);
  507. } catch (Exception e) {
  508. log.error("更新各业务员老客户数量(项目总表)异常",e);
  509. }
  510. }
  511. log.info("计算业务员私海客户数量结束");
  512. }
  513. }