Browse Source

3.12 数据更新

huangqizheng/feature-20260309142559-钱包退款
huangqizhen 4 weeks ago
parent
commit
34f8577c0f
  1. 93
      src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java
  2. 2
      src/main/java/com/example/demo/mapper/coin/WalletMapper.java
  3. 4
      src/main/java/com/example/demo/service/Wallet/WalletService.java
  4. 12
      src/main/java/com/example/demo/serviceImpl/Wallet/WalletServiceImpl.java
  5. 11
      src/main/resources/mapper/WalletMapper.xml

93
src/main/java/com/example/demo/Mysql/MysqlServiceImpl.java

@ -27,6 +27,7 @@ import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.Date;
import java.util.stream.Collectors;
@Service
@ -266,6 +267,10 @@ public class MysqlServiceImpl implements MysqlService {
// 👇 执行批量插入
int[] results = mysqlStmt.executeBatch();
logger.info("成功插入新记录 {} 条", results.length);
// 👉新增一行调用👈
// 传入当前连接 + 本批次记录自动完成路由更新
updateUserRegionWallet(mysqlConn, batchRecords);
}
offset += pageSize;
@ -281,10 +286,12 @@ public class MysqlServiceImpl implements MysqlService {
static class RecordData {
int gtype, jwcode, free, core_jb, buy_jb;
Integer permanent_gold;
Timestamp cz_time;
String cz_user, cz_bz, operation_platform, goods_name, uid;
String orderNumber; // 预生成避免重复计算
String linkId;
}
private RecordData extractRecordData(ResultSet rs) throws SQLException {
@ -552,4 +559,90 @@ public class MysqlServiceImpl implements MysqlService {
return defaultValue;
}
/**
* g_order 获取 pay_style路由更新 user_region_wallet 余额
* @param mysqlConn 当前事务连接️必须使用此连接
* @param records 本批次有效记录
*/
private void updateUserRegionWallet(Connection mysqlConn, List<RecordData> records) {
if (records == null || records.isEmpty()) return;
// 1. 收集 jwcode 去重
List<Integer> jwcodes = records.stream()
.map(r -> r.jwcode).filter(Objects::nonNull).distinct()
.collect(Collectors.toList());
if (jwcodes.isEmpty()) return;
// 2. 批量查 g_order 获取 pay_stylestate=1 支付完成
String inSql = String.join(",", Collections.nCopies(jwcodes.size(), "?"));
String querySql = "SELECT jwcode, pay_style FROM g_order WHERE jwcode IN (" + inSql + ") AND state = 1";
Map<Integer, Integer> jwcodePayStyleMap = new HashMap<>();
try (PreparedStatement stmt = mysqlConn.prepareStatement(querySql)) {
for (int i = 0; i < jwcodes.size(); i++) stmt.setInt(i + 1, jwcodes.get(i));
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) jwcodePayStyleMap.put(rs.getInt("jwcode"), rs.getInt("pay_style"));
}
} catch (SQLException e) {
throw new RuntimeException("查询 g_order 失败", e);
}
// 3. pay_style 路由到 wallet_id累加永久金币
Map<String, Integer> userWalletGoldMap = new HashMap<>(); // key: "jwcode_walletId" -> 累加金额
for (RecordData data : records) {
if (!jwcodePayStyleMap.containsKey(data.jwcode)) continue;
if (data.permanent_gold == null || data.permanent_gold <= 0) continue;
Integer payStyle = jwcodePayStyleMap.get(data.jwcode);
Integer walletId = mapPayStyleToWalletId(payStyle);
if (walletId == null) continue;
String key = data.jwcode + "_" + walletId;
userWalletGoldMap.merge(key, data.permanent_gold, Integer::sum);
}
if (userWalletGoldMap.isEmpty()) return;
// 4. UPSERT 批量更新 user_region_wallet不存在则插入存在则累加
String upsertSql = """
INSERT INTO user_region_wallet
(jwcode, wallet_id, current_permanent_gold, create_time, update_time)
VALUES (?, ?, ?, NOW(), NOW())
ON DUPLICATE KEY UPDATE
current_permanent_gold = current_permanent_gold + VALUES(current_permanent_gold),
update_time = NOW()
""";
try (PreparedStatement stmt = mysqlConn.prepareStatement(upsertSql)) {
for (Map.Entry<String, Integer> entry : userWalletGoldMap.entrySet()) {
String[] parts = entry.getKey().split("_");
int jwcode = Integer.parseInt(parts[0]);
int walletId = Integer.parseInt(parts[1]);
stmt.setInt(1, jwcode);
stmt.setString(2, String.valueOf(walletId));
stmt.setInt(3, entry.getValue());
stmt.addBatch();
}
int[] results = stmt.executeBatch();
logger.info("✅ 地区钱包余额更新 {} 条", results.length);
} catch (SQLException e) {
throw new RuntimeException("更新地区钱包失败", e);
}
}
/**
* pay_style wallet_id 映射 请替换成你实际的 wallet_id
*/
private Integer mapPayStyleToWalletId(Integer payStyle) {
if (payStyle == null) return null;
return switch (payStyle) {
case 3,4,9 -> 4; // 微信/支付宝 华东钱包
case 5,6 -> 1; // Stripe/PaymentAsia 华南钱包
case 7 -> 3; // 其他 西南钱包
case 10 -> 7;
case 15 -> 2;
default -> null;
};
}
}

