feat: better pagination and new filter logic for skuOrderPage

pull/8040/head
Gauthier LO 2024-07-02 14:35:21 +02:00
parent af3540274c
commit 97793b76b4
6 changed files with 187 additions and 11 deletions

View File

@ -3,6 +3,7 @@ package org.jeecg.modules.business.controller.admin;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.CaseFormat;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -33,6 +34,8 @@ import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql;
/**
* @Description: SKU
* @Author: jeecg-boot
@ -343,13 +346,53 @@ public class SkuController {
.collect(Collectors.toList())
);
}
@GetMapping("/skuListByClient")
public Result<?> skusListByClient(@RequestParam("clientId") String clientId) {
List<Sku> skus = skuService.listByClientId(clientId);
return Result.OK(skus);
}
@GetMapping("/skusByClient")
public Result<?> skusByClient(@RequestParam String clientId) {
List<SkuOrderPage> skuOrdersPage = skuService.fetchSkusByClient(clientId);
public Result<?> skusByClient(@RequestParam(name = "clientId") String clientId,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize,
@RequestParam(name = "column", defaultValue = "erp_code") String column,
@RequestParam(name = "order", defaultValue = "ASC") String order,
@RequestParam(name = "erpCodes", required = false) String erpCodes,
@RequestParam(name = "zhNames", required = false) String zhNames,
@RequestParam(name = "enNames", required = false) String enNames
) {
String parsedColumn = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column.replace("_dictText", ""));
String parsedOrder = order.toUpperCase();
if(!parsedOrder.equals("ASC") && !parsedOrder.equals("DESC")) {
return Result.error("Error 400 Bad Request");
}
try {
specialFilterContentForDictSql(parsedColumn);
} catch (RuntimeException e) {
return Result.error("Error 400 Bad Request");
}
List<SkuOrderPage> allSkuOrdersPage = new ArrayList<>();
List<SkuOrderPage> skuOrdersPage = new ArrayList<>();
int total = 0;
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(","));
allSkuOrdersPage = skuService.fetchSkusByClientWithFilters(clientId, 1, -1, parsedColumn, parsedOrder, erpCodeList, zhNameList, enNameList);
skuOrdersPage = skuService.fetchSkusByClientWithFilters(clientId, pageNo, pageSize, parsedColumn, parsedOrder, erpCodeList, zhNameList, enNameList);
}
else {
allSkuOrdersPage = skuService.fetchSkusByClient(clientId, 1, -1, parsedColumn, parsedOrder);
skuOrdersPage = skuService.fetchSkusByClient(clientId, pageNo, pageSize, parsedColumn, parsedOrder);
}
total = allSkuOrdersPage.size();
IPage<SkuOrderPage> page = new Page<>();
page.setRecords(skuOrdersPage);
page.setTotal(skuOrdersPage.size());
page.setCurrent(pageNo);
page.setSize(pageSize);
page.setTotal(total);
return Result.OK(page);
}
}

View File

@ -508,7 +508,7 @@ public class InvoiceController {
* @return A triplet of order, shipping invoice availability and purchase invoice availability
*/
@GetMapping(value = "/preShipping/ordersStatusByShops")
public Result<?> getOrdersStatusByShops(@RequestParam("shopIds") String shopIds,
public Result<?> getOrdersStatusByShops(@RequestParam(name = "shopIds") String shopIds,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize,
@RequestParam(name = "column", defaultValue = "order_time") String column,

View File

@ -54,7 +54,8 @@ public interface SkuMapper extends BaseMapper<Sku> {
List<SkuQuantity> getSkuQuantitiesFromOrderIds(@Param("orderIds") List<String> orderIds);
List<SkuOrderPage> fetchSkusByClient(@Param("clientId") String clientId);
List<SkuOrderPage> fetchSkusByClient(@Param("clientId") String clientId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order);
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);
String getIdFromErpCode(@Param("erpCode") String erpCode);
@ -65,4 +66,6 @@ public interface SkuMapper extends BaseMapper<Sku> {
void updateBatchStockByIds(@Param("skus") List<Sku> skuToUpdate);
List<SkuOrderPage> getInventoryByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
List<Sku> listByClientId(@Param("clientId") String clientId);
}

View File

@ -160,7 +160,7 @@
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 po.erp_status IN ('1','2')
AND poc.erp_status IN ('1','2')
GROUP BY sku_id
)
@ -208,7 +208,92 @@
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
WHERE client_sku.client_id = #{clientId};
WHERE client_sku.client_id = #{clientId}
ORDER BY ${column} ${order}
<if test="size != -1">
LIMIT #{offset}, #{size}
</if>
;
</select>
<select id="fetchSkusByClientWithFilters" 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,
p.en_name as productEn,
p.zh_name as product,
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
JOIN product p ON s.product_id = p.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 (
<if test="erpCodes != ''">
s.erp_code REGEXP #{erpCodes}
</if>
<if test="zhNames != ''">
<if test="erpCodes != ''">
AND
</if>
p.zh_name REGEXP #{zhNames}
</if>
<if test="enNames != ''">
<if test="erpCodes != '' || zhNames != ''">
AND
</if>
p.en_name REGEXP #{enNames}
</if>
)
ORDER BY ${column} ${order}
<if test="size != -1">
LIMIT #{offset}, #{size}
</if>
;
</select>
<select id="getInventoryByInvoiceNumber" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
WITH skusFromInvoice AS (
@ -316,4 +401,14 @@
#{sku.id}
</foreach>
</update>
<select id="listByClientId" resultType="org.jeecg.modules.business.vo.SkuOrderPage">
SELECT s.id,
s.erp_code,
p.en_name as productEn,
p.zh_name as product
FROM sku s
JOIN client_sku ON s.id = client_sku.sku_id
JOIN product p ON s.product_id = p.id
WHERE client_sku.client_id = #{clientId};
</select>
</mapper>

View File

@ -95,12 +95,13 @@ public interface ISkuService extends IService<Sku> {
List<SkuQuantity> getSkuQuantitiesFromOrderIds(List<String> orderIds);
List<SkuOrderPage> fetchSkusByClient(String clientId);
List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order);
List<SkuOrderPage> fetchSkusByClientWithFilters(String clientId, Integer pageNo, Integer pageSize, String column, String order, List<String> erpCodes, List<String> zhNames, List<String> enNames);
void addSkuQuantity(Map<String, Integer> quantityPurchased);
String getIdFromErpCode(String erpCode);
Sku getByErpCode(String erpCode);
void updateBatchStockByIds(List<Sku> skuToUpdate);
List<SkuOrderPage> getInventoryByInvoiceNumber(String invoiceNumber);
List<Sku> listByClientId(String clientId);
}

View File

@ -417,8 +417,37 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
}
@Override
public List<SkuOrderPage> fetchSkusByClient(String clientId) {
return skuMapper.fetchSkusByClient(clientId);
public List<SkuOrderPage> fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order) {
int offset = (pageNo - 1) * pageSize;
return skuMapper.fetchSkusByClient(clientId, offset, pageSize, column, order);
}
@Override
public List<SkuOrderPage> fetchSkusByClientWithFilters(String clientId, Integer pageNo, Integer pageSize, String column, String order, List<String> erpCodes, List<String> zhNames, List<String> enNames) {
int offset = (pageNo - 1) * pageSize;
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.fetchSkusByClientWithFilters(clientId, offset, pageSize, column, order, erpCodesRegex.toString(), zhNamesRegex.toString(), enNamesRegex.toString());
}
@Override
@ -446,4 +475,9 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
return skuMapper.getInventoryByInvoiceNumber(invoiceNumber);
}
@Override
public List<Sku> listByClientId(String clientId) {
return skuMapper.listByClientId(clientId);
}
}