DataStaticAnalysisDs.java 25 KB

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