mirror of https://github.com/jeecgboot/jeecg-boot
Merge pull request #120 from LQYBill/feat/client_category_migrate_to_shop
feat: product order improvementpull/8040/head
commit
1c4f1286b8
|
@ -405,7 +405,7 @@ public class SkuController {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(clientId != null) {
|
if(clientId != null) {
|
||||||
total = skuService.countAllClientSkus();
|
total = skuService.countAllClientSkus(clientId);
|
||||||
skuOrdersPage = skuService.fetchSkusByClient(clientId, pageNo, pageSize, parsedColumn, parsedOrder);
|
skuOrdersPage = skuService.fetchSkusByClient(clientId, pageNo, pageSize, parsedColumn, parsedOrder);
|
||||||
} else {
|
} else {
|
||||||
total = skuService.countAllSkus();
|
total = skuService.countAllSkus();
|
||||||
|
@ -419,6 +419,23 @@ public class SkuController {
|
||||||
page.setTotal(total);
|
page.setTotal(total);
|
||||||
return Result.OK(page);
|
return Result.OK(page);
|
||||||
}
|
}
|
||||||
|
@GetMapping("/listAllSelectableSkuIds")
|
||||||
|
public Result<?> listAllSelectableSkuIds(@RequestParam(name = "clientId") String clientId,
|
||||||
|
@RequestParam(name = "erpCodes", required = false) String erpCodes,
|
||||||
|
@RequestParam(name = "zhNames", required = false) String zhNames,
|
||||||
|
@RequestParam(name = "enNames", required = false) String enNames
|
||||||
|
) {
|
||||||
|
List<SkuOrderPage> selectableSkuIds;
|
||||||
|
if(erpCodes != null || zhNames != null || enNames != null) {
|
||||||
|
List<String> erpCodeList = erpCodes == null ? null : Arrays.asList(erpCodes.split(","));
|
||||||
|
List<String> zhNameList = zhNames == null ? null : Arrays.asList(zhNames.split(","));
|
||||||
|
List<String> enNameList = enNames == null ? null : Arrays.asList(enNames.split(","));
|
||||||
|
selectableSkuIds = skuService.listSelectableSkuIdsWithFilters(clientId, erpCodeList, zhNameList, enNameList);
|
||||||
|
} else {
|
||||||
|
selectableSkuIds = skuService.listSelectableSkuIds(clientId);
|
||||||
|
}
|
||||||
|
return Result.OK(selectableSkuIds);
|
||||||
|
}
|
||||||
@GetMapping("/searchExistingSkuByKeywords")
|
@GetMapping("/searchExistingSkuByKeywords")
|
||||||
public Result<?> searchExistingSkuByKeywords(@RequestParam("keywords") String keywords) {
|
public Result<?> searchExistingSkuByKeywords(@RequestParam("keywords") String keywords) {
|
||||||
String parsedKeywords = keywords.trim().replaceAll("[{}=$]", "");
|
String parsedKeywords = keywords.trim().replaceAll("[{}=$]", "");
|
||||||
|
@ -472,4 +489,10 @@ public class SkuController {
|
||||||
}
|
}
|
||||||
return Result.OK();
|
return Result.OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/syncSkuQty")
|
||||||
|
public Result<?> syncSkuQty(@RequestBody List<String> erpCodes) {
|
||||||
|
skuListMabangService.mabangSkuStockUpdate(erpCodes);
|
||||||
|
return Result.OK();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -738,10 +738,18 @@ public class InvoiceController {
|
||||||
List<SavRefundWithDetail> refunds = savRefundWithDetailService.getRefundsByInvoiceNumber(invoiceNumber);
|
List<SavRefundWithDetail> refunds = savRefundWithDetailService.getRefundsByInvoiceNumber(invoiceNumber);
|
||||||
return shippingInvoiceService.exportToExcel(factureDetails, refunds, invoiceNumber, invoiceEntity, internalCode);
|
return shippingInvoiceService.exportToExcel(factureDetails, refunds, invoiceNumber, invoiceEntity, internalCode);
|
||||||
}
|
}
|
||||||
|
@GetMapping(value = "/downloadInvoiceInventory")
|
||||||
|
public byte[] downloadInvoiceInventory(@RequestParam("invoiceCode") String invoiceCode, @RequestParam("internalCode") String internalCode, @RequestParam("invoiceEntity") String invoiceEntity) throws IOException {
|
||||||
|
InvoiceMetaData metaData = new InvoiceMetaData("", invoiceCode, internalCode, invoiceEntity, "");
|
||||||
|
List<SkuOrderPage> skuOrderPages = skuService.getInventoryByInvoiceNumber(metaData.getInvoiceCode());
|
||||||
|
return shippingInvoiceService.exportPurchaseInventoryToExcel(skuOrderPages, metaData);
|
||||||
|
}
|
||||||
@GetMapping(value = "/downloadInventory")
|
@GetMapping(value = "/downloadInventory")
|
||||||
public byte[] downloadInventory(@RequestParam("invoiceCode") String invoiceCode, @RequestParam("internalCode") String internalCode, @RequestParam("invoiceEntity") String invoiceEntity) throws IOException {
|
public byte[] downloadInventory(@RequestParam("invoiceCode") String invoiceCode, @RequestParam("internalCode") String internalCode, @RequestParam("invoiceEntity") String invoiceEntity) throws IOException {
|
||||||
InvoiceMetaData metaData = new InvoiceMetaData("", invoiceCode, internalCode, invoiceEntity, "");
|
InvoiceMetaData metaData = new InvoiceMetaData("", invoiceCode, internalCode, invoiceEntity, "");
|
||||||
List<SkuOrderPage> skuOrderPages = skuService.getInventoryByInvoiceNumber(metaData.getInvoiceCode());
|
String clientId = clientService.getClientIdByCode(internalCode);
|
||||||
|
List<String> erpCodes = skuService.listSelectableSkuIds(clientId).stream().map(SkuOrderPage::getErpCode).collect(Collectors.toList());
|
||||||
|
List<SkuOrderPage> skuOrderPages = skuService.getInventory(erpCodes, metaData.getInvoiceCode());
|
||||||
return shippingInvoiceService.exportPurchaseInventoryToExcel(skuOrderPages, metaData);
|
return shippingInvoiceService.exportPurchaseInventoryToExcel(skuOrderPages, metaData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,86 +1,49 @@
|
||||||
package org.jeecg.modules.business.domain.job;
|
package org.jeecg.modules.business.domain.job;
|
||||||
|
|
||||||
import com.amazonaws.services.dynamodbv2.xspec.S;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockData;
|
import org.codehaus.jettison.json.JSONArray;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockRawStream;
|
import org.codehaus.jettison.json.JSONException;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockRequestBody;
|
import org.codehaus.jettison.json.JSONObject;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockStream;
|
|
||||||
import org.jeecg.modules.business.entity.Sku;
|
import org.jeecg.modules.business.entity.Sku;
|
||||||
import org.jeecg.modules.business.mongoService.SkuMongoService;
|
import org.jeecg.modules.business.service.ISkuListMabangService;
|
||||||
import org.jeecg.modules.business.service.ISkuService;
|
import org.jeecg.modules.business.service.ISkuService;
|
||||||
import org.jeecg.modules.business.service.MigrationService;
|
|
||||||
import org.quartz.Job;
|
import org.quartz.Job;
|
||||||
|
import org.quartz.JobDataMap;
|
||||||
import org.quartz.JobExecutionContext;
|
import org.quartz.JobExecutionContext;
|
||||||
import org.quartz.JobExecutionException;
|
import org.quartz.JobExecutionException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class MabangSkuStockUpdateJob implements Job {
|
public class MabangSkuStockUpdateJob implements Job {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISkuService skuService;
|
private ISkuListMabangService skuListMabangService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private SkuMongoService skuMongoService;
|
private ISkuService skuService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(JobExecutionContext context) throws JobExecutionException {
|
public void execute(JobExecutionContext context) throws JobExecutionException {
|
||||||
List<String> skuList = skuService.listSkus().stream().map(Sku::getErpCode).collect(Collectors.toList());
|
|
||||||
StringBuilder skus = new StringBuilder();
|
|
||||||
List<SkuStockData> updateList = new ArrayList<>();
|
|
||||||
List<Sku> skuToUpdate = new ArrayList<>();
|
|
||||||
log.info("Sku stock update Job has started.");
|
log.info("Sku stock update Job has started.");
|
||||||
int count = 1;
|
List<String> erpCodes = skuService.listSkus().stream().map(Sku::getErpCode).collect(Collectors.toList());
|
||||||
for(int i = 1; i <= skuList.size(); i++) {
|
JobDataMap jobDataMap = context.getMergedJobDataMap();
|
||||||
if(i%100 != 1)
|
String parameter = ((String) jobDataMap.get("parameter"));
|
||||||
skus.append(",");
|
if (parameter != null) {
|
||||||
skus.append(skuList.get(i - 1));
|
try {
|
||||||
if(i%100 == 0) {
|
JSONObject jsonObject = new JSONObject(parameter);
|
||||||
SkuStockRequestBody body = (new SkuStockRequestBody())
|
if (!jsonObject.isNull("skus")) {
|
||||||
.setStockSkus(skus.toString())
|
JSONArray array = jsonObject.getJSONArray("skus");
|
||||||
.setTotal(skuList.size());
|
for(int i = 0; i < array.length(); i++) {
|
||||||
log.info("Sending request for page {}/{}.", count++, body.getTotalPages());
|
erpCodes.add(array.getString(i));
|
||||||
|
}
|
||||||
SkuStockRawStream rawStream = new SkuStockRawStream(body);
|
}
|
||||||
SkuStockStream stream = new SkuStockStream(rawStream);
|
} catch (JSONException e) {
|
||||||
updateList.addAll(stream.all());
|
log.error("Error while parsing parameter as JSON, falling back to default parameters.");
|
||||||
skus = new StringBuilder();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(skus.length() != 0) {
|
skuListMabangService.mabangSkuStockUpdate(erpCodes);
|
||||||
SkuStockRequestBody body = (new SkuStockRequestBody())
|
|
||||||
.setStockSkus(skus.toString())
|
|
||||||
.setTotal(skuList.size());
|
|
||||||
SkuStockRawStream rawStream = new SkuStockRawStream(body);
|
|
||||||
SkuStockStream stream = new SkuStockStream(rawStream);
|
|
||||||
updateList.addAll(stream.all());
|
|
||||||
}
|
|
||||||
updateList.forEach(skuStockData -> {
|
|
||||||
Sku sku = skuService.getByErpCode(skuStockData.getStockSku());
|
|
||||||
Integer availableAmount = skuStockData.getWarehouseStock("SZBA宝安仓").getStockQuantity();
|
|
||||||
Integer purchasingAmount = skuStockData.getWarehouseStock("SZBA宝安仓").getShippingQuantity();
|
|
||||||
if(sku.getAvailableAmount().equals(availableAmount) && sku.getPurchasingAmount().equals(purchasingAmount)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sku.setAvailableAmount(availableAmount);
|
|
||||||
sku.setPurchasingAmount(purchasingAmount);
|
|
||||||
sku.setUpdateBy("mabang api");
|
|
||||||
sku.setUpdateTime(new Date());
|
|
||||||
skuToUpdate.add(sku);
|
|
||||||
});
|
|
||||||
if(skuToUpdate.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
log.info("Updating stock for {} skus.", skuToUpdate.size());
|
|
||||||
skuService.updateBatchStockByIds(skuToUpdate);
|
|
||||||
for(Sku sku : skuToUpdate) {
|
|
||||||
skuMongoService.updateStock(sku);
|
|
||||||
}
|
|
||||||
log.info("Sku stock update Job has ended.");
|
log.info("Sku stock update Job has ended.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ import org.quartz.JobExecutionContext;
|
||||||
import org.quartz.JobExecutionException;
|
import org.quartz.JobExecutionException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.core.env.Environment;
|
import org.springframework.core.env.Environment;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
@ -28,6 +29,7 @@ import java.util.stream.Collectors;
|
||||||
import static java.util.stream.Collectors.*;
|
import static java.util.stream.Collectors.*;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Component
|
||||||
public class SkuShippingQtyJob implements Job {
|
public class SkuShippingQtyJob implements Job {
|
||||||
@Autowired
|
@Autowired
|
||||||
private IPlatformOrderService platformOrderService;
|
private IPlatformOrderService platformOrderService;
|
||||||
|
|
|
@ -51,7 +51,7 @@ public interface SkuMapper extends BaseMapper<Sku> {
|
||||||
|
|
||||||
Integer countAllSkus();
|
Integer countAllSkus();
|
||||||
Integer countAllSkuWeightsWithFilters(@Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
Integer countAllSkuWeightsWithFilters(@Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
||||||
Integer countAllClientSkus();
|
Integer countAllClientSkus(@Param("clientId") String clientId);
|
||||||
Integer countAllClientSkusWithFilters(@Param("clientId") String clientId, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
Integer countAllClientSkusWithFilters(@Param("clientId") String clientId, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
||||||
|
|
||||||
List<SkuOrderPage> fetchSkuWeights(@Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order);
|
List<SkuOrderPage> fetchSkuWeights(@Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order);
|
||||||
|
@ -59,6 +59,9 @@ public interface SkuMapper extends BaseMapper<Sku> {
|
||||||
List<SkuOrderPage> fetchSkuWeightsWithFilters(@Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
List<SkuOrderPage> fetchSkuWeightsWithFilters(@Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
||||||
List<SkuOrderPage> fetchSkusByClientWithFilters(@Param("clientId") String clientId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
List<SkuOrderPage> fetchSkusByClientWithFilters(@Param("clientId") String clientId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex);
|
||||||
|
|
||||||
|
List<SkuOrderPage> listSelectableSkuIdsWithFilters(@Param("clientId") String clientId, @Param("erpCodes") String erpCodeList, @Param("zhNames") String zhNameList, @Param("enNames") String enNameList);
|
||||||
|
List<SkuOrderPage> listSelectableSkuIds(@Param("clientId") String clientId);
|
||||||
|
|
||||||
String getIdFromErpCode(@Param("erpCode") String erpCode);
|
String getIdFromErpCode(@Param("erpCode") String erpCode);
|
||||||
|
|
||||||
List<Sku> listSkus();
|
List<Sku> listSkus();
|
||||||
|
@ -69,6 +72,8 @@ public interface SkuMapper extends BaseMapper<Sku> {
|
||||||
|
|
||||||
List<SkuOrderPage> getInventoryByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
List<SkuOrderPage> getInventoryByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
|
List<SkuOrderPage> getInventory(@Param("erpCodes") List<String> erpCodes, @Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
List<Sku> listByClientId(@Param("clientId") String clientId);
|
List<Sku> listByClientId(@Param("clientId") String clientId);
|
||||||
|
|
||||||
List<SkuOrderPage> searchExistingSkuByKeywords(@Param("keywords") List<String> keywords);
|
List<SkuOrderPage> searchExistingSkuByKeywords(@Param("keywords") List<String> keywords);
|
||||||
|
|
|
@ -402,6 +402,149 @@
|
||||||
</if>
|
</if>
|
||||||
;
|
;
|
||||||
</select>
|
</select>
|
||||||
|
<select id="listSelectableSkuIds" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
|
||||||
|
WITH qtyInOrdersNotShippedCTE AS (
|
||||||
|
SELECT sku_id as ID, SUM(quantity) AS quantity
|
||||||
|
FROM platform_order_content poc
|
||||||
|
JOIN platform_order po ON poc.platform_order_id = po.id
|
||||||
|
JOIN shop s ON po.shop_id = s.id
|
||||||
|
JOIN client c ON s.owner_id = c.id
|
||||||
|
WHERE c.id = #{clientId}
|
||||||
|
AND po.erp_status IN ('1','2')
|
||||||
|
AND poc.erp_status IN ('1','2')
|
||||||
|
GROUP BY sku_id
|
||||||
|
)
|
||||||
|
SELECT s.id,
|
||||||
|
s.erp_code,
|
||||||
|
s.en_name,
|
||||||
|
s.zh_name,
|
||||||
|
s.purchasing_amount,
|
||||||
|
s.available_amount,
|
||||||
|
qtyInOrdersNotShippedCTE.quantity as qtyInOrdersNotShipped,
|
||||||
|
s.available_amount + s.purchasing_amount - IF(qtyInOrdersNotShippedCTE.quantity IS NULL, 0, qtyInOrdersNotShippedCTE.quantity) as stock,
|
||||||
|
s.image_source,
|
||||||
|
s.service_fee,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE original_currency = 'EUR' AND target_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)
|
||||||
|
) as sku_price,
|
||||||
|
sp.threshold as discount_moq,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.discounted_price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.discounted_price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE target_currency = 'EUR' AND original_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)
|
||||||
|
) as discounted_price,
|
||||||
|
s7.quantity as sales_last_week,
|
||||||
|
s28.quantity as sales_four_weeks,
|
||||||
|
s42.quantity as sales_six_weeks
|
||||||
|
FROM sku s
|
||||||
|
JOIN client_sku ON s.id = client_sku.sku_id
|
||||||
|
LEFT JOIN sku_current_price sp ON s.id = sp.sku_id
|
||||||
|
LEFT JOIN sales_28 s28 ON s.id = s28.sku_id
|
||||||
|
LEFT JOIN sales_42 s42 ON s.id = s42.sku_id
|
||||||
|
LEFT JOIN sales_7 s7 ON s.id = s7.sku_id
|
||||||
|
LEFT JOIN qtyInOrdersNotShippedCTE ON s.id = qtyInOrdersNotShippedCTE.ID
|
||||||
|
WHERE client_sku.client_id = #{clientId}
|
||||||
|
AND s.status = 3
|
||||||
|
AND (
|
||||||
|
(sp.price_rmb IS NOT NULL AND sp.price_rmb <> 0)
|
||||||
|
OR (sp.price IS NOT NULL AND sp.price <> 0)
|
||||||
|
)
|
||||||
|
ORDER BY s.erp_code
|
||||||
|
;
|
||||||
|
</select>
|
||||||
|
<select id="listSelectableSkuIdsWithFilters" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
|
||||||
|
WITH qtyInOrdersNotShippedCTE AS (
|
||||||
|
SELECT sku_id as ID, SUM(quantity) AS quantity
|
||||||
|
FROM platform_order_content poc
|
||||||
|
JOIN platform_order po ON poc.platform_order_id = po.id
|
||||||
|
JOIN shop s ON po.shop_id = s.id
|
||||||
|
JOIN client c ON s.owner_id = c.id
|
||||||
|
WHERE c.id = #{clientId}
|
||||||
|
AND po.erp_status IN ('1','2')
|
||||||
|
AND poc.erp_status IN ('1','2')
|
||||||
|
GROUP BY sku_id
|
||||||
|
)
|
||||||
|
SELECT s.id,
|
||||||
|
s.erp_code,
|
||||||
|
s.en_name,
|
||||||
|
s.zh_name,
|
||||||
|
s.purchasing_amount,
|
||||||
|
s.available_amount,
|
||||||
|
qtyInOrdersNotShippedCTE.quantity as qtyInOrdersNotShipped,
|
||||||
|
s.available_amount + s.purchasing_amount - IF(qtyInOrdersNotShippedCTE.quantity IS NULL, 0, qtyInOrdersNotShippedCTE.quantity) as stock,
|
||||||
|
s.image_source,
|
||||||
|
s.service_fee,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE original_currency = 'EUR' AND target_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)) as sku_price,
|
||||||
|
sp.threshold as discount_moq,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.discounted_price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.discounted_price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE target_currency = 'EUR' AND original_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)) as discounted_price,
|
||||||
|
s7.quantity as sales_last_week,
|
||||||
|
s28.quantity as sales_four_weeks,
|
||||||
|
s42.quantity as sales_six_weeks
|
||||||
|
FROM sku s
|
||||||
|
JOIN client_sku ON s.id = client_sku.sku_id
|
||||||
|
LEFT JOIN sku_current_price sp ON s.id = sp.sku_id
|
||||||
|
LEFT JOIN sales_28 s28 ON s.id = s28.sku_id
|
||||||
|
LEFT JOIN sales_42 s42 ON s.id = s42.sku_id
|
||||||
|
LEFT JOIN sales_7 s7 ON s.id = s7.sku_id
|
||||||
|
LEFT JOIN qtyInOrdersNotShippedCTE ON s.id = qtyInOrdersNotShippedCTE.ID
|
||||||
|
WHERE client_sku.client_id = #{clientId}
|
||||||
|
AND s.status = 3
|
||||||
|
AND (
|
||||||
|
<if test="erpCodes != ''">
|
||||||
|
s.erp_code REGEXP #{erpCodes}
|
||||||
|
</if>
|
||||||
|
<if test="zhNames != ''">
|
||||||
|
<if test="erpCodes != ''">
|
||||||
|
AND
|
||||||
|
</if>
|
||||||
|
s.zh_name REGEXP #{zhNames}
|
||||||
|
</if>
|
||||||
|
<if test="enNames != ''">
|
||||||
|
<if test="erpCodes != '' || zhNames != ''">
|
||||||
|
AND
|
||||||
|
</if>
|
||||||
|
s.en_name REGEXP #{enNames}
|
||||||
|
</if>
|
||||||
|
)
|
||||||
|
AND (
|
||||||
|
(sp.price_rmb IS NOT NULL AND sp.price_rmb <> 0)
|
||||||
|
OR (sp.price IS NOT NULL AND sp.price <> 0)
|
||||||
|
)
|
||||||
|
ORDER BY s.erp_code
|
||||||
|
;
|
||||||
|
</select>
|
||||||
<select id="getInventoryByInvoiceNumber" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
|
<select id="getInventoryByInvoiceNumber" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
|
||||||
WITH skusFromInvoice AS (
|
WITH skusFromInvoice AS (
|
||||||
SELECT sku_id, quantity
|
SELECT sku_id, quantity
|
||||||
|
@ -470,6 +613,77 @@
|
||||||
WHERE s.id IN (SELECT sku_id FROM skusFromInvoice)
|
WHERE s.id IN (SELECT sku_id FROM skusFromInvoice)
|
||||||
GROUP BY s.id;
|
GROUP BY s.id;
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getInventory" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
|
||||||
|
WITH skusFromInvoice AS (
|
||||||
|
SELECT sku_id, quantity
|
||||||
|
FROM purchase_order_sku pos
|
||||||
|
JOIN purchase_order po ON pos.purchase_order_id = po.id
|
||||||
|
WHERE po.invoice_number = #{invoiceNumber}
|
||||||
|
),
|
||||||
|
qtyInOrdersNotShipped AS (
|
||||||
|
SELECT sku_id as ID, SUM(quantity) AS quantity
|
||||||
|
FROM platform_order_content poc
|
||||||
|
JOIN platform_order po ON poc.platform_order_id = po.id
|
||||||
|
JOIN shop s ON po.shop_id = s.id
|
||||||
|
JOIN client c ON s.owner_id = c.id
|
||||||
|
WHERE sku_id IN (SELECT sku_id FROM skusFromInvoice)
|
||||||
|
AND po.erp_status IN ('1','2')
|
||||||
|
AND poc.erp_status IN ('1','2')
|
||||||
|
GROUP BY sku_id
|
||||||
|
)
|
||||||
|
SELECT s.id,
|
||||||
|
s.erp_code,
|
||||||
|
s.en_name,
|
||||||
|
s.zh_name,
|
||||||
|
IFNULL(sfi.quantity, 0) as qtyOrdered,
|
||||||
|
s.purchasing_amount as purchasing_amount,
|
||||||
|
s.available_amount as available_amount,
|
||||||
|
IFNULL(qtyInOrdersNotShipped.quantity, 0) as qtyInOrdersNotShipped,
|
||||||
|
IF(s.available_amount IS NULL, 0, s.available_amount)
|
||||||
|
+ IF(s.purchasing_amount IS NULL, 0, s.purchasing_amount)
|
||||||
|
- IF(qtyInOrdersNotShipped.quantity IS NULL, 0, qtyInOrdersNotShipped.quantity)
|
||||||
|
as stock,
|
||||||
|
s.image_source as image_source,
|
||||||
|
s.service_fee as service_fee,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE original_currency = 'EUR' AND target_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)
|
||||||
|
) as sku_price,
|
||||||
|
sp.threshold as discount_moq,
|
||||||
|
IF(sp.price_rmb IS NULL, sp.discounted_price,
|
||||||
|
(
|
||||||
|
ROUND(
|
||||||
|
sp.discounted_price_rmb /
|
||||||
|
(SELECT rate
|
||||||
|
FROM exchange_rates
|
||||||
|
WHERE target_currency = 'EUR' AND original_currency = 'RMB'
|
||||||
|
ORDER BY create_time DESC LIMIT 1)
|
||||||
|
,2)
|
||||||
|
)
|
||||||
|
) as discounted_price,
|
||||||
|
IFNULL(s7.quantity, 0) as sales_last_week,
|
||||||
|
IFNULL(s28.quantity, 0) as sales_four_weeks,
|
||||||
|
IFNULL(s42.quantity, 0) as sales_six_weeks
|
||||||
|
FROM sku s
|
||||||
|
LEFT JOIN sku_price sp ON s.id = sp.sku_id
|
||||||
|
LEFT JOIN sales_28 s28 ON s.id = s28.sku_id
|
||||||
|
LEFT JOIN sales_42 s42 ON s.id = s42.sku_id
|
||||||
|
LEFT JOIN sales_7 s7 ON s.id = s7.sku_id
|
||||||
|
LEFT JOIN qtyInOrdersNotShipped ON s.id = qtyInOrdersNotShipped.ID
|
||||||
|
LEFT JOIN skusFromInvoice sfi ON s.id = sfi.sku_id
|
||||||
|
WHERE s.erp_code IN
|
||||||
|
<foreach collection="erpCodes" item="erpCode" index="index" separator="," open="(" close=")">
|
||||||
|
#{erpCode}
|
||||||
|
</foreach>
|
||||||
|
GROUP BY s.id;
|
||||||
|
</select>
|
||||||
<select id="getIdFromErpCode" resultType="java.lang.String">
|
<select id="getIdFromErpCode" resultType="java.lang.String">
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM sku
|
FROM sku
|
||||||
|
|
|
@ -36,4 +36,6 @@ public interface ISkuListMabangService extends IService<SkuData> {
|
||||||
|
|
||||||
Map<Sku, String> skuSyncUpsert(List<String> erpCodes);
|
Map<Sku, String> skuSyncUpsert(List<String> erpCodes);
|
||||||
void updateSkuId();
|
void updateSkuId();
|
||||||
|
|
||||||
|
void mabangSkuStockUpdate(List<String> erpCodes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,7 @@ public interface ISkuService extends IService<Sku> {
|
||||||
Integer countAllSkus();
|
Integer countAllSkus();
|
||||||
List<SkuOrderPage> fetchSkuWeights(Integer pageNo, Integer pageSize, String parsedColumn, String parsedOrder);
|
List<SkuOrderPage> fetchSkuWeights(Integer pageNo, Integer pageSize, String parsedColumn, String parsedOrder);
|
||||||
|
|
||||||
Integer countAllClientSkus();
|
Integer countAllClientSkus(String clientId);
|
||||||
List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order);
|
List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order);
|
||||||
|
|
||||||
Integer countAllSkuWeightsWithFilters(List<String> erpCodeList, List<String> zhNameList, List<String> enNameList);
|
Integer countAllSkuWeightsWithFilters(List<String> erpCodeList, List<String> zhNameList, List<String> enNameList);
|
||||||
|
@ -111,8 +111,13 @@ public interface ISkuService extends IService<Sku> {
|
||||||
void updateBatchStockByIds(List<Sku> skuToUpdate);
|
void updateBatchStockByIds(List<Sku> skuToUpdate);
|
||||||
|
|
||||||
List<SkuOrderPage> getInventoryByInvoiceNumber(String invoiceNumber);
|
List<SkuOrderPage> getInventoryByInvoiceNumber(String invoiceNumber);
|
||||||
|
List<SkuOrderPage> getInventory(List<String> erpCodes, String invoiceNumber);
|
||||||
|
|
||||||
List<Sku> listByClientId(String clientId);
|
List<Sku> listByClientId(String clientId);
|
||||||
|
|
||||||
List<SkuOrderPage> searchExistingSkuByKeywords(List<String> keywords);
|
List<SkuOrderPage> searchExistingSkuByKeywords(List<String> keywords);
|
||||||
|
|
||||||
|
List<SkuOrderPage> listSelectableSkuIdsWithFilters(String clientId, List<String> erpCodeList, List<String> zhNameList, List<String> enNameList);
|
||||||
|
|
||||||
|
List<SkuOrderPage> listSelectableSkuIds(String clientId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,13 @@ import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.*;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddRequest;
|
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddRequest;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddRequestBody;
|
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddRequestBody;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddResponse;
|
import org.jeecg.modules.business.domain.api.mabang.stockDoAddStock.SkuAddResponse;
|
||||||
|
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockData;
|
||||||
|
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockRawStream;
|
||||||
|
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockRequestBody;
|
||||||
|
import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuStockStream;
|
||||||
import org.jeecg.modules.business.entity.*;
|
import org.jeecg.modules.business.entity.*;
|
||||||
import org.jeecg.modules.business.mapper.SkuListMabangMapper;
|
import org.jeecg.modules.business.mapper.SkuListMabangMapper;
|
||||||
|
import org.jeecg.modules.business.mongoService.SkuMongoService;
|
||||||
import org.jeecg.modules.business.service.*;
|
import org.jeecg.modules.business.service.*;
|
||||||
import org.jeecg.modules.business.vo.Responses;
|
import org.jeecg.modules.business.vo.Responses;
|
||||||
import org.jeecg.modules.business.vo.SkuOrderPage;
|
import org.jeecg.modules.business.vo.SkuOrderPage;
|
||||||
|
@ -61,6 +66,8 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
||||||
@Autowired
|
@Autowired
|
||||||
private MigrationService migrationService;
|
private MigrationService migrationService;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private SkuMongoService skuMongoService;
|
||||||
|
@Autowired
|
||||||
private FreeMarkerConfigurer freemarkerConfigurer;
|
private FreeMarkerConfigurer freemarkerConfigurer;
|
||||||
@Autowired
|
@Autowired
|
||||||
Environment env;
|
Environment env;
|
||||||
|
@ -563,4 +570,56 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
||||||
params.put("execute_sql_string", sql);
|
params.put("execute_sql_string", sql);
|
||||||
onlCgformFieldMapper.executeUpdatetSQL(params);
|
onlCgformFieldMapper.executeUpdatetSQL(params);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public void mabangSkuStockUpdate(List<String> skuList) {
|
||||||
|
StringBuilder skus = new StringBuilder();
|
||||||
|
List<SkuStockData> updateList = new ArrayList<>();
|
||||||
|
List<Sku> skuToUpdate = new ArrayList<>();
|
||||||
|
int count = 1;
|
||||||
|
for(int i = 1; i <= skuList.size(); i++) {
|
||||||
|
if(i%100 != 1)
|
||||||
|
skus.append(",");
|
||||||
|
skus.append(skuList.get(i - 1));
|
||||||
|
if(i%100 == 0) {
|
||||||
|
SkuStockRequestBody body = (new SkuStockRequestBody())
|
||||||
|
.setStockSkus(skus.toString())
|
||||||
|
.setTotal(skuList.size());
|
||||||
|
log.info("Sending request for page {}/{}.", count++, body.getTotalPages());
|
||||||
|
|
||||||
|
SkuStockRawStream rawStream = new SkuStockRawStream(body);
|
||||||
|
SkuStockStream stream = new SkuStockStream(rawStream);
|
||||||
|
updateList.addAll(stream.all());
|
||||||
|
skus = new StringBuilder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(skus.length() != 0) {
|
||||||
|
SkuStockRequestBody body = (new SkuStockRequestBody())
|
||||||
|
.setStockSkus(skus.toString())
|
||||||
|
.setTotal(skuList.size());
|
||||||
|
SkuStockRawStream rawStream = new SkuStockRawStream(body);
|
||||||
|
SkuStockStream stream = new SkuStockStream(rawStream);
|
||||||
|
updateList.addAll(stream.all());
|
||||||
|
}
|
||||||
|
updateList.forEach(skuStockData -> {
|
||||||
|
Sku sku = skuService.getByErpCode(skuStockData.getStockSku());
|
||||||
|
Integer availableAmount = skuStockData.getWarehouseStock("SZBA宝安仓").getStockQuantity();
|
||||||
|
Integer purchasingAmount = skuStockData.getWarehouseStock("SZBA宝安仓").getShippingQuantity();
|
||||||
|
if(sku.getAvailableAmount().equals(availableAmount) && sku.getPurchasingAmount().equals(purchasingAmount)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sku.setAvailableAmount(availableAmount);
|
||||||
|
sku.setPurchasingAmount(purchasingAmount);
|
||||||
|
sku.setUpdateBy("mabang api");
|
||||||
|
sku.setUpdateTime(new Date());
|
||||||
|
skuToUpdate.add(sku);
|
||||||
|
});
|
||||||
|
if(skuToUpdate.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log.info("Updating stock for {} skus.", skuToUpdate.size());
|
||||||
|
skuService.updateBatchStockByIds(skuToUpdate);
|
||||||
|
for(Sku sku : skuToUpdate) {
|
||||||
|
skuMongoService.updateStock(sku);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,8 +420,8 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Integer countAllClientSkus() {
|
public Integer countAllClientSkus(String clientId) {
|
||||||
return skuMapper.countAllClientSkus();
|
return skuMapper.countAllClientSkus(clientId);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order) {
|
public List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order) {
|
||||||
|
@ -537,6 +537,38 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
|
||||||
return skuMapper.fetchSkusByClientWithFilters(clientId, offset, pageSize, column, order, erpCodesRegex.toString(), zhNamesRegex.toString(), enNamesRegex.toString());
|
return skuMapper.fetchSkusByClientWithFilters(clientId, offset, pageSize, column, order, erpCodesRegex.toString(), zhNamesRegex.toString(), enNamesRegex.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SkuOrderPage> listSelectableSkuIdsWithFilters(String clientId, List<String> erpCodes, List<String> zhNames, List<String> enNames) {
|
||||||
|
StringBuilder erpCodesRegex= new StringBuilder(), zhNamesRegex = new StringBuilder(), enNamesRegex = new StringBuilder();
|
||||||
|
if(erpCodes != null){
|
||||||
|
erpCodesRegex.append("^");
|
||||||
|
for(String name : erpCodes){
|
||||||
|
erpCodesRegex.append("(?=.*").append(name).append(")");
|
||||||
|
}
|
||||||
|
erpCodesRegex.append(".*");
|
||||||
|
}
|
||||||
|
if(enNames != null){
|
||||||
|
enNamesRegex.append("^");
|
||||||
|
for(String name : enNames){
|
||||||
|
enNamesRegex.append("(?=.*").append(name).append(")");
|
||||||
|
}
|
||||||
|
enNamesRegex.append(".*");
|
||||||
|
}
|
||||||
|
if(zhNames != null){
|
||||||
|
zhNamesRegex.append("^");
|
||||||
|
for(String name : zhNames){
|
||||||
|
zhNamesRegex.append("(?=.*").append(name).append(")");
|
||||||
|
}
|
||||||
|
zhNamesRegex.append(".*$");
|
||||||
|
}
|
||||||
|
return skuMapper.listSelectableSkuIdsWithFilters(clientId, erpCodesRegex.toString(), zhNamesRegex.toString(), enNamesRegex.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SkuOrderPage> listSelectableSkuIds(String clientId) {
|
||||||
|
return skuMapper.listSelectableSkuIds(clientId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addSkuQuantity(Map<String, Integer> quantityPurchased) {
|
public void addSkuQuantity(Map<String, Integer> quantityPurchased) {
|
||||||
skuMapper.addSkuQuantity(quantityPurchased);
|
skuMapper.addSkuQuantity(quantityPurchased);
|
||||||
|
@ -562,6 +594,11 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
|
||||||
return skuMapper.getInventoryByInvoiceNumber(invoiceNumber);
|
return skuMapper.getInventoryByInvoiceNumber(invoiceNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SkuOrderPage> getInventory(List<String> erpCodes, String invoiceNumber) {
|
||||||
|
return skuMapper.getInventory(erpCodes, invoiceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Sku> listByClientId(String clientId) {
|
public List<Sku> listByClientId(String clientId) {
|
||||||
return skuMapper.listByClientId(clientId);
|
return skuMapper.listByClientId(clientId);
|
||||||
|
|
Loading…
Reference in New Issue