2
src/main/java/com/example/demo/mapper/coin/WalletMapper.java

@ -1,5 +1,6 @@
package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.GOrder;
import com.example.demo.domain.entity.UserRegionWallet;
import com.example.demo.domain.entity.UserWalletRecord;
import com.example.demo.domain.entity.Wallet;
@ -21,4 +22,5 @@ public interface WalletMapper {
UserRegionWallet selectWallet(Integer jwcode, Integer walletId);
List<UserWalletRecord> selectWalletRecord(Integer jwcode, String orderCode);
void updateWalletRecord(Integer id);
GOrder MysqlConnection(String linkId);
}

4
src/main/java/com/example/demo/service/Wallet/WalletService.java

@ -1,5 +1,6 @@
package com.example.demo.service.Wallet;
import com.example.demo.domain.entity.GOrder;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.entity.UserRegionWallet;
import com.example.demo.domain.entity.UserWalletRecord;
@ -19,5 +20,6 @@ public interface WalletService {
void updateUserGoldRecord(UserRegionWallet userRegionWallet);
List<UserWalletRecord> selectUserWalletRecord(Integer jwcode, String orderCode);
void updateUserWalletRecord(Integer id);
// void MysqlConnection();
GOrder MysqlConnection(String linkId);
}

12
src/main/java/com/example/demo/serviceImpl/Wallet/WalletServiceImpl.java

@ -1,6 +1,7 @@
package com.example.demo.serviceImpl.Wallet;
import com.example.demo.Util.BusinessException;
import com.example.demo.domain.entity.GOrder;
import com.example.demo.domain.entity.UserGoldRecord;
import com.example.demo.domain.entity.UserRegionWallet;
import com.example.demo.domain.entity.UserWalletRecord;
@ -57,4 +58,15 @@ public class WalletServiceImpl implements WalletService {
public void updateUserWalletRecord(Integer id) {
walletMapper.updateWalletRecord(id);
}
@Override
public GOrder MysqlConnection(String linkId) {
if (linkId == null)
throw new SystemException("连接ID传参错误");
GOrder gOrder = walletMapper.MysqlConnection(linkId);
if (gOrder == null)
throw new BusinessException("该连接ID不存在");
return gOrder;
}
}

11
src/main/resources/mapper/WalletMapper.xml

@ -24,4 +24,15 @@
id
from user_wallet_record where jwcode = {jwcode} and oreder_code = {orderCode}
</select>
<select id="MysqlConnection" resultType="com.example.demo.domain.entity.GOrder">
select id,
jwcode,
order_no,
type,
merchant_id,
price,
count,
pay_style,
from g_order where id = {linkId}
</select>
</mapper>
Loading…
Cancel
Save