Merge pull request #129 from LQYBill/feat/tempSkuBuilder

feat : first sheet and latest weight imported in Mabang
pull/8040/head
Qiuyi LI 2024-12-27 16:17:34 +01:00 committed by GitHub
commit eb99096b99
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 95 additions and 54 deletions

View File

@ -212,9 +212,13 @@ public class PurchaseOrderController {
BeanUtils.copyProperties(purchaseOrderPage, purchaseOrder);
purchaseOrder.setPaymentDocumentString(new String(purchaseOrderPage.getPaymentDocument()));
purchaseOrder.setInventoryDocumentString(new String(purchaseOrderPage.getInventoryDocument()));
Map<String, Responses> responsesMappedByReason = new HashMap<>();
if(purchaseOrderPage.getPlatformOrderId() == null) {
Responses purchaseUpdateResponse = new Responses();
purchaseOrderService.updateById(purchaseOrder);
return Result.OK("sys.api.entryEditSuccess");
purchaseUpdateResponse.addSuccess("updated");
responsesMappedByReason.put("orderUpdate : " + purchaseOrder.getInvoiceNumber(), purchaseUpdateResponse);
return Result.OK("sys.api.entryEditSuccess", responsesMappedByReason);
}
List<String> platformOrderIds = new ArrayList<>(Arrays.asList(purchaseOrderPage.getPlatformOrderId().split(",")));
log.info("Editing purchase order and attributing it to orders : {}", platformOrderIds);
@ -222,7 +226,7 @@ public class PurchaseOrderController {
platformOrderService.removePurchaseInvoiceNumber(purchaseOrder.getInvoiceNumber(), purchaseOrder.getClientId());
List<PlatformOrder> platformOrders = platformOrderService.selectByPlatformOrderIds(platformOrderIds);
log.info("Platform orders found for attribution : {}", platformOrders.stream().map(PlatformOrder::getPlatformOrderId).collect(Collectors.toList()));
Map<String, Responses> responsesMappedByReason = new HashMap<>();
Responses platformOrderIdUpdateResponse = new Responses();
if(!platformOrders.isEmpty()) {
for(PlatformOrder po : platformOrders) {
@ -237,7 +241,7 @@ public class PurchaseOrderController {
platformOrderIdUpdateResponse.getFailures().addAll(platformOrderIds);
}
purchaseOrderService.updateById(purchaseOrder);
responsesMappedByReason.put("Platform Order IDs Update / 平台订单号码更新 : " + purchaseOrder.getInvoiceNumber(), platformOrderIdUpdateResponse);
responsesMappedByReason.put("orderIdUpdate : " + purchaseOrder.getInvoiceNumber(), platformOrderIdUpdateResponse);
return Result.OK("sys.api.entryEditSuccess", responsesMappedByReason);
}

View File

@ -186,56 +186,59 @@ public class SkuWeightController extends JeecgController<SkuWeight, ISkuWeightSe
MultipartFile file = entity.getValue();
try (InputStream inputStream = file.getInputStream()){
Workbook workbook = new XSSFWorkbook(inputStream);
for (Sheet sheet : workbook) {
int firstRow = sheet.getFirstRowNum();
int lastRow = sheet.getLastRowNum();
for (int rowIndex = firstRow + 1; rowIndex <= lastRow; rowIndex++) {
Row row = sheet.getRow(rowIndex);
SkuWeight skuWeight = new SkuWeight();
boolean hasError = false;
String erpCode = null;
for (int cellIndex = row.getFirstCellNum(); cellIndex < NUMBER_OF_SKU_EXCEL_COLUMNS; cellIndex++) {
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
String cellValue = cell.getStringCellValue();
if(hasError) continue;
if(cellValue.isEmpty()){
responses.addFailure("Row " + rowIndex + " has empty cell at index " + cellIndex);
hasError = true;
continue;
}
switch (cellIndex) {
case 0:
Sku sku = skuService.getByErpCode(cellValue);
if(sku == null){
responses.addFailure("Row " + rowIndex + " SKU not found : " + cellValue);
hasError = true;
continue;
}
erpCode = cellValue;
skuWeight.setSkuId(sku.getId());
break;
case 1:
skuWeight.setWeight((int) Double.parseDouble(cellValue));
break;
case 2:
Date effectiveDate = formatter.parse(cellValue);
skuWeight.setEffectiveDate(effectiveDate);
break;
}
}
Sheet firstSheet = workbook.getSheetAt(0);
int firstRow = firstSheet.getFirstRowNum();
int lastRow = firstSheet.getLastRowNum();
for (int rowIndex = firstRow + 1; rowIndex <= lastRow; rowIndex++) {
Row row = firstSheet.getRow(rowIndex);
SkuWeight skuWeight = new SkuWeight();
boolean hasError = false;
String erpCode = null;
for (int cellIndex = row.getFirstCellNum(); cellIndex < NUMBER_OF_SKU_EXCEL_COLUMNS; cellIndex++) {
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
String cellValue = cell.getStringCellValue();
if(hasError) continue;
skuWeights.add(skuWeight);
assert erpCode != null;
skuWeightMappedByErpCode.put(erpCode, skuWeight);
if(cellValue.isEmpty()){
responses.addFailure("Row " + rowIndex + " has empty cell at index " + cellIndex);
hasError = true;
continue;
}
switch (cellIndex) {
case 0:
Sku sku = skuService.getByErpCode(cellValue);
if(sku == null){
responses.addFailure("Row " + rowIndex + " SKU not found : " + cellValue);
hasError = true;
continue;
}
erpCode = cellValue;
skuWeight.setSkuId(sku.getId());
break;
case 1:
skuWeight.setWeight((int) Double.parseDouble(cellValue));
break;
case 2:
Date effectiveDate = formatter.parse(cellValue);
skuWeight.setEffectiveDate(effectiveDate);
break;
}
}
if(hasError) continue;
skuWeights.add(skuWeight);
assert erpCode != null;
skuWeightMappedByErpCode.put(erpCode, skuWeight);
}
log.info("Import weights for skus: {}", skuWeightMappedByErpCode.keySet());
Responses mabangResponses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
List<SkuWeight> skuWeightSuccesses = new ArrayList<>();
mabangResponses.getSuccesses().forEach(skuErpCode -> skuWeightSuccesses.add(skuWeightMappedByErpCode.get(skuErpCode)));
mabangResponses.getSuccesses().forEach(skuErpCode -> {
String erpCode = skuErpCode.split(":")[0].trim();
skuWeightSuccesses.add(skuWeightMappedByErpCode.get(erpCode));
});
skuWeightSuccesses.forEach(skuWeight -> skuMongoService.upsertSkuWeight(skuWeight));
skuWeightService.saveBatch(skuWeights);
responses.setSuccesses(mabangResponses.getSuccesses());
responses.getSuccesses().addAll(mabangResponses.getSuccesses());
responses.getFailures().addAll(mabangResponses.getFailures());
} catch (Exception e) {
e.printStackTrace();
String msg = e.getMessage();

View File

@ -638,11 +638,38 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
public Responses mabangSkuWeightUpdate(List<SkuWeight> skuWeights) {
Responses responses = new Responses();
List<String> failures = new ArrayList<>();
List<Sku> skus = skuService.listByIds(skuWeights.stream()
.map(SkuWeight::getSkuId).collect(toList()));
List<String> skuIds = skuWeights.stream()
.map(SkuWeight::getSkuId)
.collect(toList());
List<Sku> skus = skuService.listByIds(skuIds);
// Map skuWeights by skuId, if skuId already in map, keep the skuWeight with the latest effective date
Map<String, SkuWeight> skuWeightMappedById = skuWeights.stream()
.collect(Collectors.toMap(SkuWeight::getSkuId, Function.identity(), (skuWeight1, skuWeight2) -> {
if(skuWeight1.getEffectiveDate().after(skuWeight2.getEffectiveDate())) {
log.info("The weight [{}] for sku [{}] is more recent.", skuWeight1.getWeight() ,skuWeight1.getSkuId());
return skuWeight1;
}
log.info("The weight [{}] for sku [{}] is more recent.", skuWeight2.getWeight() ,skuWeight2.getSkuId());
return skuWeight2;
}));
List<Sku> skusToUpdate = new ArrayList<>();
for(Sku sku : skus) {
SkuWeight latestSkuWeight = skuWeightService.getBySkuId(sku.getId());
if(latestSkuWeight == null) {
skusToUpdate.add(sku);
continue;
}
Date latestEffectiveDate = latestSkuWeight.getEffectiveDate();
Date effectiveDateToImport = skuWeightMappedById.get(sku.getId()).getEffectiveDate();
if(latestEffectiveDate.after(effectiveDateToImport)) {
log.info("Sku {} has a more recent weight in DB. Therefore won't be imported to Mabang", sku.getErpCode());
responses.addSuccess(sku.getErpCode());
continue;
}
skusToUpdate.add(sku);
}
Map<String, String> remarkMappedByErpCode = new HashMap<>();
List<List<String>> skusPartition = Lists.partition(skus.stream().map(Sku::getErpCode).collect(toList()), 50);
List<List<String>> skusPartition = Lists.partition(skusToUpdate.stream().map(Sku::getErpCode).collect(toList()), 50);
for(List<String> skuPartition : skusPartition) {
SkuListRequestBody body = new SkuListRequestBody();
body.setStockSkuList(String.join(",", skuPartition));
@ -664,15 +691,22 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
List<SkuData> skuDataList = skuWeights.stream()
.map(skuWeight -> {
Sku sku = skus.stream()
Sku sku = skusToUpdate.stream()
.filter(s -> s.getId().equals(skuWeight.getSkuId()))
.findFirst()
.orElse(null);
if(null == sku) {
Sku skuInDb = skus.stream()
.filter(s -> s.getId().equals(skuWeight.getSkuId()))
.findFirst()
.orElse(null);
if(null == skuInDb) {
log.error("Sku not found : {}", skuWeight.getSkuId());
failures.add(skuWeight.getSkuId());
return null;
}
if(null == sku) {
return null;
}
SkuData skuData = new SkuData();
skuData.setErpCode(sku.getErpCode());
if(remarkMappedByErpCode.containsKey(sku.getErpCode())) {
@ -713,14 +747,14 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
log.info("{}/{} skus updated successfully.", successCount, skuDataList.size());
List<String> successes = results.stream()
.filter(SkuChangeResponse::success)
.map(SkuChangeResponse::getStockSku)
.map(response -> response.getStockSku() + " : Mabang OK")
.collect(toList());
failures.addAll(results.stream()
.filter(response -> !response.success())
.map(SkuChangeResponse::getStockSku)
.map(response -> response.getStockSku() + " | Mabang")
.collect(toList()));
responses.setSuccesses(successes);
responses.getSuccesses().addAll(successes);
responses.setFailures(failures);
return responses;
}