|
@@ -53,6 +53,8 @@ import org.springframework.stereotype.Service;
|
|
|
import com.fs.his.mapper.FsStoreProductMapper;
|
|
import com.fs.his.mapper.FsStoreProductMapper;
|
|
|
import com.fs.his.mapper.FsStoreMapper;
|
|
import com.fs.his.mapper.FsStoreMapper;
|
|
|
import com.fs.his.service.IFsStoreProductService;
|
|
import com.fs.his.service.IFsStoreProductService;
|
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -63,6 +65,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
*/
|
|
*/
|
|
|
@Service
|
|
@Service
|
|
|
public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(FsStoreProductServiceImpl.class);
|
|
|
private static final DateTimeFormatter ERP_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
private static final DateTimeFormatter ERP_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
private static final int MAX_QUERY_RANGE_DAYS = 7;
|
|
private static final int MAX_QUERY_RANGE_DAYS = 7;
|
|
|
private static final int DEFAULT_ERP_PAGE_SIZE = 100;
|
|
private static final int DEFAULT_ERP_PAGE_SIZE = 100;
|
|
@@ -265,24 +268,21 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(attrValueMap);
|
|
List<FsStoreProductAttrValue> values = fsStoreProductAttrValueMapper.selectFsStoreProductAttrValueList(attrValueMap);
|
|
|
|
|
|
|
|
if (values != null && values.size() == 1) {
|
|
if (values != null && values.size() == 1) {
|
|
|
- valueMap.put("id", values.get(0).getId());
|
|
|
|
|
- valueMap.put("sku", values.get(0).getSku());
|
|
|
|
|
- valueMap.put("image", values.get(0).getImage());
|
|
|
|
|
- valueMap.put("price", values.get(0).getPrice());
|
|
|
|
|
- valueMap.put("cost", values.get(0).getCost());
|
|
|
|
|
- valueMap.put("otPrice", values.get(0).getOtPrice());
|
|
|
|
|
- valueMap.put("stock", values.get(0).getStock());
|
|
|
|
|
- valueMap.put("barCode", values.get(0).getBarCode());
|
|
|
|
|
- valueMap.put("groupBarCode", values.get(0).getGroupBarCode());
|
|
|
|
|
- valueMap.put("weight", values.get(0).getWeight());
|
|
|
|
|
- valueMap.put("volume", values.get(0).getVolume());
|
|
|
|
|
- valueMap.put("doctorBrokerage", values.get(0).getDoctorBrokerage());
|
|
|
|
|
-
|
|
|
|
|
- valueMap.put("brokerage", values.get(0).getBrokerage());
|
|
|
|
|
-// valueMap.put("brokerageTwo", values.get(0).getBrokerageTwo());
|
|
|
|
|
-// valueMap.put("brokerageThree", values.get(0).getBrokerageThree());
|
|
|
|
|
- System.out.println("积分 :" + values.get(0).getGiveIntegral());
|
|
|
|
|
- valueMap.put("giveIntegral", values.get(0).getGiveIntegral());
|
|
|
|
|
|
|
+ FsStoreProductAttrValue dbVal = values.get(0);
|
|
|
|
|
+ valueMap.put("id", dbVal.getId());
|
|
|
|
|
+ valueMap.put("sku", dbVal.getSku());
|
|
|
|
|
+ valueMap.put("image", dbVal.getImage());
|
|
|
|
|
+ valueMap.put("price", dbVal.getPrice() != null ? dbVal.getPrice() : 0);
|
|
|
|
|
+ valueMap.put("cost", dbVal.getCost() != null ? dbVal.getCost() : 0);
|
|
|
|
|
+ valueMap.put("otPrice", dbVal.getOtPrice() != null ? dbVal.getOtPrice() : 0);
|
|
|
|
|
+ valueMap.put("stock", dbVal.getStock() != null ? dbVal.getStock() : 0);
|
|
|
|
|
+ valueMap.put("barCode", dbVal.getBarCode());
|
|
|
|
|
+ valueMap.put("groupBarCode", dbVal.getGroupBarCode());
|
|
|
|
|
+ valueMap.put("weight", dbVal.getWeight() != null ? dbVal.getWeight() : 0);
|
|
|
|
|
+ valueMap.put("volume", dbVal.getVolume() != null ? dbVal.getVolume() : 0);
|
|
|
|
|
+ valueMap.put("doctorBrokerage", dbVal.getDoctorBrokerage() != null ? dbVal.getDoctorBrokerage() : 0);
|
|
|
|
|
+ valueMap.put("brokerage", dbVal.getBrokerage() != null ? dbVal.getBrokerage() : 0);
|
|
|
|
|
+ valueMap.put("giveIntegral", dbVal.getGiveIntegral() != null ? dbVal.getGiveIntegral() : 0);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
valueMapList.add(ObjectUtil.clone(valueMap));
|
|
valueMapList.add(ObjectUtil.clone(valueMap));
|
|
@@ -494,7 +494,9 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
product.setBarCode(param.getValues().get(0).getBarCode());
|
|
product.setBarCode(param.getValues().get(0).getBarCode());
|
|
|
product.setGiveIntegral(new BigDecimal(countDto.getMinIntegral()));
|
|
product.setGiveIntegral(new BigDecimal(countDto.getMinIntegral()));
|
|
|
product.setStock(countDto.getStock());
|
|
product.setStock(countDto.getStock());
|
|
|
|
|
+ normalizeStoreAttributionOnProduct(product, param);
|
|
|
fsStoreProductMapper.updateFsStoreProduct(product);
|
|
fsStoreProductMapper.updateFsStoreProduct(product);
|
|
|
|
|
+ syncStoreAttributionAfterSave(product.getProductId(), param);
|
|
|
if (param.getSpecType().equals(0)) {
|
|
if (param.getSpecType().equals(0)) {
|
|
|
ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()
|
|
ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()
|
|
|
.value("规格")
|
|
.value("规格")
|
|
@@ -564,6 +566,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
product.setBarCode(param.getValues().get(0).getBarCode());
|
|
product.setBarCode(param.getValues().get(0).getBarCode());
|
|
|
product.setGiveIntegral(new BigDecimal(countDto.getMinIntegral()));
|
|
product.setGiveIntegral(new BigDecimal(countDto.getMinIntegral()));
|
|
|
product.setStock(countDto.getStock());
|
|
product.setStock(countDto.getStock());
|
|
|
|
|
+ normalizeStoreAttributionOnProduct(product, param);
|
|
|
fsStoreProductMapper.insertFsStoreProduct(product);
|
|
fsStoreProductMapper.insertFsStoreProduct(product);
|
|
|
if (param.getSpecType().equals(0)) {
|
|
if (param.getSpecType().equals(0)) {
|
|
|
ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()
|
|
ProductArrtDTO fromatDetailDto = ProductArrtDTO.builder()
|
|
@@ -637,40 +640,47 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private ProductAttrCountDTO computedProductCount(List<FsStoreProductAttrValue> values) {
|
|
private ProductAttrCountDTO computedProductCount(List<FsStoreProductAttrValue> values) {
|
|
|
- BigDecimal val = new BigDecimal(0);
|
|
|
|
|
- //取最小价格
|
|
|
|
|
- BigDecimal minPrice = values
|
|
|
|
|
- .stream()
|
|
|
|
|
|
|
+ BigDecimal zero = BigDecimal.ZERO;
|
|
|
|
|
+ if (values == null || values.isEmpty()) {
|
|
|
|
|
+ return ProductAttrCountDTO.builder()
|
|
|
|
|
+ .minPrice(zero)
|
|
|
|
|
+ .minOtPrice(zero)
|
|
|
|
|
+ .minCost(zero)
|
|
|
|
|
+ .stock(0)
|
|
|
|
|
+ .minIntegral(0)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ }
|
|
|
|
|
+ // 规格字段可能为 null,Comparator.naturalOrder().min 遇 null 会 NPE
|
|
|
|
|
+ BigDecimal minPrice = values.stream()
|
|
|
.map(FsStoreProductAttrValue::getPrice)
|
|
.map(FsStoreProductAttrValue::getPrice)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.min(Comparator.naturalOrder())
|
|
.min(Comparator.naturalOrder())
|
|
|
- .orElse(val);
|
|
|
|
|
|
|
+ .orElse(zero);
|
|
|
|
|
|
|
|
- //取最小积分
|
|
|
|
|
- Integer minIntegral = values
|
|
|
|
|
- .stream()
|
|
|
|
|
|
|
+ Integer minIntegral = values.stream()
|
|
|
.map(FsStoreProductAttrValue::getGiveIntegral)
|
|
.map(FsStoreProductAttrValue::getGiveIntegral)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.min(Comparator.naturalOrder())
|
|
.min(Comparator.naturalOrder())
|
|
|
.orElse(0);
|
|
.orElse(0);
|
|
|
|
|
|
|
|
- BigDecimal minOtPrice = values
|
|
|
|
|
- .stream()
|
|
|
|
|
|
|
+ BigDecimal minOtPrice = values.stream()
|
|
|
.map(FsStoreProductAttrValue::getOtPrice)
|
|
.map(FsStoreProductAttrValue::getOtPrice)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.min(Comparator.naturalOrder())
|
|
.min(Comparator.naturalOrder())
|
|
|
- .orElse(val);
|
|
|
|
|
|
|
+ .orElse(zero);
|
|
|
|
|
|
|
|
- BigDecimal minCost = values
|
|
|
|
|
- .stream()
|
|
|
|
|
|
|
+ BigDecimal minCost = values.stream()
|
|
|
.map(FsStoreProductAttrValue::getCost)
|
|
.map(FsStoreProductAttrValue::getCost)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.min(Comparator.naturalOrder())
|
|
.min(Comparator.naturalOrder())
|
|
|
- .orElse(val);
|
|
|
|
|
- //计算库存
|
|
|
|
|
- Integer stock = values
|
|
|
|
|
- .stream()
|
|
|
|
|
|
|
+ .orElse(zero);
|
|
|
|
|
+
|
|
|
|
|
+ Integer stock = values.stream()
|
|
|
.map(FsStoreProductAttrValue::getStock)
|
|
.map(FsStoreProductAttrValue::getStock)
|
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
.reduce(Integer::sum)
|
|
.reduce(Integer::sum)
|
|
|
.orElse(0);
|
|
.orElse(0);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
return ProductAttrCountDTO.builder()
|
|
return ProductAttrCountDTO.builder()
|
|
|
.minPrice(minPrice)
|
|
.minPrice(minPrice)
|
|
|
.minOtPrice(minOtPrice)
|
|
.minOtPrice(minOtPrice)
|
|
@@ -1000,7 +1010,7 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
String syncedImageUrl = normalizeErpImageUrl(erpProduct.getPic());
|
|
String syncedImageUrl = normalizeErpImageUrl(erpProduct.getPic());
|
|
|
|
|
|
|
|
FsStoreProduct newProduct = new FsStoreProduct();
|
|
FsStoreProduct newProduct = new FsStoreProduct();
|
|
|
- newProduct.setStoreId(getStoreIdByErpBrand(erpProduct.getBrand()));
|
|
|
|
|
|
|
+ applyErpBrandStoreMatch(newProduct, resolveErpBrandStoreMatch(erpProduct.getBrand()));
|
|
|
newProduct.setBarCode(erpProduct.getSkuId());
|
|
newProduct.setBarCode(erpProduct.getSkuId());
|
|
|
newProduct.setProductName(erpProduct.getName());
|
|
newProduct.setProductName(erpProduct.getName());
|
|
|
newProduct.setPrice(erpProduct.getSalePrice());
|
|
newProduct.setPrice(erpProduct.getSalePrice());
|
|
@@ -1056,7 +1066,6 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
private void updateProductByErpData(FsStoreProduct product, ProductResponseDTO.ProductInfo erpProduct) {
|
|
private void updateProductByErpData(FsStoreProduct product, ProductResponseDTO.ProductInfo erpProduct) {
|
|
|
FsStoreProduct updateProduct = new FsStoreProduct();
|
|
FsStoreProduct updateProduct = new FsStoreProduct();
|
|
|
updateProduct.setProductId(product.getProductId());
|
|
updateProduct.setProductId(product.getProductId());
|
|
|
- updateProduct.setStoreId(getStoreIdByErpBrand(erpProduct.getBrand()));
|
|
|
|
|
updateProduct.setProductName(erpProduct.getName());
|
|
updateProduct.setProductName(erpProduct.getName());
|
|
|
updateProduct.setPrice(erpProduct.getSalePrice());
|
|
updateProduct.setPrice(erpProduct.getSalePrice());
|
|
|
updateProduct.setCostPrice(erpProduct.getCostPrice());
|
|
updateProduct.setCostPrice(erpProduct.getCostPrice());
|
|
@@ -1068,6 +1077,13 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
updateProduct.setPrescribeSpec(erpProduct.getPropertiesValue());
|
|
updateProduct.setPrescribeSpec(erpProduct.getPropertiesValue());
|
|
|
updateProduct.setPrescribeFactory(erpProduct.getSupplierName());
|
|
updateProduct.setPrescribeFactory(erpProduct.getSupplierName());
|
|
|
fsStoreProductMapper.updateFsStoreProduct(updateProduct);
|
|
fsStoreProductMapper.updateFsStoreProduct(updateProduct);
|
|
|
|
|
+
|
|
|
|
|
+ ErpBrandStoreMatch match = resolveErpBrandStoreMatch(erpProduct.getBrand());
|
|
|
|
|
+ if (match.type == ErpBrandMatchType.STORE_NAME) {
|
|
|
|
|
+ fsStoreProductMapper.updateErpStoreIdOnly(product.getProductId(), match.storeId);
|
|
|
|
|
+ } else if (match.type == ErpBrandMatchType.ALIAS) {
|
|
|
|
|
+ fsStoreProductMapper.updateErpBrandStoreIdsClearStoreId(product.getProductId(), match.brandStoreIds);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void updateAttrValueByErpData(FsStoreProduct product,FsStoreProductAttrValue attr, ProductResponseDTO.ProductInfo erpProduct) {
|
|
private void updateAttrValueByErpData(FsStoreProduct product,FsStoreProductAttrValue attr, ProductResponseDTO.ProductInfo erpProduct) {
|
|
@@ -1094,22 +1110,116 @@ public class FsStoreProductServiceImpl implements IFsStoreProductService {
|
|
|
|| erpProduct.getWeight() != null;
|
|
|| erpProduct.getWeight() != null;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private Long getStoreIdByErpBrand(String brand) {
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 后台保存时店铺归属:
|
|
|
|
|
+ * brandStoreIds 有值 → 大品牌归属(storeId 置空,即使只有一个店)
|
|
|
|
|
+ * 仅 storeId → 店名精确归属
|
|
|
|
|
+ */
|
|
|
|
|
+ private void normalizeStoreAttributionOnProduct(FsStoreProduct product, FsStoreProductAddEditParam param) {
|
|
|
|
|
+ if (product == null || param == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isNotBlank(param.getBrandStoreIds())) {
|
|
|
|
|
+ product.setStoreId(null);
|
|
|
|
|
+ product.setBrandStoreIds(param.getBrandStoreIds().trim());
|
|
|
|
|
+ } else if (param.getStoreId() != null) {
|
|
|
|
|
+ product.setBrandStoreIds(null);
|
|
|
|
|
+ }
|
|
|
|
|
+ // storeId、brandStoreIds 都空:不在这里强改,避免误清库里已有归属
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 动态 update 无法把 store_id 置 NULL,编辑保存后再用专用 SQL 同步归属。
|
|
|
|
|
+ * 仅当请求明确带了 brandStoreIds 或 storeId 时才覆盖。
|
|
|
|
|
+ */
|
|
|
|
|
+ private void syncStoreAttributionAfterSave(Long productId, FsStoreProductAddEditParam param) {
|
|
|
|
|
+ if (productId == null || param == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isNotBlank(param.getBrandStoreIds())) {
|
|
|
|
|
+ fsStoreProductMapper.updateErpBrandStoreIdsClearStoreId(productId, param.getBrandStoreIds().trim());
|
|
|
|
|
+ } else if (param.getStoreId() != null && StringUtils.isBlank(param.getBrandStoreIds())) {
|
|
|
|
|
+ // 仅单店模式才清 brand_store_ids;前端大品牌归属必须带 brandStoreIds
|
|
|
|
|
+ fsStoreProductMapper.updateStoreIdClearBrandStoreIds(productId, param.getStoreId());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * ERP brand 归属解析:
|
|
|
|
|
+ * 1) brand 精确等于店名 → 只写 store_id,不改 brand_store_ids(保持 null)
|
|
|
|
|
+ * 2) 否则按各店 erp_brand_aliases 精确命中 → 写 brand_store_ids,store_id 置 null
|
|
|
|
|
+ */
|
|
|
|
|
+ private ErpBrandStoreMatch resolveErpBrandStoreMatch(String brand) {
|
|
|
|
|
+ ErpBrandStoreMatch match = new ErpBrandStoreMatch();
|
|
|
if (StringUtils.isBlank(brand)) {
|
|
if (StringUtils.isBlank(brand)) {
|
|
|
- return null;
|
|
|
|
|
|
|
+ return match;
|
|
|
}
|
|
}
|
|
|
|
|
+ String brandTrim = brand.trim();
|
|
|
FsStore query = new FsStore();
|
|
FsStore query = new FsStore();
|
|
|
- query.setStoreName(brand.trim());
|
|
|
|
|
|
|
+ query.setStoreName(brandTrim);
|
|
|
List<FsStore> stores = fsStoreMapper.selectFsStoreList(query);
|
|
List<FsStore> stores = fsStoreMapper.selectFsStoreList(query);
|
|
|
- if (stores == null || stores.isEmpty()) {
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ if (stores != null) {
|
|
|
|
|
+ for (FsStore store : stores) {
|
|
|
|
|
+ if (StringUtils.equals(StringUtils.trim(store.getStoreName()), brandTrim)) {
|
|
|
|
|
+ match.type = ErpBrandMatchType.STORE_NAME;
|
|
|
|
|
+ match.storeId = store.getStoreId();
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- for (FsStore store : stores) {
|
|
|
|
|
- if (StringUtils.equals(StringUtils.trim(store.getStoreName()), brand.trim())) {
|
|
|
|
|
- return store.getStoreId();
|
|
|
|
|
|
|
+ List<FsStore> allStores = fsStoreMapper.selectFsStoreList(new FsStore());
|
|
|
|
|
+ if (allStores == null || allStores.isEmpty()) {
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ List<Long> aliasStoreIds = new ArrayList<>();
|
|
|
|
|
+ for (FsStore store : allStores) {
|
|
|
|
|
+ if (store.getStoreId() == null || StringUtils.isBlank(store.getErpBrandAliases())) {
|
|
|
|
|
+ continue;
|
|
|
}
|
|
}
|
|
|
|
|
+ String[] aliases = store.getErpBrandAliases().split("[,、]");
|
|
|
|
|
+ for (String alias : aliases) {
|
|
|
|
|
+ if (StringUtils.equals(StringUtils.trim(alias), brandTrim)) {
|
|
|
|
|
+ aliasStoreIds.add(store.getStoreId());
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (aliasStoreIds.isEmpty()) {
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+ aliasStoreIds = aliasStoreIds.stream().distinct().sorted().collect(Collectors.toList());
|
|
|
|
|
+ match.type = ErpBrandMatchType.ALIAS;
|
|
|
|
|
+ match.storeId = null;
|
|
|
|
|
+ match.brandStoreIds = aliasStoreIds.stream().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
|
|
+ log.info("ERP大品牌别名命中多店, brand={}, brandStoreIds={}", brandTrim, match.brandStoreIds);
|
|
|
|
|
+ return match;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void applyErpBrandStoreMatch(FsStoreProduct product, ErpBrandStoreMatch match) {
|
|
|
|
|
+ if (product == null || match == null || match.type == ErpBrandMatchType.NONE) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (match.type == ErpBrandMatchType.STORE_NAME) {
|
|
|
|
|
+ product.setStoreId(match.storeId);
|
|
|
|
|
+ // 不设置 brandStoreIds,插入时保持 null
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
- return stores.get(0).getStoreId();
|
|
|
|
|
|
|
+ if (match.type == ErpBrandMatchType.ALIAS) {
|
|
|
|
|
+ product.setStoreId(null);
|
|
|
|
|
+ product.setBrandStoreIds(match.brandStoreIds);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private enum ErpBrandMatchType {
|
|
|
|
|
+ NONE,
|
|
|
|
|
+ STORE_NAME,
|
|
|
|
|
+ ALIAS
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static class ErpBrandStoreMatch {
|
|
|
|
|
+ private ErpBrandMatchType type = ErpBrandMatchType.NONE;
|
|
|
|
|
+ private Long storeId;
|
|
|
|
|
+ private String brandStoreIds;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private void syncProductAttrDefinition(Long productId) {
|
|
private void syncProductAttrDefinition(Long productId) {
|