mirror of https://github.com/jeecgboot/jeecg-boot
feat : first sheet and latest weight imported in Mabang
parent
e555b705be
commit
b23a273b89
|
@ -212,9 +212,13 @@ public class PurchaseOrderController {
|
||||||
BeanUtils.copyProperties(purchaseOrderPage, purchaseOrder);
|
BeanUtils.copyProperties(purchaseOrderPage, purchaseOrder);
|
||||||
purchaseOrder.setPaymentDocumentString(new String(purchaseOrderPage.getPaymentDocument()));
|
purchaseOrder.setPaymentDocumentString(new String(purchaseOrderPage.getPaymentDocument()));
|
||||||
purchaseOrder.setInventoryDocumentString(new String(purchaseOrderPage.getInventoryDocument()));
|
purchaseOrder.setInventoryDocumentString(new String(purchaseOrderPage.getInventoryDocument()));
|
||||||
|
Map<String, Responses> responsesMappedByReason = new HashMap<>();
|
||||||
if(purchaseOrderPage.getPlatformOrderId() == null) {
|
if(purchaseOrderPage.getPlatformOrderId() == null) {
|
||||||
|
Responses purchaseUpdateResponse = new Responses();
|
||||||
purchaseOrderService.updateById(purchaseOrder);
|
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(",")));
|
List<String> platformOrderIds = new ArrayList<>(Arrays.asList(purchaseOrderPage.getPlatformOrderId().split(",")));
|
||||||
log.info("Editing purchase order and attributing it to orders : {}", platformOrderIds);
|
log.info("Editing purchase order and attributing it to orders : {}", platformOrderIds);
|
||||||
|
@ -222,7 +226,7 @@ public class PurchaseOrderController {
|
||||||
platformOrderService.removePurchaseInvoiceNumber(purchaseOrder.getInvoiceNumber(), purchaseOrder.getClientId());
|
platformOrderService.removePurchaseInvoiceNumber(purchaseOrder.getInvoiceNumber(), purchaseOrder.getClientId());
|
||||||
List<PlatformOrder> platformOrders = platformOrderService.selectByPlatformOrderIds(platformOrderIds);
|
List<PlatformOrder> platformOrders = platformOrderService.selectByPlatformOrderIds(platformOrderIds);
|
||||||
log.info("Platform orders found for attribution : {}", platformOrders.stream().map(PlatformOrder::getPlatformOrderId).collect(Collectors.toList()));
|
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();
|
Responses platformOrderIdUpdateResponse = new Responses();
|
||||||
if(!platformOrders.isEmpty()) {
|
if(!platformOrders.isEmpty()) {
|
||||||
for(PlatformOrder po : platformOrders) {
|
for(PlatformOrder po : platformOrders) {
|
||||||
|
@ -237,7 +241,7 @@ public class PurchaseOrderController {
|
||||||
platformOrderIdUpdateResponse.getFailures().addAll(platformOrderIds);
|
platformOrderIdUpdateResponse.getFailures().addAll(platformOrderIds);
|
||||||
}
|
}
|
||||||
purchaseOrderService.updateById(purchaseOrder);
|
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);
|
return Result.OK("sys.api.entryEditSuccess", responsesMappedByReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -186,56 +186,59 @@ public class SkuWeightController extends JeecgController<SkuWeight, ISkuWeightSe
|
||||||
MultipartFile file = entity.getValue();
|
MultipartFile file = entity.getValue();
|
||||||
try (InputStream inputStream = file.getInputStream()){
|
try (InputStream inputStream = file.getInputStream()){
|
||||||
Workbook workbook = new XSSFWorkbook(inputStream);
|
Workbook workbook = new XSSFWorkbook(inputStream);
|
||||||
for (Sheet sheet : workbook) {
|
Sheet firstSheet = workbook.getSheetAt(0);
|
||||||
int firstRow = sheet.getFirstRowNum();
|
int firstRow = firstSheet.getFirstRowNum();
|
||||||
int lastRow = sheet.getLastRowNum();
|
int lastRow = firstSheet.getLastRowNum();
|
||||||
for (int rowIndex = firstRow + 1; rowIndex <= lastRow; rowIndex++) {
|
for (int rowIndex = firstRow + 1; rowIndex <= lastRow; rowIndex++) {
|
||||||
Row row = sheet.getRow(rowIndex);
|
Row row = firstSheet.getRow(rowIndex);
|
||||||
SkuWeight skuWeight = new SkuWeight();
|
SkuWeight skuWeight = new SkuWeight();
|
||||||
boolean hasError = false;
|
boolean hasError = false;
|
||||||
String erpCode = null;
|
String erpCode = null;
|
||||||
for (int cellIndex = row.getFirstCellNum(); cellIndex < NUMBER_OF_SKU_EXCEL_COLUMNS; cellIndex++) {
|
for (int cellIndex = row.getFirstCellNum(); cellIndex < NUMBER_OF_SKU_EXCEL_COLUMNS; cellIndex++) {
|
||||||
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
|
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
|
||||||
String cellValue = cell.getStringCellValue();
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(hasError) continue;
|
if(hasError) continue;
|
||||||
skuWeights.add(skuWeight);
|
if(cellValue.isEmpty()){
|
||||||
assert erpCode != null;
|
responses.addFailure("Row " + rowIndex + " has empty cell at index " + cellIndex);
|
||||||
skuWeightMappedByErpCode.put(erpCode, skuWeight);
|
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());
|
log.info("Import weights for skus: {}", skuWeightMappedByErpCode.keySet());
|
||||||
Responses mabangResponses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
|
Responses mabangResponses = skuListMabangService.mabangSkuWeightUpdate(skuWeights);
|
||||||
List<SkuWeight> skuWeightSuccesses = new ArrayList<>();
|
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));
|
skuWeightSuccesses.forEach(skuWeight -> skuMongoService.upsertSkuWeight(skuWeight));
|
||||||
skuWeightService.saveBatch(skuWeights);
|
skuWeightService.saveBatch(skuWeights);
|
||||||
responses.setSuccesses(mabangResponses.getSuccesses());
|
responses.getSuccesses().addAll(mabangResponses.getSuccesses());
|
||||||
|
responses.getFailures().addAll(mabangResponses.getFailures());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
String msg = e.getMessage();
|
String msg = e.getMessage();
|
||||||
|
|
|
@ -638,11 +638,38 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
||||||
public Responses mabangSkuWeightUpdate(List<SkuWeight> skuWeights) {
|
public Responses mabangSkuWeightUpdate(List<SkuWeight> skuWeights) {
|
||||||
Responses responses = new Responses();
|
Responses responses = new Responses();
|
||||||
List<String> failures = new ArrayList<>();
|
List<String> failures = new ArrayList<>();
|
||||||
List<Sku> skus = skuService.listByIds(skuWeights.stream()
|
List<String> skuIds = skuWeights.stream()
|
||||||
.map(SkuWeight::getSkuId).collect(toList()));
|
.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<>();
|
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) {
|
for(List<String> skuPartition : skusPartition) {
|
||||||
SkuListRequestBody body = new SkuListRequestBody();
|
SkuListRequestBody body = new SkuListRequestBody();
|
||||||
body.setStockSkuList(String.join(",", skuPartition));
|
body.setStockSkuList(String.join(",", skuPartition));
|
||||||
|
@ -664,15 +691,22 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
||||||
|
|
||||||
List<SkuData> skuDataList = skuWeights.stream()
|
List<SkuData> skuDataList = skuWeights.stream()
|
||||||
.map(skuWeight -> {
|
.map(skuWeight -> {
|
||||||
Sku sku = skus.stream()
|
Sku sku = skusToUpdate.stream()
|
||||||
.filter(s -> s.getId().equals(skuWeight.getSkuId()))
|
.filter(s -> s.getId().equals(skuWeight.getSkuId()))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(null);
|
.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());
|
log.error("Sku not found : {}", skuWeight.getSkuId());
|
||||||
failures.add(skuWeight.getSkuId());
|
failures.add(skuWeight.getSkuId());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if(null == sku) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
SkuData skuData = new SkuData();
|
SkuData skuData = new SkuData();
|
||||||
skuData.setErpCode(sku.getErpCode());
|
skuData.setErpCode(sku.getErpCode());
|
||||||
if(remarkMappedByErpCode.containsKey(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());
|
log.info("{}/{} skus updated successfully.", successCount, skuDataList.size());
|
||||||
List<String> successes = results.stream()
|
List<String> successes = results.stream()
|
||||||
.filter(SkuChangeResponse::success)
|
.filter(SkuChangeResponse::success)
|
||||||
.map(SkuChangeResponse::getStockSku)
|
.map(response -> response.getStockSku() + " : Mabang OK")
|
||||||
.collect(toList());
|
.collect(toList());
|
||||||
failures.addAll(results.stream()
|
failures.addAll(results.stream()
|
||||||
.filter(response -> !response.success())
|
.filter(response -> !response.success())
|
||||||
.map(SkuChangeResponse::getStockSku)
|
.map(response -> response.getStockSku() + " | Mabang")
|
||||||
.collect(toList()));
|
.collect(toList()));
|
||||||
|
|
||||||
responses.setSuccesses(successes);
|
responses.getSuccesses().addAll(successes);
|
||||||
responses.setFailures(failures);
|
responses.setFailures(failures);
|
||||||
return responses;
|
return responses;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue