TempController.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package com.jkcredit.invoice.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.google.common.util.concurrent.ThreadFactoryBuilder;
  6. import com.jkcredit.invoice.common.CommonConstants;
  7. import com.jkcredit.invoice.model.entity.SearchInvoiceResult;
  8. import com.jkcredit.invoice.model.entity.SearchInvoiceResultTemp;
  9. import com.jkcredit.invoice.model.entity.WayBillTest;
  10. import com.jkcredit.invoice.service.SearchInvoiceResultService;
  11. import com.jkcredit.invoice.service.SearchInvoiceResultTempService;
  12. import com.jkcredit.invoice.util.HttpUtil;
  13. import com.jkcredit.invoice.util.ReadExcelUtil;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.BeanUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.data.redis.core.RedisTemplate;
  18. import org.springframework.web.bind.annotation.RequestMapping;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import org.springframework.web.multipart.MultipartFile;
  22. import java.util.*;
  23. import java.util.concurrent.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * @description:
  27. * @author: xusonglin
  28. * @create: 2019/12/13 13:21
  29. * @version: V1.0
  30. **/
  31. @RestController
  32. @RequestMapping("/temp")
  33. @Slf4j
  34. public class TempController {
  35. @Autowired
  36. private HttpUtil httpUtil;
  37. @Autowired
  38. private SearchInvoiceResultService searchInvoiceResultService;
  39. @Autowired
  40. private SearchInvoiceResultTempService tempService;
  41. @Autowired
  42. private RedisTemplate redisTemplate;
  43. @RequestMapping("/temp")
  44. public void temp(@RequestParam MultipartFile file) {
  45. // 查询所有运单
  46. List<WayBillTest> wayBillTestList = ReadExcelUtil.readTempExcel(file, WayBillTest.class);
  47. //线程分割数
  48. int count = 20000;
  49. //获取list大小
  50. int listSize = wayBillTestList.size();
  51. //线程数
  52. int threadSize = (listSize / count) + 1;
  53. ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("thread-numInvoice-%d").build();
  54. ExecutorService executor = new ThreadPoolExecutor(threadSize, threadSize, 200L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), namedThreadFactory);
  55. CountDownLatch countDownLatch = new CountDownLatch(threadSize);
  56. List<WayBillTest> newList;
  57. for (int i = 0; i < threadSize; i++) {
  58. if ((i + 1) == threadSize) {
  59. int startIndex = (i * count);
  60. int endIndex = wayBillTestList.size();
  61. newList = wayBillTestList.subList(startIndex, endIndex);
  62. } else {
  63. int startIndex = i * count;
  64. int endIndex = (i + 1) * count;
  65. newList = wayBillTestList.subList(startIndex, endIndex);
  66. }
  67. List<WayBillTest> finalNewList = newList;
  68. executor.execute(new Thread(() -> {
  69. if (null != finalNewList) {
  70. log.info("传入数据是:{}", JSON.toJSONString(finalNewList));
  71. finalNewList.stream().forEach(numInvoice -> {
  72. Map<String, Object> map = new HashMap<>(4);
  73. map.put("companyNum","10004616");
  74. map.put("num", numInvoice.getWayBillNum());
  75. log.info("运单编号num={}", numInvoice.getWayBillNum());
  76. //调用接口
  77. String registerResult = httpUtil.getCheckResult(map, CommonConstants.WAY_BILL_NUM_FIND_INVOICE_API);
  78. // String registerResult = getTestResult();
  79. log.info("运单查询发票接口返回:{},请求参数:{}", registerResult, JSON.toJSONString(map));
  80. //转换结果为jsonobject
  81. JSONObject registerResultJson = JSON.parseObject(registerResult);
  82. //获取返回data值
  83. String dataCode = registerResultJson.getString("data");
  84. //判断返回值是否为1 如果是1 设置状态为成功
  85. if ("1".equals(dataCode)) {
  86. String returnStr = registerResultJson.getString("msg");
  87. JSONObject returnStrJson = JSON.parseObject(returnStr);
  88. //获取接口返回结果
  89. String numResult = returnStrJson.getString("result");
  90. //获取接口状态
  91. String waybillStatus = returnStrJson.getString("waybillStatus");
  92. //转换为结果实体对象 并插入数据库 实现计费功能
  93. List<SearchInvoiceResult> ts = JSONArray.parseArray(numResult, SearchInvoiceResult.class);
  94. List<SearchInvoiceResult> newSearchInvoiceResultList;
  95. if (ts.size() > 0) {
  96. //去重列表
  97. newSearchInvoiceResultList = ts.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
  98. () -> new TreeSet<>(Comparator.comparing(SearchInvoiceResult::getTransactionId))),
  99. ArrayList::new));
  100. //计费
  101. newSearchInvoiceResultList.stream().forEach(t -> {
  102. if (!redisTemplate.hasKey(CommonConstants.NUM_FIND_INVOICE_KEY + t.getInvoiceNum() + "_" + t.getInvoiceCode())) {
  103. SearchInvoiceResultTemp temp = new SearchInvoiceResultTemp();
  104. BeanUtils.copyProperties(t, temp);
  105. tempService.save(temp);
  106. //存入redis发票信息
  107. redisTemplate.opsForValue().set(CommonConstants.NUM_FIND_INVOICE_KEY + t.getInvoiceNum() + "_" + t.getInvoiceCode(), JSON.toJSONString(t));
  108. //存入redis交易id
  109. redisTemplate.opsForValue().set(CommonConstants.TRANSACTION_ID_KEY + t.getTransactionId(), t.getTransactionId());
  110. }
  111. });
  112. }
  113. } else {
  114. //设置失败
  115. log.error("返回code不等于1的结果={}", registerResult);
  116. }
  117. });
  118. }
  119. countDownLatch.countDown();
  120. }));
  121. }
  122. try {
  123. countDownLatch.await();
  124. } catch (InterruptedException e) {
  125. e.printStackTrace();
  126. }
  127. executor.shutdown();
  128. }
  129. }