mirror of https://github.com/jeecgboot/jeecg-boot
(WIP) Row locking when invoicing and job updating orders with skip locked or skip wait
parent
31d978d66a
commit
c82e8c5221
|
@ -579,30 +579,15 @@ public class SkuController {
|
|||
public Result<?> unpairedSkus(@RequestParam(name = "shop") String shopCode,
|
||||
@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 = "skus[]", required = false) List<String> skuNames
|
||||
) {
|
||||
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(400, "Bad Request");
|
||||
}
|
||||
try {
|
||||
specialFilterContentForDictSql(parsedColumn);
|
||||
} catch (RuntimeException e) {
|
||||
return Result.error(400, "Bad Request");
|
||||
}
|
||||
if(skuNames == null)
|
||||
skuNames = new ArrayList<>();
|
||||
String shopId = shopService.getIdByCode(shopCode);
|
||||
if (shopId == null) return Result.error(404, "Shop not found");
|
||||
int total = skuListMabangService.countUnpairedSkus(shopId);
|
||||
List<SkuOrderPage> unpairedSkus = skuListMabangService.unpairedSkus(shopId, pageNo, pageSize, parsedColumn, parsedOrder);
|
||||
List<SkuOrderPage> unpairedSkus = skuListMabangService.unpairedSkus(shopId, skuNames);
|
||||
|
||||
IPage<SkuOrderPage> page = new Page<>();
|
||||
page.setRecords(unpairedSkus);
|
||||
page.setCurrent(pageNo);
|
||||
page.setSize(pageSize);
|
||||
page.setTotal(total);
|
||||
return Result.OK(page);
|
||||
return Result.OK(unpairedSkus);
|
||||
}
|
||||
|
||||
@GetMapping(value = "/latestSkuCounter")
|
||||
|
|
|
@ -141,6 +141,12 @@ public class SkuData {
|
|||
private String supplier;
|
||||
@JSONField(name="productLinkAddress")
|
||||
private String supplierLink;
|
||||
@JSONField(name="saleUrl")
|
||||
private String saleUrl;
|
||||
/**
|
||||
* 商品多属性
|
||||
*/
|
||||
private String specifics;
|
||||
|
||||
public SkuStatus getStatus() {
|
||||
return SkuStatus.fromCode(this.status);
|
||||
|
@ -168,7 +174,9 @@ public class SkuData {
|
|||
"\nIs Flammable : " + this.isFlammable +
|
||||
"\nIs Knife : " + this.isKnife +
|
||||
"\nIs Gift : " + this.isGift +
|
||||
"\nProvider : " + this.supplier
|
||||
"\nProvider : " + this.supplier +
|
||||
"\nProduct Link : " + this.supplierLink +
|
||||
"\nSale Url : " + this.saleUrl
|
||||
;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ public class SkuListRequestBody implements RequestBody {
|
|||
putNonNull(json, "showProvider", showProvider);
|
||||
putNonNull(json, "showWarehouse", String.valueOf(showWarehouse));
|
||||
putNonNull(json, "showLabel", String.valueOf(showLabel));
|
||||
putNonNull(json, "showAttributes", showAttributes);
|
||||
putNonNull(json, "showattributes", String.valueOf(showAttributes));
|
||||
return json;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,12 +9,17 @@ import lombok.Data;
|
|||
@Data
|
||||
public class OrderItem {
|
||||
|
||||
@JSONField(name="stockId")
|
||||
private String stockId;
|
||||
/**
|
||||
* Erp code of sku in DB.
|
||||
*/
|
||||
@JSONField(name = "stockSku")
|
||||
private String erpCode;
|
||||
|
||||
@JSONField(name="title")
|
||||
private String title;
|
||||
@JSONField(name="originTitle")
|
||||
private String originTitle;
|
||||
@JSONField(deserialize = false)
|
||||
private String platformOrderId;
|
||||
|
||||
|
@ -42,6 +47,8 @@ public class OrderItem {
|
|||
@JSONField(name = "specifics")
|
||||
private String specifics;
|
||||
|
||||
@JSONField(name="amazonAsin")
|
||||
private String saleUrl;
|
||||
/**
|
||||
* Status :
|
||||
* 2 = Normal
|
||||
|
|
|
@ -7,6 +7,7 @@ import org.jeecg.modules.business.entity.Sku;
|
|||
import org.jeecg.modules.business.vo.SkuOrderPage;
|
||||
import org.jeecg.modules.business.vo.SkuQuantity;
|
||||
import org.jeecg.modules.business.vo.SkuUpdate;
|
||||
import org.jeecg.modules.business.vo.UnpairedSku;
|
||||
import org.jeecg.modules.business.vo.inventory.InventoryRecord;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
|
@ -83,9 +84,7 @@ public interface SkuMapper extends BaseMapper<Sku> {
|
|||
|
||||
List<String> fetchAllClientSkuCodes(@Param("clientCode") String clientCode);
|
||||
|
||||
List<String> fetchUnpairedSkus(@Param("shopId") String shopId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order);
|
||||
|
||||
int countUnpairedSkus(@Param("shopId") String shopId);
|
||||
List<UnpairedSku> fetchUnpairedSkus(@Param("shopId") String shopId);
|
||||
|
||||
List<String> latestSkuCounter(@Param("userCode") String userCode, @Param("clientCode") String clientCode, @Param("date") String date);
|
||||
|
||||
|
|
|
@ -799,8 +799,8 @@
|
|||
WHERE c.internal_code = #{clientCode};
|
||||
</select>
|
||||
|
||||
<select id="fetchUnpairedSkus" resultType="java.lang.String">
|
||||
SELECT poc.sku_id as erp_code
|
||||
<select id="fetchUnpairedSkus" resultType="org.jeecg.modules.business.vo.UnpairedSku">
|
||||
SELECT po.platform_order_id as platform_order_id, poc.sku_id as stock_sku
|
||||
FROM platform_order po
|
||||
JOIN shop s ON po.shop_id = s.id
|
||||
JOIN platform_order_content poc ON po.id = poc.platform_order_id
|
||||
|
@ -809,20 +809,7 @@
|
|||
AND po.erp_status IN (1, 2)
|
||||
AND poc.erp_status <> 5
|
||||
AND s.id = #{shopId}
|
||||
GROUP BY poc.sku_id
|
||||
ORDER BY ${column} ${order}
|
||||
LIMIT #{offset}, #{size};
|
||||
</select>
|
||||
<select id="countUnpairedSkus" resultType="java.lang.Integer">
|
||||
SELECT COUNT(DISTINCT poc.sku_id)
|
||||
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
|
||||
LEFT JOIN sku ON poc.sku_id = sku.id
|
||||
WHERE sku.id IS NULL
|
||||
AND po.erp_status IN (1, 2)
|
||||
AND poc.erp_status <> 5
|
||||
AND s.id = #{shopId};
|
||||
GROUP BY poc.sku_id;
|
||||
</select>
|
||||
<select id="latestSkuCounter" resultType="java.lang.String">
|
||||
SELECT erp_code
|
||||
|
|
|
@ -44,9 +44,7 @@ public interface ISkuListMabangService extends IService<SkuData> {
|
|||
|
||||
List<SkuData> fetchUnpairedSkus(List<String> stockSkuList);
|
||||
|
||||
List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order);
|
||||
|
||||
int countUnpairedSkus(String shopId);
|
||||
List<SkuOrderPage> unpairedSkus(String shopId, List<String> skuNames);
|
||||
|
||||
void compareClientSkusWithMabang(Map<String, Sku> clientSkus);
|
||||
}
|
||||
|
|
|
@ -125,9 +125,7 @@ public interface ISkuService extends IService<Sku> {
|
|||
|
||||
List<String> fetchAllClientSkuCodes(String clientCode);
|
||||
|
||||
List<String> fetchUnpairedSkus(String shopId, int offset, Integer pageSize, String column, String order);
|
||||
|
||||
int countUnpairedSkus(String shopId);
|
||||
List<UnpairedSku> fetchUnpairedSkus(String shopId);
|
||||
|
||||
int latestSkuCounter(String userCode, String clientCode, String date);
|
||||
|
||||
|
|
|
@ -3,7 +3,6 @@ package org.jeecg.modules.business.service.impl;
|
|||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.jeecg.qywx.api.conversation.ConversationAPI;
|
||||
import freemarker.template.Template;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.shiro.SecurityUtils;
|
||||
|
@ -11,6 +10,9 @@ import org.jeecg.common.system.vo.LoginUser;
|
|||
import org.jeecg.common.util.SpringContextUtils;
|
||||
import org.jeecg.modules.business.domain.api.mabang.Response;
|
||||
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.*;
|
||||
import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order;
|
||||
import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderItem;
|
||||
import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderListRequestBody;
|
||||
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.SkuAddResponse;
|
||||
|
@ -29,6 +31,7 @@ import org.jeecg.modules.business.mongoService.SkuMongoService;
|
|||
import org.jeecg.modules.business.service.*;
|
||||
import org.jeecg.modules.business.vo.ResponsesWithMsg;
|
||||
import org.jeecg.modules.business.vo.SkuOrderPage;
|
||||
import org.jeecg.modules.business.vo.UnpairedSku;
|
||||
import org.jeecg.modules.message.websocket.WebSocketSender;
|
||||
import org.jeecg.modules.online.cgform.mapper.OnlCgformFieldMapper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
@ -81,6 +84,8 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
|||
@Autowired
|
||||
private SkuMongoService skuMongoService;
|
||||
@Autowired
|
||||
private IPlatformOrderMabangService platformOrderMabangService;
|
||||
@Autowired
|
||||
private FreeMarkerConfigurer freemarkerConfigurer;
|
||||
@Autowired
|
||||
Environment env;
|
||||
|
@ -625,6 +630,10 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
|||
sop.setIsGift(skuData.getIsGift());
|
||||
sop.setSupplier(skuData.getSupplier());
|
||||
sop.setSupplierLink(skuData.getSupplierLink());
|
||||
if(skuData.getSaleUrl() != null)
|
||||
sop.setSaleUrl(skuData.getSaleUrl());
|
||||
if(skuData.getSpecifics() != null)
|
||||
sop.setSpecifics(skuData.getSpecifics());
|
||||
sop.setStatus(skuData.getStatusValue());
|
||||
return sop;
|
||||
}
|
||||
|
@ -868,6 +877,7 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
|||
body.setShowWarehouse(1);
|
||||
body.setShowLabel(1);
|
||||
body.setStockSkuList(String.join(",", skuPartition));
|
||||
body.setShowAttributes(1);
|
||||
SkuListRawStream rawStream = new SkuListRawStream(body);
|
||||
UnpairedSkuListStream stream = new UnpairedSkuListStream(rawStream);
|
||||
skuDataList.addAll(stream.all());
|
||||
|
@ -876,21 +886,38 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order) {
|
||||
int offset = (pageNo - 1) * pageSize;
|
||||
List<String> stockSkuList = skuService.fetchUnpairedSkus(shopId, offset, pageSize, column, order);
|
||||
if(stockSkuList.isEmpty()){
|
||||
public List<SkuOrderPage> unpairedSkus(String shopId, List<String> skuNames) {
|
||||
List<UnpairedSku> unpairedSkus = skuService.fetchUnpairedSkus(shopId);
|
||||
if(unpairedSkus.isEmpty()){
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<SkuData> skuDataList = fetchUnpairedSkus(stockSkuList);
|
||||
List<String> platformOrderIds = unpairedSkus.stream().distinct().map(UnpairedSku::getPlatformOrderId).collect(Collectors.toList());
|
||||
List<List<String>> platformOrderPartitions = Lists.partition(platformOrderIds, 50);
|
||||
List<OrderListRequestBody> orderRequestBodies = new ArrayList<>();
|
||||
for (List<String> platformOrderIdList : platformOrderPartitions) {
|
||||
orderRequestBodies.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList));
|
||||
}
|
||||
ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_NUMBER_OF_THREADS);
|
||||
List<Order> mabangOrders = platformOrderMabangService.getOrdersFromMabang(orderRequestBodies, executor);
|
||||
List<OrderItem> mabangOrderItems = mabangOrders.stream().map(Order::getOrderItems).flatMap(List::stream).collect(Collectors.toList());
|
||||
List<SkuData> skuDataList = fetchUnpairedSkus(unpairedSkus.stream().map(UnpairedSku::getStockSku).collect(toList()));
|
||||
skuDataList.forEach(skuData -> {
|
||||
mabangOrderItems.stream().filter(orderItem -> orderItem.getStockId().equals(String.valueOf(skuData.getStockSkuId()))).findFirst()
|
||||
.ifPresent(orderItem -> {
|
||||
skuData.setSaleUrl(orderItem.getSaleUrl());
|
||||
skuData.setSpecifics(orderItem.getSpecifics());
|
||||
});
|
||||
});
|
||||
if(skuNames.isEmpty())
|
||||
return skuDataList.stream()
|
||||
.map(this::SkuDataToSkuOrderPage)
|
||||
.sorted(Comparator.comparing(SkuOrderPage::getErpCode))
|
||||
.collect(toList());
|
||||
else
|
||||
return skuDataList.stream()
|
||||
.filter(skuData -> skuNames.contains(skuData.getNameEN()) || skuNames.contains(skuData.getDeclareNameEn()))
|
||||
.map(this::SkuDataToSkuOrderPage)
|
||||
.collect(toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int countUnpairedSkus(String shopId) {
|
||||
return skuService.countUnpairedSkus(shopId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -618,13 +618,8 @@ public class SkuServiceImpl extends ServiceImpl<SkuMapper, Sku> implements ISkuS
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<String> fetchUnpairedSkus(String shopId, int offset, Integer pageSize, String column, String order) {
|
||||
return skuMapper.fetchUnpairedSkus(shopId, offset, pageSize, column, order);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int countUnpairedSkus(String shopId) {
|
||||
return skuMapper.countUnpairedSkus(shopId);
|
||||
public List<UnpairedSku> fetchUnpairedSkus(String shopId) {
|
||||
return skuMapper.fetchUnpairedSkus(shopId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -324,7 +324,7 @@ public class PurchaseOrderServiceImpl extends ServiceImpl<PurchaseOrderMapper, P
|
|||
|
||||
String purchaseID = UUID.randomUUID().toString();
|
||||
|
||||
String invoiceNumber = invoiceNumberReservationService.getLatestInvoiceNumberByType(COMPLETE.getType());
|
||||
String invoiceNumber = invoiceNumberReservationService.getLatestInvoiceNumberByType(PURCHASE.getType());
|
||||
// 1. save purchase itself
|
||||
purchaseOrderMapper.addPurchase(
|
||||
purchaseID,
|
||||
|
|
|
@ -205,6 +205,10 @@ public class SkuOrderPage {
|
|||
@ApiModelProperty(value = "供应商商品网址")
|
||||
private String supplierLink;
|
||||
|
||||
@Excel(name="产品销售链接", width = 15)
|
||||
@ApiModelProperty(value = "产品销售链接")
|
||||
private String saleUrl;
|
||||
|
||||
@Excel(name = "仓库", width = 15)
|
||||
@ApiModelProperty(value = "仓库")
|
||||
private String warehouse;
|
||||
|
@ -212,4 +216,8 @@ public class SkuOrderPage {
|
|||
@Excel(name ="自定义分类", width = 15)
|
||||
@ApiModelProperty(value = "自定义分类")
|
||||
private String labelData;
|
||||
|
||||
@Excel(name = "商品多属性", width = 15)
|
||||
@ApiModelProperty(value = "商品多属性")
|
||||
private String specifics;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package org.jeecg.modules.business.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@ApiModel(value = "UnpairedSku", description = "Unpaired SKU")
|
||||
public class UnpairedSku {
|
||||
private String stockSku;
|
||||
private String platformOrderId;
|
||||
}
|
Loading…
Reference in New Issue