DataStaticAnalysisDs.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. package ieven.server.webapp.service.datastatic;
  2. import com.mongodb.client.MongoCursor;
  3. import ieven.server.webapp.domain.alipay.HeaderProperties;
  4. import ieven.server.webapp.domain.data.DataMap;
  5. import ieven.server.webapp.domain.file.FileService;
  6. import ieven.server.webapp.service.Ops;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.apache.commons.collections4.CollectionUtils;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.bson.Document;
  11. import org.springframework.data.mongodb.core.MongoTemplate;
  12. import java.math.BigDecimal;
  13. import java.util.*;
  14. import java.util.concurrent.CountDownLatch;
  15. @Slf4j
  16. public class DataStaticAnalysisDs extends Ops implements Runnable {
  17. private HeaderProperties headerProperties;
  18. String modelId;
  19. MongoTemplate mongoTemplate;
  20. FileService fileService;
  21. CountDownLatch latch;
  22. public DataStaticAnalysisDs(HeaderProperties headerProperties, String modelId, MongoTemplate mongoTemplate, FileService fileService, CountDownLatch latch) {
  23. this.headerProperties = headerProperties;
  24. this.modelId = modelId;
  25. this.mongoTemplate = mongoTemplate;
  26. this.fileService = fileService;
  27. this.latch = latch;
  28. }
  29. @Override
  30. public void run() {
  31. log.info("数据分析-对手透视");
  32. // 直接删除并创建表
  33. String newFileId = "";
  34. String dateFileIdwld = getFileId("五联单-账户明细", modelId, mongoTemplate);
  35. String dateFileIdfa = getFileId("反诈治安-交易明细", modelId, mongoTemplate);
  36. String dateFileIdcft = getFileId("财付通-交易明细", modelId, mongoTemplate);
  37. // 插入记录用户后续查询明细
  38. if (StringUtils.isNotBlank(dateFileIdwld) || StringUtils.isNotBlank(dateFileIdfa) || StringUtils.isNotBlank(dateFileIdcft)) {
  39. newFileId = createLogicAndDeleteOld("数据分析-对手透视", modelId, headerProperties.getAntiSecurityTradeEndAnalysisOutput(), mongoTemplate, fileService);
  40. }
  41. // 插入记录用户后续查询明细
  42. List<DataMap> dataMapList = new ArrayList<>();
  43. if (StringUtils.isNotBlank(dateFileIdcft)) {
  44. MongoCursor<Document> cursor = getCursor(dateFileIdcft, mongoTemplate);
  45. if (cursor.hasNext()) {
  46. insertFromTo(dateFileIdcft, newFileId, modelId, mongoTemplate);
  47. }
  48. Set<String> alipayIds = new HashSet<>();
  49. Map<String, DataMap> idToData = new HashMap<>();
  50. Map<String, Set<String>> idToMainIds = new HashMap<>();
  51. Map<String, Set<String>> idToNames = new HashMap<>();
  52. Map<String, Set<String>> hm = new HashMap<>();
  53. Document origin;
  54. while (cursor.hasNext()) {
  55. try {
  56. origin = cursor.next();
  57. String alipayId = origin.getString("交易对手账号");
  58. DataMap dataMap;
  59. if (alipayIds.contains(alipayId)) {
  60. dataMap = idToData.get(alipayId);
  61. } else {
  62. alipayIds.add(alipayId);
  63. dataMap = new DataMap();
  64. dataMap.put("fileId", newFileId);
  65. dataMap.put("交易对手账号", alipayId);
  66. dataMap.put("交易对手户名", "");
  67. dataMap.put("交易总额", new BigDecimal("0.00"));
  68. dataMap.put("交易主体收入金额", new BigDecimal("0.00"));
  69. dataMap.put("交易主体支出金额", new BigDecimal("0.00"));
  70. dataMap.put("交易主体收入笔数", 0);
  71. dataMap.put("交易主体支出笔数", 0);
  72. dataMap.put("总笔数", 0);
  73. dataMap.put("共同交易主体数", 0);
  74. dataMap.put("共同交易主体账号汇总", "");
  75. dataMap.put("来源", "财付通");
  76. dataMap.put("共同交易主体户名汇总", 0);
  77. idToData.put(alipayId, dataMap);
  78. }
  79. String alipayUsername = origin.getString("交易对手户名");
  80. if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername) && !"null".equals(alipayUsername)) {
  81. if (idToNames.containsKey(alipayId)) {
  82. Set<String> names = idToNames.get(alipayId);
  83. names.add(alipayUsername);
  84. } else {
  85. Set<String> names = new HashSet<>();
  86. names.add(alipayUsername);
  87. idToNames.put(alipayId, names);
  88. }
  89. }
  90. String flag = "借贷类型";
  91. String flagValue = origin.getString(flag);
  92. String money = (String) origin.get("交易金额(元)");
  93. if (StringUtils.isBlank(money)) {
  94. money = "0";
  95. }
  96. if ("入".equals(flagValue)) {
  97. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额");
  98. oMoney = oMoney.add(new BigDecimal(money));
  99. dataMap.put("交易主体收入金额", oMoney);
  100. int oCount = (int) dataMap.get("交易主体收入笔数");
  101. oCount++;
  102. dataMap.put("交易主体收入笔数", oCount);
  103. } else if ("出".equals(flagValue)) {
  104. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额");
  105. oMoney = oMoney.add(new BigDecimal(money));
  106. dataMap.put("交易主体支出金额", oMoney);
  107. int oCount = (int) dataMap.get("交易主体支出笔数");
  108. oCount++;
  109. dataMap.put("交易主体支出笔数", oCount);
  110. }
  111. BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额");
  112. oMoney = oMoney.add(new BigDecimal(money));
  113. dataMap.put("交易总额", oMoney);
  114. int oCount = (int) dataMap.get("总笔数");
  115. oCount++;
  116. dataMap.put("总笔数", oCount);
  117. String mainId = (String) origin.get("交易主体账号");
  118. String mainIdhm = (String) origin.get("交易主体户名");
  119. if (StringUtils.isNotBlank(mainId) && StringUtils.isNotBlank(mainIdhm)) {
  120. if (hm.containsKey(mainId)) {
  121. Set<String> hmnew = hm.get(mainId);
  122. hmnew.add(mainIdhm);
  123. hm.put(mainId, hmnew);
  124. } else {
  125. Set<String> mainIds = new HashSet<>();
  126. mainIds.add(mainIdhm);
  127. hm.put(mainId, mainIds);
  128. }
  129. }
  130. if (idToMainIds.containsKey(alipayId)) {
  131. Set<String> mainIds = idToMainIds.get(alipayId);
  132. mainIds.add(mainId);
  133. } else {
  134. Set<String> mainIds = new HashSet<>();
  135. mainIds.add(mainId);
  136. idToMainIds.put(alipayId, mainIds);
  137. }
  138. } catch (Exception exception) {
  139. log.error(exception.getMessage(), exception);
  140. }
  141. }
  142. if (CollectionUtils.isNotEmpty(idToData.values())) {
  143. for (Map.Entry<String, DataMap> entry : idToData.entrySet()) {
  144. String key = entry.getKey();
  145. DataMap value = entry.getValue();
  146. Set<String> mainIds = idToMainIds.get(key);
  147. Set<String> names = idToNames.get(key);
  148. if (CollectionUtils.isNotEmpty(names)) {
  149. value.put("交易对手户名", StringUtils.join(names, ";"));
  150. }
  151. if (CollectionUtils.isNotEmpty(mainIds)) {
  152. value.put("共同交易主体数", mainIds.size());
  153. String str = "";
  154. Set<String> jyzthm = new HashSet<>();
  155. for (String mainId : mainIds) {
  156. Set<String> strings = hm.get(mainId);
  157. if (CollectionUtils.isNotEmpty(strings)) {
  158. jyzthm.addAll(strings);
  159. }
  160. str += CollectionUtils.isEmpty(strings) ? mainId + ";" : mainId + "(" + StringUtils.join(strings, ",") + ");";
  161. }
  162. value.put("共同交易主体账号汇总", str);
  163. value.put("共同交易主体户名汇总", Math.min(mainIds.size(), jyzthm.size()));
  164. }
  165. DataMap dataMap = entry.getValue();
  166. BigDecimal money1 = (BigDecimal) dataMap.get("交易总额");
  167. dataMap.put("交易总额", money1.doubleValue());
  168. BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额");
  169. dataMap.put("交易主体收入金额", money2.doubleValue());
  170. BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额");
  171. dataMap.put("交易主体支出金额", money3.doubleValue());
  172. }
  173. dataMapList.addAll(idToData.values());
  174. //saveLines(idToData.values(), "共同交易主体数", mongoTemplate);
  175. }
  176. }
  177. if (StringUtils.isNotBlank(dateFileIdfa)) {
  178. MongoCursor<Document> cursor = getCursor(dateFileIdfa, mongoTemplate);
  179. if (cursor.hasNext()) {
  180. insertFromTo(dateFileIdfa, newFileId, modelId, mongoTemplate);
  181. }
  182. Set<String> alipayIds = new HashSet<>();
  183. Map<String, DataMap> idToData = new HashMap<>();
  184. Map<String, Set<String>> idToMainIds = new HashMap<>();
  185. Map<String, Set<String>> idToNames = new HashMap<>();
  186. Document origin;
  187. Map<String, Set<String>> hm = new HashMap<>();
  188. while (cursor.hasNext()) {
  189. try {
  190. origin = cursor.next();
  191. String alipayId = origin.getString("交易对手账号");
  192. DataMap dataMap;
  193. if (alipayIds.contains(alipayId)) {
  194. dataMap = idToData.get(alipayId);
  195. } else {
  196. alipayIds.add(alipayId);
  197. dataMap = new DataMap();
  198. dataMap.put("fileId", newFileId);
  199. dataMap.put("交易对手账号", alipayId);
  200. dataMap.put("交易对手户名", "");
  201. dataMap.put("交易总额", new BigDecimal("0.00"));
  202. dataMap.put("交易主体收入金额", new BigDecimal("0.00"));
  203. dataMap.put("交易主体支出金额", new BigDecimal("0.00"));
  204. dataMap.put("交易主体收入笔数", 0);
  205. dataMap.put("交易主体支出笔数", 0);
  206. dataMap.put("总笔数", 0);
  207. dataMap.put("共同交易主体数", 0);
  208. dataMap.put("共同交易主体户名汇总", 0);
  209. dataMap.put("来源", "反诈");
  210. idToData.put(alipayId, dataMap);
  211. }
  212. String alipayUsername = origin.getString("交易对手户名");
  213. if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername) && !"null".equals(alipayUsername)) {
  214. if (idToNames.containsKey(alipayId)) {
  215. Set<String> names = idToNames.get(alipayId);
  216. names.add(alipayUsername);
  217. } else {
  218. Set<String> names = new HashSet<>();
  219. names.add(alipayUsername);
  220. idToNames.put(alipayId, names);
  221. }
  222. }
  223. String flag = "交易主体的出入账标识";
  224. String flagValue = origin.getString(flag);
  225. String money = (String) origin.get("交易金额");
  226. if ("入账".equals(flagValue)) {
  227. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额");
  228. oMoney = oMoney.add(new BigDecimal(money));
  229. dataMap.put("交易主体收入金额", oMoney);
  230. int oCount = (int) dataMap.get("交易主体收入笔数");
  231. oCount++;
  232. dataMap.put("交易主体收入笔数", oCount);
  233. } else if ("出账".equals(flagValue)) {
  234. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额");
  235. oMoney = oMoney.add(new BigDecimal(money));
  236. dataMap.put("交易主体支出金额", oMoney);
  237. int oCount = (int) dataMap.get("交易主体支出笔数");
  238. oCount++;
  239. dataMap.put("交易主体支出笔数", oCount);
  240. }
  241. BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额");
  242. oMoney = oMoney.add(new BigDecimal(money));
  243. dataMap.put("交易总额", oMoney);
  244. int oCount = (int) dataMap.get("总笔数");
  245. oCount++;
  246. dataMap.put("总笔数", oCount);
  247. String mainId = (String) origin.get("交易主体账号");
  248. String mainIdhm = (String) origin.get("交易主体户名");
  249. if (StringUtils.isNotBlank(mainId) && StringUtils.isNotBlank(mainIdhm)) {
  250. if (hm.containsKey(mainId)) {
  251. Set<String> hmnew = hm.get(mainId);
  252. hmnew.add(mainIdhm);
  253. hm.put(mainId, hmnew);
  254. } else {
  255. Set<String> mainIds = new HashSet<>();
  256. mainIds.add(mainIdhm);
  257. hm.put(mainId, mainIds);
  258. }
  259. }
  260. if (idToMainIds.containsKey(alipayId)) {
  261. Set<String> mainIds = idToMainIds.get(alipayId);
  262. mainIds.add(mainId);
  263. } else {
  264. Set<String> mainIds = new HashSet<>();
  265. mainIds.add(mainId);
  266. //mainIds.add(mainId+(StringUtils.isBlank(mainName)||"null".equals(mainName)?"":"("+mainName+")"));
  267. idToMainIds.put(alipayId, mainIds);
  268. }
  269. } catch (Exception exception) {
  270. log.error(exception.getMessage(), exception);
  271. }
  272. }
  273. if (CollectionUtils.isNotEmpty(idToData.values())) {
  274. for (Map.Entry<String, DataMap> entry : idToData.entrySet()) {
  275. String key = entry.getKey();
  276. DataMap value = entry.getValue();
  277. Set<String> names = idToNames.get(key);
  278. if (CollectionUtils.isNotEmpty(names)) {
  279. value.put("交易对手户名", StringUtils.join(names, ";"));
  280. }
  281. Set<String> mainIds = idToMainIds.get(key);
  282. if (CollectionUtils.isNotEmpty(mainIds)) {
  283. value.put("共同交易主体数", mainIds.size());
  284. String str = "";
  285. Set<String> jyzthm = new HashSet<>();
  286. for (String mainId : mainIds) {
  287. Set<String> strings = hm.get(mainId);
  288. if (CollectionUtils.isNotEmpty(strings)) {
  289. jyzthm.addAll(strings);
  290. }
  291. str += CollectionUtils.isEmpty(strings) ? mainId + ";" : mainId + "(" + StringUtils.join(strings, ",") + ");";
  292. }
  293. value.put("共同交易主体账号汇总", str);
  294. value.put("共同交易主体户名汇总", Math.min(mainIds.size(), jyzthm.size()));
  295. }
  296. DataMap dataMap = entry.getValue();
  297. BigDecimal money1 = (BigDecimal) dataMap.get("交易总额");
  298. dataMap.put("交易总额", money1.doubleValue());
  299. BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额");
  300. dataMap.put("交易主体收入金额", money2.doubleValue());
  301. BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额");
  302. dataMap.put("交易主体支出金额", money3.doubleValue());
  303. }
  304. dataMapList.addAll(idToData.values());
  305. //saveLines(idToData.values(), "共同交易主体数", mongoTemplate);
  306. }
  307. }
  308. if (StringUtils.isNotBlank(dateFileIdwld)) {
  309. MongoCursor<Document> cursor = getCursor(dateFileIdwld, mongoTemplate);
  310. if (cursor.hasNext()) {
  311. insertFromTo(dateFileIdwld, newFileId, modelId, mongoTemplate);
  312. }
  313. Set<String> alipayIds = new HashSet<>();
  314. Map<String, DataMap> idToData = new HashMap<>();
  315. Map<String, Set<String>> idToMainIds = new HashMap<>();
  316. Map<String, Set<String>> idToNames = new HashMap<>();
  317. Map<String, Set<String>> hm = new HashMap<>();
  318. Document origin;
  319. while (cursor.hasNext()) {
  320. try {
  321. origin = cursor.next();
  322. String alipayId = origin.getString("对手支付宝用户ID");
  323. DataMap dataMap;
  324. if (alipayIds.contains(alipayId)) {
  325. dataMap = idToData.get(alipayId);
  326. } else {
  327. alipayIds.add(alipayId);
  328. dataMap = new DataMap();
  329. dataMap.put("fileId", newFileId);
  330. dataMap.put("交易对手账号", alipayId);
  331. dataMap.put("交易对手户名", "");
  332. dataMap.put("交易总额", new BigDecimal("0.00"));
  333. dataMap.put("交易主体收入金额", new BigDecimal("0.00"));
  334. dataMap.put("交易主体支出金额", new BigDecimal("0.00"));
  335. dataMap.put("交易主体收入笔数", 0);
  336. dataMap.put("交易主体支出笔数", 0);
  337. dataMap.put("总笔数", 0);
  338. dataMap.put("共同交易主体数", 0);
  339. dataMap.put("共同交易主体账号汇总", "");
  340. dataMap.put("共同交易主体户名汇总", 0);
  341. dataMap.put("来源", "五联单");
  342. idToData.put(alipayId, dataMap);
  343. }
  344. String alipayUsername = origin.getString("对手支付宝户名");
  345. if (StringUtils.isNotBlank(alipayUsername) && !"_".equals(alipayUsername) && !"-".equals(alipayUsername) && !"null".equals(alipayUsername)) {
  346. if (idToNames.containsKey(alipayId)) {
  347. Set<String> names = idToNames.get(alipayId);
  348. names.add(alipayUsername);
  349. } else {
  350. Set<String> names = new HashSet<>();
  351. names.add(alipayUsername);
  352. idToNames.put(alipayId, names);
  353. }
  354. }
  355. String flag = "收/支";
  356. String flagValue = origin.getString(flag);
  357. String money = (String) origin.get("金额(元)");
  358. if ("收入".equals(flagValue)) {
  359. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体收入金额");
  360. oMoney = oMoney.add(new BigDecimal(money));
  361. dataMap.put("交易主体收入金额", oMoney);
  362. int oCount = (int) dataMap.get("交易主体收入笔数");
  363. oCount++;
  364. dataMap.put("交易主体收入笔数", oCount);
  365. } else if ("支出".equals(flagValue)) {
  366. BigDecimal oMoney = (BigDecimal) dataMap.get("交易主体支出金额");
  367. oMoney = oMoney.add(new BigDecimal(money));
  368. dataMap.put("交易主体支出金额", oMoney);
  369. int oCount = (int) dataMap.get("交易主体支出笔数");
  370. oCount++;
  371. dataMap.put("交易主体支出笔数", oCount);
  372. }
  373. BigDecimal oMoney = (BigDecimal) dataMap.get("交易总额");
  374. oMoney = oMoney.add(new BigDecimal(money));
  375. dataMap.put("交易总额", oMoney);
  376. int oCount = (int) dataMap.get("总笔数");
  377. oCount++;
  378. dataMap.put("总笔数", oCount);
  379. String mainId = (String) origin.get("支付宝用户ID");
  380. String mainIdhm = (String) origin.get("支付宝户名");
  381. if (StringUtils.isNotBlank(mainId) && StringUtils.isNotBlank(mainIdhm)) {
  382. if (hm.containsKey(mainId)) {
  383. Set<String> hmnew = hm.get(mainId);
  384. hmnew.add(mainIdhm);
  385. hm.put(mainId, hmnew);
  386. } else {
  387. Set<String> mainIds = new HashSet<>();
  388. mainIds.add(mainIdhm);
  389. hm.put(mainId, mainIds);
  390. }
  391. }
  392. if (idToMainIds.containsKey(alipayId)) {
  393. Set<String> mainIds = idToMainIds.get(alipayId);
  394. mainIds.add(mainId);
  395. } else {
  396. Set<String> mainIds = new HashSet<>();
  397. mainIds.add(mainId);
  398. idToMainIds.put(alipayId, mainIds);
  399. }
  400. } catch (Exception exception) {
  401. log.error(exception.getMessage(), exception);
  402. }
  403. }
  404. if (CollectionUtils.isNotEmpty(idToData.values())) {
  405. for (Map.Entry<String, DataMap> entry : idToData.entrySet()) {
  406. String key = entry.getKey();
  407. DataMap value = entry.getValue();
  408. Set<String> mainIds = idToMainIds.get(key);
  409. Set<String> names = idToNames.get(key);
  410. if (CollectionUtils.isNotEmpty(names)) {
  411. value.put("交易对手户名", StringUtils.join(names, ";"));
  412. }
  413. if (CollectionUtils.isNotEmpty(mainIds)) {
  414. value.put("共同交易主体数", mainIds.size());
  415. String str = "";
  416. Set<String> jyzthm = new HashSet<>();
  417. int count = 0;
  418. for (String mainId : mainIds) {
  419. Set<String> strings = hm.get(mainId);
  420. if (CollectionUtils.isNotEmpty(strings)) {
  421. count++;
  422. }
  423. str += CollectionUtils.isEmpty(strings) ? mainId + ";" : mainId + "(" + StringUtils.join(strings, ",") + ");";
  424. }
  425. value.put("共同交易主体账号汇总", str);
  426. value.put("共同交易主体户名汇总", Math.min(mainIds.size(), count));
  427. }
  428. DataMap dataMap = entry.getValue();
  429. BigDecimal money1 = (BigDecimal) dataMap.get("交易总额");
  430. dataMap.put("交易总额", money1.doubleValue());
  431. BigDecimal money2 = (BigDecimal) dataMap.get("交易主体收入金额");
  432. dataMap.put("交易主体收入金额", money2.doubleValue());
  433. BigDecimal money3 = (BigDecimal) dataMap.get("交易主体支出金额");
  434. dataMap.put("交易主体支出金额", money3.doubleValue());
  435. }
  436. dataMapList.addAll(idToData.values());
  437. }
  438. }
  439. if (CollectionUtils.isNotEmpty(dataMapList)) {
  440. saveLines(dataMapList, "共同交易主体数", mongoTemplate);
  441. }
  442. latch.countDown();
  443. log.info("数据分析-对手透视");
  444. }
  445. }