DataStaticAnalysisDs.java 33 KB

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