AlipayService.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package ieven.server.webapp.domain.alipay;
  2. import com.mongodb.client.MongoCursor;
  3. import ieven.server.webapp.domain.ModelIdInput;
  4. import ieven.server.webapp.domain.data.DataMap;
  5. import ieven.server.webapp.domain.data.Fields;
  6. import ieven.server.webapp.domain.data.FieldsService;
  7. import ieven.server.webapp.domain.file.FileStatus;
  8. import ieven.server.webapp.domain.file.LogicalFile;
  9. import ieven.server.webapp.infrastructure.wrapper.Mapped;
  10. import ieven.server.webapp.util.DataUtils;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.apache.commons.collections4.CollectionUtils;
  13. import org.apache.commons.lang3.ObjectUtils;
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.bson.Document;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.context.annotation.Lazy;
  18. import org.springframework.data.mongodb.core.MongoTemplate;
  19. import org.springframework.data.mongodb.core.query.Criteria;
  20. import org.springframework.data.mongodb.core.query.Query;
  21. import org.springframework.scheduling.annotation.Async;
  22. import org.springframework.stereotype.Service;
  23. import java.util.*;
  24. @Slf4j
  25. @Service
  26. public class AlipayService {
  27. @Autowired
  28. private MongoTemplate mongoTemplate;
  29. @Autowired
  30. private FieldsService fieldsService;
  31. @Autowired
  32. @Lazy
  33. private AlipayService alipayService;
  34. private final static String FNAME_PERSONINFO = "提取的人员信息表";
  35. private final static String FIELDNAME_BANKCARD = "绑定银行卡";
  36. private final static String EXTRACT_BANKCARDTYPE = "提取银行卡类型";
  37. private final static String EXTRACT_BANKCARDCODE = "提取银行卡开户行";
  38. private final static String EXTRACT_BANKCARD = "提取银行卡号";
  39. private final static List<String> PERSONINFO_HEADERNAMES = Arrays.asList("用户ID", "登录邮箱", "登录手机", "账户名称", "证件类型", "证件号", "绑定手机", "绑定银行卡", "提取银行卡类型", "提取银行卡开户行", "提取银行卡号");
  40. public Mapped testCursor() {
  41. Query query = new Query(Criteria.where("fileId").is("618ce033a14aa6502ed010ba"));
  42. MongoCursor<Document> cursor = mongoTemplate.getCollection("data")
  43. .find(query.getQueryObject())
  44. .batchSize(1000)
  45. .noCursorTimeout(true)
  46. .cursor();
  47. Document doc;
  48. while (cursor.hasNext()) {
  49. //写法1(建议)
  50. doc = cursor.next();
  51. log.info(doc.getString("f4"));
  52. }
  53. return null;
  54. }
  55. public Mapped extractPersonInfo(ModelIdInput modelIdInput) {
  56. String modelId = modelIdInput.getModelId();
  57. //插入文件
  58. LogicalFile logicalFile = createNewLogicalFile(modelId, FNAME_PERSONINFO);
  59. String fileId = logicalFile.getId();
  60. //创建并存储表头
  61. Fields fields = fieldsService.createHeaderAndSave(PERSONINFO_HEADERNAMES, fileId);
  62. //根据模型id查询所有的文件
  63. String key1 = "fieldsReverse." + FIELDNAME_BANKCARD;
  64. Query queryExist = new Query(Criteria.where(key1).exists(true).and(""));
  65. List<Fields> fieldsList = mongoTemplate.find(queryExist, Fields.class);
  66. for (Fields fields1 : fieldsList) {
  67. //再次过滤出是原始非修改过的文件的
  68. Query queryIsGenerated = new Query(Criteria.where("id").is(fields1.getFileId()).and("generated").is(Boolean.FALSE));
  69. LogicalFile checked = mongoTemplate.findOne(queryIsGenerated, LogicalFile.class);
  70. if (checked != null && checked.getId() != null && checked.getId().equals(fields1.getFileId())) {
  71. alipayService.extractPersonInfoByFileId(fields1, fields);
  72. }
  73. }
  74. Mapped mapped = Mapped.OK();
  75. mapped.put("result", logicalFile);
  76. return mapped;
  77. }
  78. //遍历文件里面的所有内容
  79. @Async
  80. public void extractPersonInfoByFileId(Fields input, Fields output) {
  81. LinkedHashMap<String, String> inputReversed = input.getFieldsReverse();
  82. LinkedHashMap<String, String> outputReversed = output.getFieldsReverse();
  83. String inputFileId = input.getFileId();
  84. String outputFileId = output.getFileId();
  85. String in1 = inputReversed.get("绑定银行卡");
  86. String out1 = inputReversed.get("绑定银行卡");
  87. String out2 = outputReversed.get("提取银行卡类型");
  88. String out3 = outputReversed.get("提取银行卡开户行");
  89. String out4 = outputReversed.get("提取银行卡号");
  90. Query query = new Query(Criteria.where("fileId").is(inputFileId));
  91. query.fields().include();
  92. MongoCursor<Document> cursor = mongoTemplate.getCollection("data")
  93. .find(query.getQueryObject())
  94. .batchSize(1000)
  95. .noCursorTimeout(true)
  96. .cursor();
  97. Document doc;
  98. List<DataMap> needToSave = new ArrayList<>(1000);
  99. while (cursor.hasNext()) {
  100. //写法1(建议)
  101. doc = cursor.next();
  102. DataMap newDoc = new DataMap();
  103. newDoc.put("fileId", outputFileId);
  104. //其他字段
  105. for (String headerName : PERSONINFO_HEADERNAMES) {
  106. String inputAlias = inputReversed.get(headerName);
  107. if (StringUtils.isNotBlank(inputAlias)) {
  108. String outputAlias = outputReversed.get(headerName);
  109. if (StringUtils.isNotBlank(outputAlias)) {
  110. newDoc.put(outputAlias, doc.get(inputAlias));
  111. }
  112. }
  113. }
  114. //绑定银行卡字段
  115. String value1 = doc.getString(in1);
  116. String[] splited1 = value1.split(";");
  117. for (String s1 : splited1) {
  118. if (StringUtils.isNotBlank(s1)) {
  119. String[] splited2 = s1.split(":");
  120. if (splited2.length == 3) {
  121. newDoc.put(out2, splited2[0]);
  122. newDoc.put(out3, splited2[1]);
  123. newDoc.put(out4, splited2[2]);
  124. needToSave.add(newDoc);
  125. }
  126. }
  127. }
  128. if (needToSave.size() >= 1000) {
  129. saveLines(new ArrayList<>(needToSave));
  130. needToSave.clear();
  131. }
  132. }
  133. if (CollectionUtils.isNotEmpty(needToSave)) {
  134. // saveLines(new ArrayList<>(needToSave));
  135. saveLines(needToSave);
  136. }
  137. }
  138. /**
  139. * 创建新的逻辑表,只包含表头
  140. */
  141. public LogicalFile createNewLogicalFile(String modelId, String filename) {
  142. LogicalFile logicalFile = new LogicalFile();
  143. logicalFile.setFilename(filename);
  144. logicalFile.setStatus(FileStatus.STATUS_LOADING);
  145. String current = DataUtils.currentDate();
  146. logicalFile.setUploadDate(current);
  147. logicalFile.setModelId(modelId);
  148. logicalFile.setGenerated(Boolean.TRUE);
  149. return mongoTemplate.insert(logicalFile);
  150. }
  151. @Async
  152. public void saveLines(List<DataMap> documentList) {
  153. mongoTemplate.insert(documentList,DataMap.class);
  154. }
  155. }