package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.WkOrder; import com.vincent.rsf.server.manager.entity.WkOrderItem; import com.vincent.rsf.server.manager.entity.AsnOrderItemLog; import com.vincent.rsf.server.manager.enums.AsnExceStatus; import com.vincent.rsf.server.manager.mapper.AsnOrderMapper; import com.vincent.rsf.server.manager.mapper.AsnOrderLogMapper; import com.vincent.rsf.server.manager.entity.AsnOrderLog; import com.vincent.rsf.server.manager.partition.AsnLogPartitionSupport; import com.vincent.rsf.server.manager.service.AsnOrderItemLogService; import com.vincent.rsf.server.manager.service.AsnOrderItemService; import com.vincent.rsf.server.manager.service.AsnOrderLogService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @Service("asnOrderLogService") public class AsnOrderLogServiceImpl extends ServiceImpl implements AsnOrderLogService { @Autowired private AsnLogPartitionSupport partitionSupport; @Autowired private AsnOrderItemLogService asnOrderItemLogService; @Autowired private AsnOrderItemService asnOrderItemService; @Autowired private AsnOrderMapper asnOrderMapper; /** * @author Ryan * @description 继续收货 * @param * @return * @time 2025/4/17 15:08 */ @Override @Transactional(rollbackFor = Exception.class) public R continueRecipt(Long id) { AsnOrderLog orderLog = this.getById(id); if (Objects.isNull(orderLog)) { throw new CoolException("单据不存在!!"); } WkOrder order = new WkOrder(); BeanUtils.copyProperties(orderLog, order); order.setId(orderLog.getAsnId()) .setDeleted(0) .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val); WkOrder wkOrder = asnOrderMapper.selectOne(new LambdaQueryWrapper().eq(WkOrder::getCode, orderLog.getCode())); if (!Objects.isNull(wkOrder)) { throw new CoolException("收货单据已添加,刷新后再操作!!"); } if (asnOrderMapper.insert(order) <= 0) { throw new CoolException("单据保存失败!!"); } List itemLogs = asnOrderItemLogService .list(new LambdaQueryWrapper() .eq(AsnOrderItemLog::getLogId, id)); List orderItems = new ArrayList<>(); if (!Objects.isNull(itemLogs) && !itemLogs.isEmpty()) { for (AsnOrderItemLog itemLog : itemLogs) { WkOrderItem item = new WkOrderItem(); BeanUtils.copyProperties(itemLog, item); item.setId(itemLog.getAsnItemId()) .setOrderId(order.getId()) .setMatnrId(itemLog.getMatnrId()) .setDeleted(0); orderItems.add(item); } if (!asnOrderItemService.saveOrUpdateBatch(orderItems)) { throw new CoolException("明细保存失败"); } } if (!this.removeById(orderLog.getId())) { throw new CoolException("历史单据删除失败!!"); } if (!asnOrderItemLogService.remove(new LambdaQueryWrapper() .eq(AsnOrderItemLog::getLogId, orderLog.getId()))) { throw new CoolException("历史单据明细删除失败!!"); } return R.ok(); } @Override public boolean save(AsnOrderLog entity) { if (entity == null) { return false; } String tableName = partitionSupport.resolveOrderLogTable(entity.getCreateTime()); partitionSupport.ensureTableExists(AsnLogPartitionSupport.ORDER_LOG_TABLE, tableName); return partitionSupport.executeOnTable(AsnLogPartitionSupport.ORDER_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 (AsnOrderLog entity : entityList) { String tableName = partitionSupport.resolveOrderLogTable(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_LOG_TABLE, entry.getKey()); Boolean saved = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_LOG_TABLE, entry.getKey(), () -> super.saveBatch(entry.getValue(), batchSize) ); success = success && Boolean.TRUE.equals(saved); } return success; } @Override public AsnOrderLog getById(Serializable id) { if (id == null) { return null; } for (String tableName : partitionSupport.listOrderLogTables()) { AsnOrderLog record = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_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.listOrderLogTables()) { List part = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_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.listOrderLogTables()) { List part = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_LOG_TABLE, tableName, () -> baseMapper.selectList(queryWrapper) ); mergeRecords(merged, part); } return sortRecords(new ArrayList<>(merged.values())); } @Override public AsnOrderLog 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(AsnOrderLog entity) { if (entity == null || entity.getId() == null) { return false; } String tableName = locateTableById(entity.getId()); if (tableName == null) { return false; } return partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_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_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_LOG_TABLE, entry.getKey(), () -> super.removeByIds(entry.getValue()) ); removed = removed || Boolean.TRUE.equals(partRemoved); } return removed; } private String locateTableById(Serializable id) { for (String tableName : partitionSupport.listOrderLogTables()) { AsnOrderLog record = partitionSupport.executeOnTable( AsnLogPartitionSupport.ORDER_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 (AsnOrderLog record : records) { if (record == null || record.getId() == null) { continue; } merged.putIfAbsent(record.getId(), record); } } private List sortRecords(List records) { records.sort(Comparator.comparing(AsnOrderLog::getId, Comparator.nullsLast(Long::compareTo)).reversed()); return records; } }