IBPSServiceImpl.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package com.jyxt.getdatabyrestful.service.impl;
  2. import com.jyxt.getdatabyrestful.service.IBPSService;
  3. import com.jyxt.getdatabyrestful.service.LISService;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.jdbc.core.BatchPreparedStatementSetter;
  9. import org.springframework.jdbc.core.JdbcTemplate;
  10. import org.springframework.stereotype.Repository;
  11. import java.sql.PreparedStatement;
  12. import java.sql.SQLException;
  13. import java.util.ArrayList;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. @Repository
  18. public class IBPSServiceImpl implements IBPSService {
  19. private static final Logger log = LoggerFactory.getLogger(IBPSServiceImpl.class);
  20. @Autowired
  21. private JdbcTemplate jdbcTemplate;
  22. @Autowired
  23. LISService lisService;
  24. @Value("${config.qryDays}")
  25. private String qryDays;
  26. public int UpdateActualCount() {
  27. log.info("ready to update records");
  28. int retVal = 1;
  29. // 获取LIS实际保存数量
  30. List<Map<String, Object>> actualList = lisService.geteActualCountList(qryDays);
  31. // 查询系统中待弃置列表
  32. List<Map<String, Object>> saveedList = geteSavedCountList();
  33. // 创建用于更新的数据列表
  34. List<Map<String, Object>> updateList = new ArrayList<>();
  35. // 构建actualList的查找映射:日期+专业组 -> COUNT
  36. Map<String, Integer> actualMap = new HashMap<>();
  37. for (Map<String, Object> actualItem : actualList) {
  38. String saveDate = (String) actualItem.get("SAVE_DATE");
  39. String groupName = (String) actualItem.get("GROUPNAME");
  40. String countStr = actualItem.get("COUNT").toString();
  41. String key = saveDate + "_" + groupName;
  42. try {
  43. int count = Integer.parseInt(countStr);
  44. actualMap.put(key, count);
  45. } catch (NumberFormatException e) {
  46. log.warn("LIS数据中COUNT字段格式错误: {}, 组别: {}", countStr, key);
  47. }
  48. }
  49. // 遍历saveedList,匹配并计算百分比
  50. for (Map<String, Object> savedItem : saveedList) {
  51. String id = savedItem.get("id_").toString();
  52. String saveDate = (String) savedItem.get("bao_cun_shi_jian_");
  53. String groupName = (String) savedItem.get("qi_ta_");
  54. String hejiStr = (String) savedItem.get("he_ji_");
  55. String key = saveDate + "_" + groupName;
  56. // 检查actualMap中是否存在对应的记录
  57. if (actualMap.containsKey(key)) {
  58. try {
  59. int heji = Integer.parseInt(hejiStr);
  60. int count = actualMap.get(key);
  61. // 计算百分比 (he_ji_/COUNT * 100)
  62. double percentage = 0.0;
  63. if (count > 0) {
  64. percentage = (double) heji / count * 100;
  65. }
  66. // 保留1位小数
  67. double roundedPercentage = Math.round(percentage * 10.0) / 10.0;
  68. if (roundedPercentage > 100.0) { //超过100%按100%显示
  69. roundedPercentage = 100.0;
  70. }
  71. // 构建更新数据
  72. Map<String, Object> updateData = new HashMap<>();
  73. updateData.put("id_", id);
  74. updateData.put("ying_bao_cun_shu_", String.valueOf(count));
  75. updateData.put("bao_cun_bai_fen_b", String.valueOf(roundedPercentage));
  76. updateList.add(updateData);
  77. } catch (NumberFormatException e) {
  78. retVal = 0;
  79. log.warn("数据格式转换错误 - ID: {}, he_ji_: {}, 组别: {}", id, hejiStr, key);
  80. }
  81. }
  82. }
  83. // 执行批量更新
  84. int updatedCount = batchUpdateRecords(updateList);
  85. log.info("update {} records success!", updatedCount);
  86. return retVal;
  87. }
  88. /**
  89. * 批量更新记录
  90. */
  91. private int batchUpdateRecords(List<Map<String, Object>> updateList) {
  92. if (updateList == null || updateList.isEmpty()) {
  93. return 0;
  94. }
  95. log.info("start to update records...");
  96. String updateSql = "UPDATE t_jyhypjlb SET ying_bao_cun_shu_ = ?, bao_cun_bai_fen_b = ? WHERE id_ = ?";
  97. int[] updateCounts = jdbcTemplate.batchUpdate(updateSql, new BatchPreparedStatementSetter() {
  98. @Override
  99. public void setValues(PreparedStatement ps, int i) throws SQLException {
  100. Map<String, Object> data = updateList.get(i);
  101. ps.setString(1, (String) data.get("ying_bao_cun_shu_"));
  102. ps.setString(2, (String) data.get("bao_cun_bai_fen_b"));
  103. ps.setString(3, (String) data.get("id_"));
  104. }
  105. @Override
  106. public int getBatchSize() {
  107. return updateList.size();
  108. }
  109. });
  110. // 计算实际更新的记录数
  111. int totalUpdated = 0;
  112. for (int count : updateCounts) {
  113. if (count > 0) {
  114. totalUpdated++;
  115. }
  116. }
  117. return totalUpdated;
  118. }
  119. public List<Map<String, Object>> geteSavedCountList() {
  120. String qryUndestoryList = "SELECT id_, " +
  121. "CASE " +
  122. " WHEN bao_cun_shi_jian_ LIKE '____-__-__ %' THEN DATE_FORMAT(STR_TO_DATE(bao_cun_shi_jian_, '%Y-%m-%d %H:%i:%s'), '%Y%m%d') " +
  123. " WHEN bao_cun_shi_jian_ LIKE '____-__-__' THEN DATE_FORMAT(STR_TO_DATE(bao_cun_shi_jian_, '%Y-%m-%d'), '%Y%m%d') " +
  124. " ELSE bao_cun_shi_jian_ " +
  125. "END AS bao_cun_shi_jian_, " +
  126. "qi_ta_, he_ji_ " +
  127. "FROM t_jyhypjlb WHERE shi_fou_guo_shen_='待弃置'";
  128. log.info("execute sql: " + qryUndestoryList.toString());
  129. return jdbcTemplate.queryForList(qryUndestoryList);
  130. }
  131. }