This commit is contained in:
2026-08-07 17:46:23 +08:00
parent 98ac9840c2
commit 645c483649
22 changed files with 370 additions and 29 deletions
@@ -0,0 +1,21 @@
package com.baiyue.firstleg.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@TableName("fl_price_warehouse_mapping")
public class PriceWarehouseMappingEntity {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String sourceType;
private String sourceValue;
private Long warehouseId;
private String warehouseCode;
private String warehouseType;
private String status;
}
@@ -0,0 +1,6 @@
package com.baiyue.firstleg.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baiyue.firstleg.entity.PriceWarehouseMappingEntity;
public interface PriceWarehouseMappingMapper extends BaseMapper<PriceWarehouseMappingEntity> {}
@@ -7,11 +7,13 @@ import com.baiyue.firstleg.entity.PriceBookChannelEntity;
import com.baiyue.firstleg.entity.PriceBookVersionEntity;
import com.baiyue.firstleg.entity.PriceChannelCatalogEntity;
import com.baiyue.firstleg.entity.PriceOriginAliasEntity;
import com.baiyue.firstleg.entity.PriceWarehouseMappingEntity;
import com.baiyue.firstleg.mapper.CarrierFbaRateMapper;
import com.baiyue.firstleg.mapper.PriceBookChannelMapper;
import com.baiyue.firstleg.mapper.PriceBookVersionMapper;
import com.baiyue.firstleg.mapper.PriceChannelCatalogMapper;
import com.baiyue.firstleg.mapper.PriceOriginAliasMapper;
import com.baiyue.firstleg.mapper.PriceWarehouseMappingMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Repository;
@@ -25,6 +27,7 @@ public class PriceBookRepository {
@Resource private CarrierFbaRateMapper rates;
@Resource private PriceChannelCatalogMapper catalog;
@Resource private PriceOriginAliasMapper aliases;
@Resource private PriceWarehouseMappingMapper warehouseMappings;
public int insertVersion(PriceBookVersionEntity value) { return versions.insert(value); }
public int updateVersion(PriceBookVersionEntity value) {
@@ -109,6 +112,11 @@ public class PriceBookRepository {
return aliases.selectList(new LambdaQueryWrapper<PriceOriginAliasEntity>()
.eq(PriceOriginAliasEntity::getStatus, "ACTIVE"));
}
public List<PriceWarehouseMappingEntity> activeWarehouseMappings() {
return warehouseMappings.selectList(new LambdaQueryWrapper<PriceWarehouseMappingEntity>()
.eq(PriceWarehouseMappingEntity::getStatus, "ACTIVE")
.orderByAsc(PriceWarehouseMappingEntity::getId));
}
public void supersede(PriceBookVersionEntity old, LocalDateTime at, long operatorId) {
old.setStatus("SUPERSEDED"); old.setSupersededAt(at); old.setUpdatedBy(operatorId); old.setUpdatedAt(at);
updateVersion(old);
@@ -16,6 +16,7 @@ import com.baiyue.firstleg.entity.CarrierFbaRateEntity;
import com.baiyue.firstleg.entity.PriceBookChannelEntity;
import com.baiyue.firstleg.entity.PriceBookVersionEntity;
import com.baiyue.firstleg.entity.PriceChannelCatalogEntity;
import com.baiyue.firstleg.entity.PriceWarehouseMappingEntity;
import com.baiyue.firstleg.pricing.importer.PriceWorkbookParseResult;
import com.baiyue.firstleg.pricing.importer.PriceWorkbookParser;
import com.baiyue.firstleg.repository.PriceBookRepository;
@@ -262,7 +263,37 @@ public class PlatformPriceBookService {
List<PriceBookDtos.ParseIssue> issues = parsed.issues().stream().map(value -> issue(
value.severity() == PriceWorkbookParseResult.Severity.ERROR ? "BLOCKING" : "WARNING",
value.code(), value.message(), value.sheetName(), value.rowNumber(), null)).toList();
return new ParsedPriceBook(channels, rates, issues);
return new ParsedPriceBook(channels, applyInitializedWarehouseMappings(rates), issues);
}
private List<PriceBookDtos.ParsedRate> applyInitializedWarehouseMappings(List<PriceBookDtos.ParsedRate> rates) {
Map<String, PriceWarehouseMappingEntity> origins = new HashMap<>();
Map<String, PriceWarehouseMappingEntity> overseas = new HashMap<>();
for (PriceWarehouseMappingEntity mapping : repository.activeWarehouseMappings()) {
if (mapping == null || mapping.getWarehouseId() == null || mapping.getWarehouseId() <= 0) continue;
if ("ORIGIN_CODE".equals(mapping.getSourceType())
&& "DOMESTIC".equals(mapping.getWarehouseType())
&& mappingKey(mapping.getSourceValue()).equals(mappingKey(mapping.getWarehouseCode()))) {
origins.putIfAbsent(mappingKey(mapping.getSourceValue()), mapping);
} else if ("OVERSEAS_NAME".equals(mapping.getSourceType())
&& "OVERSEAS".equals(mapping.getWarehouseType())
&& StringUtils.hasText(mapping.getWarehouseCode())) {
overseas.putIfAbsent(mappingKey(mapping.getSourceValue()), mapping);
}
}
return rates.stream().map(rate -> {
PriceWarehouseMappingEntity origin = origins.get(mappingKey(rate.originWarehouseCode()));
PriceWarehouseMappingEntity destination = rate.destinationType() == PricingDestinationType.OVERSEAS
? overseas.get(mappingKey(rate.destinationName())) : null;
return new PriceBookDtos.ParsedRate(rate.id(), rate.channelCode(), rate.priceModel(),
origin == null ? rate.originWarehouseId() : origin.getWarehouseId(),
rate.originWarehouseCode(), rate.originWarehouseName(),
destination == null ? rate.destinationCode() : mappingKey(destination.getWarehouseCode()), rate.destinationType(),
destination == null ? rate.destinationWarehouseId() : destination.getWarehouseId(),
rate.destinationName(), rate.regionCode(), rate.pricingTaxMode(), rate.chargeUnit(), rate.weightFromKg(),
rate.unitPrice(), rate.currency(), rate.sourceSheetName(), rate.sourceRowNumber(),
rate.sourceDestinationText(), rate.remark());
}).toList();
}
private PriceBookDtos.ParsedRate parsedRate(String channelCode, PriceModel model,