package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; import com.vincent.rsf.server.manager.partition.AsnLogPartitionSupport; import com.vincent.rsf.server.manager.mapper.AsnOrderItemLogMapper; import com.vincent.rsf.server.manager.entity.AsnOrderItemLog; import com.vincent.rsf.server.manager.service.AsnOrderItemLogService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Service("asnOrderItemLogService") public class AsnOrderItemLogServiceImpl extends ServiceImpl implements AsnOrderItemLogService { @Autowired private AsnLogPartitionSupport partitionSupport; @Override public boolean save(AsnOrderItemLog entity) { if (entity == null) { return false; } String tableName = partitionSupport.resolveOrderItemLogTable(entity.getCreateTime()); partitionSupport.ensureTableExists(AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName); return partitionSupport.executeOnTable(AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> super.save(entity)); } @Override public boolean saveBatch(Collection entityList) { return saveBatch(entityList, DEFAULT_BATCH_SIZE); } @Override public boolean saveBatch(Collection entityList, int batchSize) { if (entityList == null || entityList.isEmpty()) { return false; } Map> grouped = new LinkedHashMap<>(); for (AsnOrderItemLog entity : entityList) { String tableName = partitionSupport.resolveOrderItemLogTable(entity == null ? null : entity.getCreateTime()); grouped.computeIfAbsent(tableName, key -> new ArrayList<>()).add(entity); } boolean success = true; for (Map.Entry> entry : grouped.entrySet()) { partitionSupport.ensureTableExists(AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, entry.getKey()); Boolean saved = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, entry.getKey(), () -> super.saveBatch(entry.getValue(), batchSize) ); success = success && Boolean.TRUE.equals(saved); } return success; } @Override public boolean saveBatchToDate(Collection entityList, Date partitionDate) { if (entityList == null || entityList.isEmpty()) { return false; } String tableName = partitionSupport.resolveOrderItemLogTable(partitionDate); partitionSupport.ensureTableExists(AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName); return partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> super.saveBatch(entityList, DEFAULT_BATCH_SIZE) ); } @Override public AsnOrderItemLog getById(Serializable id) { if (id == null) { return null; } for (String tableName : partitionSupport.listOrderItemLogTables()) { AsnOrderItemLog record = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> baseMapper.selectById(id) ); if (record != null) { return record; } } return null; } @Override public List listByIds(Collection idList) { if (idList == null || idList.isEmpty()) { return Collections.emptyList(); } Map merged = new LinkedHashMap<>(); for (String tableName : partitionSupport.listOrderItemLogTables()) { List part = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> baseMapper.selectBatchIds(idList) ); mergeRecords(merged, part); } return sortRecords(new ArrayList<>(merged.values())); } @Override public List list() { return list((Wrapper) null); } @Override public List list(Wrapper queryWrapper) { Map merged = new LinkedHashMap<>(); for (String tableName : partitionSupport.listOrderItemLogTables()) { List part = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> baseMapper.selectList(queryWrapper) ); mergeRecords(merged, part); } return sortRecords(new ArrayList<>(merged.values())); } @Override public AsnOrderItemLog getOne(Wrapper queryWrapper) { List records = list(queryWrapper); return records.isEmpty() ? null : records.get(0); } @Override public > E page(E page, Wrapper queryWrapper) { List records = list(queryWrapper); long current = page.getCurrent() <= 0 ? 1L : page.getCurrent(); long size = page.getSize() <= 0 ? records.size() : page.getSize(); int fromIndex = (int) Math.min((current - 1) * size, records.size()); int toIndex = (int) Math.min(fromIndex + size, records.size()); page.setTotal(records.size()); page.setRecords(fromIndex >= records.size() ? Collections.emptyList() : new ArrayList<>(records.subList(fromIndex, toIndex))); return page; } @Override public boolean updateById(AsnOrderItemLog entity) { if (entity == null || entity.getId() == null) { return false; } String tableName = locateTableById(entity.getId()); if (tableName == null) { return false; } return partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> super.updateById(entity) ); } @Override public boolean removeById(Serializable id) { if (id == null) { return false; } String tableName = locateTableById(id); if (tableName == null) { return false; } return partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> super.removeById(id) ); } @Override public boolean removeByIds(Collection list) { if (list == null || list.isEmpty()) { return false; } Map> groupedIds = new LinkedHashMap<>(); for (Object idObj : list) { if (!(idObj instanceof Serializable)) { continue; } Serializable id = (Serializable) idObj; String tableName = locateTableById(id); if (tableName != null) { groupedIds.computeIfAbsent(tableName, key -> new ArrayList<>()).add(id); } } boolean removed = false; for (Map.Entry> entry : groupedIds.entrySet()) { Boolean partRemoved = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, entry.getKey(), () -> super.removeByIds(entry.getValue()) ); removed = removed || Boolean.TRUE.equals(partRemoved); } return removed; } @Override public boolean remove(Wrapper queryWrapper) { int affected = 0; for (String tableName : partitionSupport.listOrderItemLogTables()) { Integer count = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> baseMapper.delete(queryWrapper) ); affected += count == null ? 0 : count; } return SqlHelper.retBool(affected); } private String locateTableById(Serializable id) { for (String tableName : partitionSupport.listOrderItemLogTables()) { AsnOrderItemLog record = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_ITEM_LOG_TABLE, tableName, () -> baseMapper.selectById(id) ); if (record != null) { return tableName; } } return null; } private void mergeRecords(Map merged, List records) { if (records == null || records.isEmpty()) { return; } for (AsnOrderItemLog record : records) { if (record == null || record.getId() == null) { continue; } merged.putIfAbsent(record.getId(), record); } } private List sortRecords(List records) { records.sort(Comparator.comparing(AsnOrderItemLog::getId, Comparator.nullsLast(Long::compareTo)).reversed()); return records; } }