You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
15 KiB

  1. package com.example.demo.Mysql;
  2. import com.example.demo.Util.BaseDES;
  3. import com.example.demo.domain.entity.User;
  4. import com.example.demo.service.coin.AdminService;
  5. import com.example.demo.service.coin.UserService;
  6. import org.apache.commons.lang3.ObjectUtils;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Qualifier;
  12. import org.springframework.http.*;
  13. import org.springframework.scheduling.annotation.Scheduled;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import org.springframework.web.client.RestTemplate;
  17. import javax.sql.DataSource;
  18. import java.math.BigDecimal;
  19. import java.sql.*;
  20. import java.time.LocalDateTime;
  21. import java.time.Month;
  22. import java.time.format.DateTimeFormatter;
  23. import java.util.*;
  24. @Service
  25. @Transactional
  26. public class MysqlServiceImpl implements MysqlService {
  27. @Autowired
  28. private RestTemplate restTemplate;
  29. Set<Integer> validZeroTypes = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 18, 19, 20, 21, 22, 23, 24, 26, 28, 29, 35, 36, 40, 45, 46, 47, 48, 49, 53, 54, 60));
  30. Set<Integer> validOneTypes = new HashSet<>(Arrays.asList(9, 15, 17, 25, 27, 37, 41, 42, 43, 50, 51, 62));
  31. Set<Integer> validTwoTypes = new HashSet<>(Arrays.asList(52,61));
  32. Set<Integer> validThreeTypes = new HashSet<>(Arrays.asList(10, 16, 30, 31, 32, 33, 34, 39, 44));
  33. Set<Integer> validFourTypes = new HashSet<>(Arrays.asList(55, 56, 57, 58, 59, 63, 64, 65));
  34. LocalDateTime now = LocalDateTime.now();
  35. Month currentMonth = now.getMonth();
  36. @Autowired
  37. private AdminService adminService;
  38. @Autowired
  39. private UserService userService;
  40. @Autowired
  41. @Qualifier("sqlserver1DataSource")
  42. private DataSource sqlserver1DataSource;
  43. @Autowired
  44. @Qualifier("mysql1DataSource")
  45. private DataSource mysql1DataSource;
  46. private static final Logger logger = LoggerFactory.getLogger(MysqlServiceImpl.class);
  47. @Override
  48. @Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
  49. public void getSqlserverData() throws Exception {
  50. logger.info("开始从 SQL Server 同步数据到 MySQL");
  51. try (Connection sqlServerConn = sqlserver1DataSource.getConnection();
  52. Connection mysqlConn = mysql1DataSource.getConnection()) {
  53. logger.info("开始查询数据...");
  54. // 从 SQL Server 查询数据
  55. String querySql = "SELECT gtype,jwcode,free,core_jb,buy_jb,cz_time,cz_user,cz_bz,operation_platform,goods_name " +
  56. "FROM user_gold_records WHERE flag=1 and cz_time> ?";
  57. try (PreparedStatement sqlServerStmt = sqlServerConn.prepareStatement(querySql)) {
  58. sqlServerStmt.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now().minusHours(1))); // 获取最近一小时的数据
  59. ResultSet resultSet = sqlServerStmt.executeQuery();
  60. logger.info("查询数据完毕!");
  61. // 插入到 MySQL
  62. //退款类型 61:ERP退款(退金币)
  63. String insertSql = "INSERT INTO user_gold_record (order_code,jwcode,sum_gold,permanent_gold,free_june,free_december," +
  64. "task_gold,pay_platform,goods_name,refund_type,refund_model,remark,type,admin_id," +
  65. "audit_status,create_time,flag,update_time) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
  66. try (PreparedStatement mysqlStmt = mysqlConn.prepareStatement(insertSql)) {
  67. while (resultSet.next()) {
  68. int gtype = resultSet.getInt("gtype");
  69. Integer jwcode = resultSet.getInt("jwcode");
  70. int free = resultSet.getInt("free");
  71. int core_jb = resultSet.getInt("core_jb");
  72. int buy_jb = resultSet.getInt("buy_jb");
  73. Timestamp created_at = resultSet.getTimestamp("cz_time");
  74. String name = resultSet.getString("cz_user");
  75. String remark = resultSet.getString("cz_bz");
  76. String operation_platform = resultSet.getString("operation_platform");
  77. String goods_name = resultSet.getString("goods_name");
  78. String timestampPart = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
  79. if(StringUtils.isNumeric(name)){
  80. Integer admin_id = Integer.valueOf(adminService.getId(name));
  81. logger.info("用户传输完毕");
  82. mysqlStmt.setInt(14, admin_id);
  83. }else {
  84. mysqlStmt.setInt(14, 99999);
  85. }
  86. Random random = new Random();
  87. int randomNumber = random.nextInt(900) + 100;
  88. // 判断gtype
  89. mysqlStmt.setString(10,null);
  90. mysqlStmt.setNull(11, java.sql.Types.INTEGER);
  91. if(validFourTypes.contains(gtype)){
  92. continue;
  93. }
  94. if(validZeroTypes.contains(gtype)){
  95. mysqlStmt.setInt(13, 0);
  96. mysqlStmt.setString(1, "ERPCZ"+timestampPart+randomNumber);
  97. }
  98. if(validOneTypes.contains(gtype)){
  99. mysqlStmt.setInt(13, 1);
  100. mysqlStmt.setString(1, "ERPXF"+timestampPart+randomNumber);
  101. }
  102. if(validTwoTypes.contains(gtype)){
  103. mysqlStmt.setInt(13, 2);
  104. mysqlStmt.setString(1, "ERPTK"+timestampPart+randomNumber);
  105. mysqlStmt.setString(10,"退款商品");
  106. mysqlStmt.setInt(11, 0);
  107. }
  108. if(validThreeTypes.contains(gtype)){
  109. mysqlStmt.setInt(13, 3);
  110. mysqlStmt.setString(1, "ERPQT"+timestampPart+randomNumber);
  111. }
  112. mysqlStmt.setInt(2, jwcode);
  113. mysqlStmt.setInt(3, free+core_jb+buy_jb);
  114. mysqlStmt.setInt(4,buy_jb);
  115. // 判断月份
  116. if(currentMonth.getValue() >= 7){
  117. mysqlStmt.setInt(5, free);
  118. mysqlStmt.setInt(6, 0);
  119. }
  120. if(currentMonth.getValue() < 7){
  121. mysqlStmt.setInt(5, 0);
  122. mysqlStmt.setInt(6, free);
  123. }
  124. mysqlStmt.setInt(7, core_jb);
  125. if (operation_platform.equals("1")){
  126. mysqlStmt.setString(8, "ERP");
  127. }
  128. else if (operation_platform.equals("2")){
  129. mysqlStmt.setString(8, "HomilyLink");
  130. }
  131. else if(operation_platform.equals("3")){
  132. mysqlStmt.setString(8, "HomilyChart");
  133. }
  134. else if(operation_platform.equals("4")){
  135. continue;
  136. }
  137. else if(operation_platform.equals("0")){
  138. mysqlStmt.setString(8, "初始化金币");
  139. }
  140. else {
  141. mysqlStmt.setString(8, "其他");
  142. }
  143. mysqlStmt.setString(9, goods_name);
  144. mysqlStmt.setString(12, remark);
  145. mysqlStmt.setInt(15, 3);
  146. mysqlStmt.setTimestamp(16, created_at);
  147. if(remark.contains("测试")&&remark.contains("员工")){
  148. mysqlStmt.setInt(17, 0);
  149. }else {
  150. mysqlStmt.setInt(17, 1);
  151. }
  152. mysqlStmt.setTimestamp(18, created_at);
  153. // 更新时的值
  154. mysqlStmt.addBatch();
  155. logger.info("查询用户是否存在");
  156. User user = userService.selectAllUser(String.valueOf(jwcode));
  157. if(ObjectUtils.isEmpty(user)){
  158. logger.info("用户不存在");
  159. user = new User();
  160. String country = "未知";
  161. BaseDES des = new BaseDES();
  162. String desjwcode= des.encrypt(String.valueOf(jwcode));
  163. // System.out.println("desjwcode:"+desjwcode);
  164. // 创建 JSON 请求体
  165. Map<String, String> requestBody = new HashMap<>();
  166. requestBody.put("jwcode", desjwcode);
  167. // 设置请求头
  168. HttpHeaders headers = new HttpHeaders();
  169. headers.setContentType(MediaType.APPLICATION_JSON);
  170. // 创建 HttpEntity
  171. HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
  172. // 发送 POST 请求
  173. try {
  174. ResponseEntity<Map> response = restTemplate.exchange(
  175. "http://hwapi.rzfwq.com/hwjnApp/hwhc-login/hwhclogin/hc/login/clent/info",
  176. HttpMethod.POST, entity, Map.class);
  177. // 检查响应状态码
  178. if (response.getStatusCode().is2xxSuccessful()) {
  179. Map<String, Object> responseBody = response.getBody();
  180. if (responseBody != null) {
  181. // 获取data部分
  182. Map<String, Object> data = (Map<String, Object>) responseBody.get("data");
  183. if (data != null) {
  184. // 提取name和country
  185. name = (String) data.get("name");
  186. country = (String) data.get("country");
  187. // 打印获取到的数据
  188. System.out.println("Name: " + name);
  189. System.out.println("Country: " + country);
  190. } else {
  191. System.out.println("Data is null");
  192. }
  193. } else {
  194. System.out.println("Response body is null");
  195. }
  196. } else {
  197. System.out.println("Request failed with status code: " + response.getStatusCode());
  198. }
  199. } catch (Exception e) {
  200. System.out.println("Error: " + e.getMessage());
  201. // 设置默认的 country 值
  202. country = "未知";
  203. }
  204. user.setJwcode(jwcode);
  205. user.setName( name);
  206. user.setMarket(country);
  207. logger.info("新添用户");
  208. userService.addUser(user);
  209. logger.info("用户添加成功");
  210. user = userService.selectAllUser(String.valueOf(jwcode));
  211. }
  212. if(currentMonth.getValue() >= 7){
  213. user.setCurrentFreeJune(user.getCurrentFreeJune().add(BigDecimal.valueOf(free)));
  214. }
  215. if(currentMonth.getValue() <7){
  216. user.setCurrentFreeDecember(user.getCurrentFreeDecember().add(BigDecimal.valueOf(free)));
  217. }
  218. user.setCurrentPermanentGold(user.getCurrentPermanentGold().add(BigDecimal.valueOf(buy_jb)));
  219. user.setCurrentTaskGold(user.getCurrentTaskGold().add(BigDecimal.valueOf(core_jb)));
  220. if(validZeroTypes.contains(gtype)) {
  221. user.setRechargeNum(user.getRechargeNum() + 1);
  222. user.setSumPermanentGold(user.getSumPermanentGold().add(BigDecimal.valueOf(buy_jb)));
  223. user.setSumTaskGold(user.getSumTaskGold().add(BigDecimal.valueOf(core_jb)));
  224. if(currentMonth.getValue() >= 7){
  225. user.setSumFreeJune(user.getSumFreeJune().add(BigDecimal.valueOf(free)));
  226. }
  227. if(currentMonth.getValue() < 7){
  228. user.setSumFreeDecember(user.getSumFreeDecember().add(BigDecimal.valueOf(free)));
  229. }
  230. }
  231. if (validOneTypes.contains(gtype)){
  232. user.setConsumeNum(user.getConsumeNum() + 1);
  233. user.setSumConsumePermanent(user.getSumConsumePermanent().add(BigDecimal.valueOf(buy_jb)));
  234. user.setSumConsumeTask(user.getSumConsumeTask().add(BigDecimal.valueOf(core_jb)));
  235. user.setSumConsumeFree(user.getSumConsumeFree().add(BigDecimal.valueOf(free)));
  236. }
  237. userService.updateAllGold(user);
  238. }
  239. mysqlStmt.executeBatch(); // 批量插入
  240. }
  241. }
  242. logger.info("数据同步完成");
  243. } catch (SQLException e) {
  244. logger.error("数据连接失败", e.getMessage());
  245. throw new RuntimeException("数据链接失败", e);
  246. }
  247. }
  248. }