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.
278 lines
15 KiB
278 lines
15 KiB
package com.example.demo.Mysql;
|
|
|
|
|
|
import com.example.demo.Util.BaseDES;
|
|
import com.example.demo.domain.entity.User;
|
|
import com.example.demo.service.coin.AdminService;
|
|
import com.example.demo.service.coin.UserService;
|
|
import org.apache.commons.lang3.ObjectUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.http.*;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
import javax.sql.DataSource;
|
|
import java.math.BigDecimal;
|
|
import java.sql.*;
|
|
import java.time.LocalDateTime;
|
|
import java.time.Month;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.*;
|
|
|
|
|
|
@Service
|
|
@Transactional
|
|
public class MysqlServiceImpl implements MysqlService {
|
|
@Autowired
|
|
private RestTemplate restTemplate;
|
|
|
|
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));
|
|
Set<Integer> validOneTypes = new HashSet<>(Arrays.asList(9, 15, 17, 25, 27, 37, 41, 42, 43, 50, 51, 62));
|
|
Set<Integer> validTwoTypes = new HashSet<>(Arrays.asList(52,61));
|
|
Set<Integer> validThreeTypes = new HashSet<>(Arrays.asList(10, 16, 30, 31, 32, 33, 34, 39, 44));
|
|
Set<Integer> validFourTypes = new HashSet<>(Arrays.asList(55, 56, 57, 58, 59, 63, 64, 65));
|
|
LocalDateTime now = LocalDateTime.now();
|
|
Month currentMonth = now.getMonth();
|
|
@Autowired
|
|
private AdminService adminService;
|
|
@Autowired
|
|
private UserService userService;
|
|
|
|
|
|
@Autowired
|
|
@Qualifier("sqlserver1DataSource")
|
|
private DataSource sqlserver1DataSource;
|
|
|
|
@Autowired
|
|
@Qualifier("mysql1DataSource")
|
|
private DataSource mysql1DataSource;
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(MysqlServiceImpl.class);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
@Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
|
|
public void getSqlserverData() throws Exception {
|
|
logger.info("开始从 SQL Server 同步数据到 MySQL");
|
|
try (Connection sqlServerConn = sqlserver1DataSource.getConnection();
|
|
Connection mysqlConn = mysql1DataSource.getConnection()) {
|
|
logger.info("开始查询数据...");
|
|
// 从 SQL Server 查询数据
|
|
String querySql = "SELECT gtype,jwcode,free,core_jb,buy_jb,cz_time,cz_user,cz_bz,operation_platform,goods_name " +
|
|
"FROM user_gold_records WHERE flag=1 and cz_time> ?";
|
|
|
|
try (PreparedStatement sqlServerStmt = sqlServerConn.prepareStatement(querySql)) {
|
|
sqlServerStmt.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now().minusHours(1))); // 获取最近一小时的数据
|
|
ResultSet resultSet = sqlServerStmt.executeQuery();
|
|
logger.info("查询数据完毕!");
|
|
// 插入到 MySQL
|
|
//退款类型 61:ERP退款(退金币)
|
|
String insertSql = "INSERT INTO user_gold_record (order_code,jwcode,sum_gold,permanent_gold,free_june,free_december," +
|
|
"task_gold,pay_platform,goods_name,refund_type,refund_model,remark,type,admin_id," +
|
|
"audit_status,create_time,flag,update_time) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ";
|
|
try (PreparedStatement mysqlStmt = mysqlConn.prepareStatement(insertSql)) {
|
|
while (resultSet.next()) {
|
|
int gtype = resultSet.getInt("gtype");
|
|
Integer jwcode = resultSet.getInt("jwcode");
|
|
int free = resultSet.getInt("free");
|
|
int core_jb = resultSet.getInt("core_jb");
|
|
int buy_jb = resultSet.getInt("buy_jb");
|
|
Timestamp created_at = resultSet.getTimestamp("cz_time");
|
|
String name = resultSet.getString("cz_user");
|
|
String remark = resultSet.getString("cz_bz");
|
|
String operation_platform = resultSet.getString("operation_platform");
|
|
String goods_name = resultSet.getString("goods_name");
|
|
String timestampPart = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
|
|
|
|
if(StringUtils.isNumeric(name)){
|
|
Integer admin_id = Integer.valueOf(adminService.getId(name));
|
|
logger.info("用户传输完毕");
|
|
mysqlStmt.setInt(14, admin_id);
|
|
}else {
|
|
mysqlStmt.setInt(14, 99999);
|
|
}
|
|
|
|
Random random = new Random();
|
|
int randomNumber = random.nextInt(900) + 100;
|
|
// 判断gtype
|
|
|
|
mysqlStmt.setString(10,null);
|
|
mysqlStmt.setNull(11, java.sql.Types.INTEGER);
|
|
if(validFourTypes.contains(gtype)){
|
|
continue;
|
|
}
|
|
if(validZeroTypes.contains(gtype)){
|
|
mysqlStmt.setInt(13, 0);
|
|
mysqlStmt.setString(1, "ERPCZ"+timestampPart+randomNumber);
|
|
}
|
|
if(validOneTypes.contains(gtype)){
|
|
mysqlStmt.setInt(13, 1);
|
|
mysqlStmt.setString(1, "ERPXF"+timestampPart+randomNumber);
|
|
}
|
|
if(validTwoTypes.contains(gtype)){
|
|
mysqlStmt.setInt(13, 2);
|
|
mysqlStmt.setString(1, "ERPTK"+timestampPart+randomNumber);
|
|
mysqlStmt.setString(10,"退款商品");
|
|
mysqlStmt.setInt(11, 0);
|
|
}
|
|
if(validThreeTypes.contains(gtype)){
|
|
mysqlStmt.setInt(13, 3);
|
|
mysqlStmt.setString(1, "ERPQT"+timestampPart+randomNumber);
|
|
}
|
|
|
|
mysqlStmt.setInt(2, jwcode);
|
|
mysqlStmt.setInt(3, free+core_jb+buy_jb);
|
|
mysqlStmt.setInt(4,buy_jb);
|
|
// 判断月份
|
|
if(currentMonth.getValue() >= 7){
|
|
mysqlStmt.setInt(5, free);
|
|
mysqlStmt.setInt(6, 0);
|
|
}
|
|
if(currentMonth.getValue() < 7){
|
|
mysqlStmt.setInt(5, 0);
|
|
mysqlStmt.setInt(6, free);
|
|
}
|
|
mysqlStmt.setInt(7, core_jb);
|
|
if (operation_platform.equals("1")){
|
|
mysqlStmt.setString(8, "ERP");
|
|
}
|
|
else if (operation_platform.equals("2")){
|
|
mysqlStmt.setString(8, "HomilyLink");
|
|
}
|
|
else if(operation_platform.equals("3")){
|
|
mysqlStmt.setString(8, "HomilyChart");
|
|
}
|
|
else if(operation_platform.equals("4")){
|
|
continue;
|
|
}
|
|
else if(operation_platform.equals("0")){
|
|
mysqlStmt.setString(8, "初始化金币");
|
|
}
|
|
else {
|
|
mysqlStmt.setString(8, "其他");
|
|
}
|
|
mysqlStmt.setString(9, goods_name);
|
|
mysqlStmt.setString(12, remark);
|
|
mysqlStmt.setInt(15, 3);
|
|
mysqlStmt.setTimestamp(16, created_at);
|
|
if(remark.contains("测试")&&remark.contains("员工")){
|
|
mysqlStmt.setInt(17, 0);
|
|
}else {
|
|
mysqlStmt.setInt(17, 1);
|
|
}
|
|
mysqlStmt.setTimestamp(18, created_at);
|
|
|
|
// 更新时的值
|
|
mysqlStmt.addBatch();
|
|
logger.info("查询用户是否存在");
|
|
User user = userService.selectAllUser(String.valueOf(jwcode));
|
|
if(ObjectUtils.isEmpty(user)){
|
|
logger.info("用户不存在");
|
|
user = new User();
|
|
String country = "未知";
|
|
BaseDES des = new BaseDES();
|
|
String desjwcode= des.encrypt(String.valueOf(jwcode));
|
|
// System.out.println("desjwcode:"+desjwcode);
|
|
|
|
// 创建 JSON 请求体
|
|
Map<String, String> requestBody = new HashMap<>();
|
|
requestBody.put("jwcode", desjwcode);
|
|
|
|
// 设置请求头
|
|
HttpHeaders headers = new HttpHeaders();
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
|
// 创建 HttpEntity
|
|
HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
|
|
|
|
// 发送 POST 请求
|
|
try {
|
|
ResponseEntity<Map> response = restTemplate.exchange(
|
|
"http://hwapi.rzfwq.com/hwjnApp/hwhc-login/hwhclogin/hc/login/clent/info",
|
|
HttpMethod.POST, entity, Map.class);
|
|
|
|
// 检查响应状态码
|
|
if (response.getStatusCode().is2xxSuccessful()) {
|
|
Map<String, Object> responseBody = response.getBody();
|
|
if (responseBody != null) {
|
|
// 获取data部分
|
|
Map<String, Object> data = (Map<String, Object>) responseBody.get("data");
|
|
if (data != null) {
|
|
// 提取name和country
|
|
name = (String) data.get("name");
|
|
country = (String) data.get("country");
|
|
|
|
// 打印获取到的数据
|
|
System.out.println("Name: " + name);
|
|
System.out.println("Country: " + country);
|
|
} else {
|
|
System.out.println("Data is null");
|
|
}
|
|
} else {
|
|
System.out.println("Response body is null");
|
|
}
|
|
} else {
|
|
System.out.println("Request failed with status code: " + response.getStatusCode());
|
|
}
|
|
} catch (Exception e) {
|
|
System.out.println("Error: " + e.getMessage());
|
|
// 设置默认的 country 值
|
|
country = "未知";
|
|
}
|
|
|
|
user.setJwcode(jwcode);
|
|
user.setName( name);
|
|
user.setMarket(country);
|
|
logger.info("新添用户");
|
|
userService.addUser(user);
|
|
logger.info("用户添加成功");
|
|
user = userService.selectAllUser(String.valueOf(jwcode));
|
|
}
|
|
|
|
if(currentMonth.getValue() >= 7){
|
|
user.setCurrentFreeJune(user.getCurrentFreeJune().add(BigDecimal.valueOf(free)));
|
|
}
|
|
if(currentMonth.getValue() <7){
|
|
user.setCurrentFreeDecember(user.getCurrentFreeDecember().add(BigDecimal.valueOf(free)));
|
|
}
|
|
|
|
user.setCurrentPermanentGold(user.getCurrentPermanentGold().add(BigDecimal.valueOf(buy_jb)));
|
|
user.setCurrentTaskGold(user.getCurrentTaskGold().add(BigDecimal.valueOf(core_jb)));
|
|
if(validZeroTypes.contains(gtype)) {
|
|
user.setRechargeNum(user.getRechargeNum() + 1);
|
|
user.setSumPermanentGold(user.getSumPermanentGold().add(BigDecimal.valueOf(buy_jb)));
|
|
user.setSumTaskGold(user.getSumTaskGold().add(BigDecimal.valueOf(core_jb)));
|
|
if(currentMonth.getValue() >= 7){
|
|
user.setSumFreeJune(user.getSumFreeJune().add(BigDecimal.valueOf(free)));
|
|
}
|
|
if(currentMonth.getValue() < 7){
|
|
user.setSumFreeDecember(user.getSumFreeDecember().add(BigDecimal.valueOf(free)));
|
|
}
|
|
}
|
|
if (validOneTypes.contains(gtype)){
|
|
user.setConsumeNum(user.getConsumeNum() + 1);
|
|
user.setSumConsumePermanent(user.getSumConsumePermanent().add(BigDecimal.valueOf(buy_jb)));
|
|
user.setSumConsumeTask(user.getSumConsumeTask().add(BigDecimal.valueOf(core_jb)));
|
|
user.setSumConsumeFree(user.getSumConsumeFree().add(BigDecimal.valueOf(free)));
|
|
}
|
|
userService.updateAllGold(user);
|
|
|
|
}
|
|
mysqlStmt.executeBatch(); // 批量插入
|
|
}
|
|
}
|
|
logger.info("数据同步完成");
|
|
} catch (SQLException e) {
|
|
logger.error("数据连接失败", e.getMessage());
|
|
throw new RuntimeException("数据链接失败", e);
|
|
}
|
|
}
|
|
}
|