mirror of https://github.com/jeecgboot/jeecg-boot
feature : Create Mabang Purchase Order
parent
8253ba1877
commit
e5fe9a4989
|
@ -14,6 +14,7 @@ import org.jeecg.common.system.query.QueryGenerator;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.system.vo.LoginUser;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.jeecg.modules.business.controller.UserException;
|
import org.jeecg.modules.business.controller.UserException;
|
||||||
|
import org.jeecg.modules.business.domain.job.ThrottlingExecutorService;
|
||||||
import org.jeecg.modules.business.entity.*;
|
import org.jeecg.modules.business.entity.*;
|
||||||
import org.jeecg.modules.business.service.*;
|
import org.jeecg.modules.business.service.*;
|
||||||
import org.jeecg.modules.business.vo.*;
|
import org.jeecg.modules.business.vo.*;
|
||||||
|
@ -37,6 +38,9 @@ import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,27 +70,25 @@ public class PurchaseOrderController {
|
||||||
private IPlatformOrderService platformOrderService;
|
private IPlatformOrderService platformOrderService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private IShippingInvoiceService shippingInvoiceService;
|
private IShippingInvoiceService shippingInvoiceService;
|
||||||
|
@Autowired private IProviderMabangService providerMabangService;
|
||||||
|
|
||||||
|
private static final Integer DEFAULT_NUMBER_OF_THREADS = 2;
|
||||||
|
private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10;
|
||||||
/**
|
/**
|
||||||
* Page query for purchase order
|
* Page query for purchase order
|
||||||
*
|
*
|
||||||
* @param purchaseOrder
|
|
||||||
* @param pageNo
|
* @param pageNo
|
||||||
* @param pageSize
|
* @param pageSize
|
||||||
* @param req
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@AutoLog(value = "商品采购订单-分页列表查询")
|
@AutoLog(value = "商品采购订单-分页列表查询")
|
||||||
@ApiOperation(value = "商品采购订单-分页列表查询", notes = "商品采购订单-分页列表查询")
|
@ApiOperation(value = "商品采购订单-分页列表查询", notes = "商品采购订单-分页列表查询")
|
||||||
@GetMapping(value = "/list")
|
@GetMapping(value = "/list")
|
||||||
public Result<?> queryPageList(PurchaseOrder purchaseOrder,
|
public Result<?> queryPageList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
||||||
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
|
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
|
||||||
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
Page<PurchaseOrderPage> page = new Page<>(pageNo, pageSize);
|
||||||
HttpServletRequest req) {
|
purchaseOrderService.setPageForList(page);
|
||||||
QueryWrapper<PurchaseOrder> queryWrapper = QueryGenerator.initQueryWrapper(purchaseOrder, req.getParameterMap());
|
return Result.OK(page);
|
||||||
Page<PurchaseOrder> page = new Page<>(pageNo, pageSize);
|
|
||||||
IPage<PurchaseOrder> pageList = purchaseOrderService.page(page, queryWrapper);
|
|
||||||
return Result.OK(pageList);
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 添加
|
* 添加
|
||||||
|
@ -590,4 +592,31 @@ public class PurchaseOrderController {
|
||||||
PurchaseConfirmation d = platformOrderService.confirmPurchaseBySkuQuantity(clientInfo, skuQuantities);
|
PurchaseConfirmation d = platformOrderService.confirmPurchaseBySkuQuantity(clientInfo, skuQuantities);
|
||||||
return Result.OK(d);
|
return Result.OK(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping(value = "/createMabangPurchaseOrder")
|
||||||
|
public Result<?> createMabangPurchaseOrder(@RequestParam("invoiceNumbers") List<String> request) {
|
||||||
|
log.info("Creating purchase order to Mabang for invoices : {} ", request);
|
||||||
|
ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
|
||||||
|
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
|
||||||
|
List<CompletableFuture<Boolean>> changeOrderFutures = request.stream()
|
||||||
|
.map(invoiceNumber -> CompletableFuture.supplyAsync(() -> {
|
||||||
|
log.info("Invoice number : {}", invoiceNumber);
|
||||||
|
List<SkuQuantity> skuQuantities = purchaseOrderService.getSkuQuantityByInvoiceNumber(invoiceNumber);
|
||||||
|
if(skuQuantities.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Map<String, Integer> skuQuantityMap = skuQuantities.stream()
|
||||||
|
.collect(Collectors.toMap(SkuQuantity::getErpCode, SkuQuantity::getQuantity));
|
||||||
|
skuQuantityMap.forEach((s, integer) -> log.info("SKU: {} Quantity: {}", s, integer));
|
||||||
|
InvoiceMetaData metaData = purchaseOrderService.getMetaDataFromInvoiceNumbers(invoiceNumber);
|
||||||
|
return providerMabangService.addPurchaseOrderToMabang(skuQuantityMap, metaData);
|
||||||
|
},throttlingExecutorService))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<Boolean> results = changeOrderFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
|
||||||
|
long nbSuccesses = results.stream().filter(b -> b).count();
|
||||||
|
log.info("{}/{} purchase order requests have succeeded.", nbSuccesses, request.size());
|
||||||
|
|
||||||
|
return Result.ok("data.noData");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,6 +322,7 @@ public class InvoiceController {
|
||||||
/**
|
/**
|
||||||
* Make purchase invoice for specified orders and type
|
* Make purchase invoice for specified orders and type
|
||||||
* used by self-service clients
|
* used by self-service clients
|
||||||
|
* creates a purchase order in Mabang
|
||||||
* @param param Parameters for creating an invoice
|
* @param param Parameters for creating an invoice
|
||||||
* @return Result of the generation, in case of error, message will be contained,
|
* @return Result of the generation, in case of error, message will be contained,
|
||||||
* in case of success, data will contain filename.
|
* in case of success, data will contain filename.
|
||||||
|
@ -426,12 +427,11 @@ public class InvoiceController {
|
||||||
List<SkuQuantity> skuQuantities = new ArrayList<>();
|
List<SkuQuantity> skuQuantities = new ArrayList<>();
|
||||||
for(Map.Entry<String, Integer> entry : payload.entrySet()) {
|
for(Map.Entry<String, Integer> entry : payload.entrySet()) {
|
||||||
String skuId = skuService.getIdFromErpCode(entry.getKey());
|
String skuId = skuService.getIdFromErpCode(entry.getKey());
|
||||||
skuQuantities.add(new SkuQuantity(skuId, entry.getValue()));
|
skuQuantities.add(new SkuQuantity(skuId, entry.getKey(), entry.getValue()));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
String purchaseId = purchaseOrderService.addPurchase(skuQuantities);
|
String purchaseId = purchaseOrderService.addPurchase(skuQuantities);
|
||||||
metaData = purchaseOrderService.makeInvoice(purchaseId);
|
metaData = purchaseOrderService.makeInvoice(purchaseId);
|
||||||
providerMabangService.addPurchaseOrderToMabang(payload, metaData);
|
|
||||||
return Result.OK(metaData);
|
return Result.OK(metaData);
|
||||||
} catch (UserException e) {
|
} catch (UserException e) {
|
||||||
return Result.error(e.getMessage());
|
return Result.error(e.getMessage());
|
||||||
|
|
|
@ -49,16 +49,16 @@ public class SkuListRawStream implements NetworkDataStream<SkuListResponse> {
|
||||||
if (!began) {
|
if (!began) {
|
||||||
throw new IllegalStateException("Calling hasNext before begin");
|
throw new IllegalStateException("Calling hasNext before begin");
|
||||||
}
|
}
|
||||||
|
// no page left, false
|
||||||
|
if(currentResponse.getCursor().isEmpty()) {
|
||||||
|
log.info("No page left, end");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// still has page left, true
|
// still has page left, true
|
||||||
if (!currentResponse.getCursor().isEmpty() || currentResponse.getCursor().equals(toSend.getCursor())) {
|
|
||||||
log.info("page: {}, has next", toSend.getPage());
|
log.info("page: {}, has next", toSend.getPage());
|
||||||
toSend.setCursor(currentResponse.getCursor());
|
toSend.setCursor(currentResponse.getCursor());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// no page left, false
|
|
||||||
log.info("No page left, end");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get next Order.
|
* Get next Order.
|
||||||
|
|
|
@ -103,6 +103,12 @@ public class PurchaseOrder implements Serializable {
|
||||||
@ApiModelProperty(value = "订单发票号")
|
@ApiModelProperty(value = "订单发票号")
|
||||||
private String invoiceNumber;
|
private String invoiceNumber;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单是否下了单
|
||||||
|
*/
|
||||||
|
@Excel(name = "订单是否下了单", width = 15)
|
||||||
|
@ApiModelProperty(value = "订单是否下了单")
|
||||||
|
private boolean ordered;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Payment document
|
* Payment document
|
||||||
|
|
|
@ -7,6 +7,9 @@ import org.apache.ibatis.annotations.Param;
|
||||||
import org.jeecg.modules.business.entity.PlatformOrder;
|
import org.jeecg.modules.business.entity.PlatformOrder;
|
||||||
import org.jeecg.modules.business.entity.PurchaseOrder;
|
import org.jeecg.modules.business.entity.PurchaseOrder;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.jeecg.modules.business.vo.InvoiceMetaData;
|
||||||
|
import org.jeecg.modules.business.vo.PurchaseOrderPage;
|
||||||
|
import org.jeecg.modules.business.vo.SkuQuantity;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,4 +108,14 @@ public interface PurchaseOrderMapper extends BaseMapper<PurchaseOrder> {
|
||||||
List<PurchaseOrder> getPurchasesByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
List<PurchaseOrder> getPurchasesByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
List<PlatformOrder> getPlatformOrder(@Param("invoiceNumber") String invoiceNumber);
|
List<PlatformOrder> getPlatformOrder(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
|
List<SkuQuantity> getSkuQuantityByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
|
InvoiceMetaData getMetaDataFromInvoiceNumbers(@Param("invoiceNumber") String invoiceNumber);
|
||||||
|
|
||||||
|
List<PurchaseOrderPage> getPage(@Param("offset") long offset, @Param("size") long size);
|
||||||
|
|
||||||
|
long countPurchaseOrders();
|
||||||
|
|
||||||
|
void updatePurchaseOrderStatus(@Param("invoiceNumber") String invoiceNumber, @Param("isOrdered") boolean isOrdered);
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,4 +103,40 @@
|
||||||
FROM platform_order
|
FROM platform_order
|
||||||
WHERE shipping_invoice_number = #{invoiceNumber}
|
WHERE shipping_invoice_number = #{invoiceNumber}
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getSkuQuantityByInvoiceNumber" resultType="org.jeecg.modules.business.vo.SkuQuantity">
|
||||||
|
SELECT pos.sku_id AS ID, sku.erp_code AS erp_code, SUM(pos.quantity) AS quantity
|
||||||
|
FROM purchase_order po
|
||||||
|
JOIN purchase_order_sku pos
|
||||||
|
ON po.id = pos.purchase_order_id
|
||||||
|
JOIN sku
|
||||||
|
ON pos.sku_id = sku.id
|
||||||
|
WHERE po.invoice_number = #{invoiceNumber}
|
||||||
|
GROUP BY pos.sku_id;
|
||||||
|
|
||||||
|
</select>
|
||||||
|
<select id="getMetaDataFromInvoiceNumbers" resultType="org.jeecg.modules.business.vo.InvoiceMetaData">
|
||||||
|
SELECT CONCAT('Invoice N°', po.invoice_number, ' (', c.invoice_entity ,')') as filename, po.invoice_number AS invoiceCode, c.invoice_entity AS invoiceEntity, c.internal_code AS internalCode, null as errorMsg
|
||||||
|
FROM purchase_order po
|
||||||
|
JOIN client c
|
||||||
|
ON po.client_id = c.id
|
||||||
|
WHERE po.invoice_number = #{invoiceNumber}
|
||||||
|
</select>
|
||||||
|
<select id="getPage" resultType="org.jeecg.modules.business.vo.PurchaseOrderPage">
|
||||||
|
SELECT po.*, GROUP_CONCAT(p.platform_order_id) as platformOrderId
|
||||||
|
FROM purchase_order po
|
||||||
|
LEFT JOIN platform_order p
|
||||||
|
ON p.purchase_invoice_number = po.invoice_number
|
||||||
|
GROUP BY po.id, po.create_time
|
||||||
|
ORDER BY po.create_time DESC
|
||||||
|
LIMIT #{size} OFFSET #{offset}
|
||||||
|
</select>
|
||||||
|
<select id="countPurchaseOrders" resultType="java.lang.Long">
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM purchase_order
|
||||||
|
</select>
|
||||||
|
<update id="updatePurchaseOrderStatus">
|
||||||
|
UPDATE purchase_order
|
||||||
|
SET ordered = #{isOrdered}
|
||||||
|
WHERE invoice_number = #{invoiceNumber}
|
||||||
|
</update>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
|
@ -140,13 +140,14 @@
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="getSkuQuantitiesFromOrderIds" resultType="org.jeecg.modules.business.vo.SkuQuantity">
|
<select id="getSkuQuantitiesFromOrderIds" resultType="org.jeecg.modules.business.vo.SkuQuantity">
|
||||||
SELECT sku_id as ID, SUM(quantity) AS quantity
|
SELECT sku_id as ID, sku.erp_code as erp_code, SUM(quantity) AS quantity
|
||||||
FROM platform_order_content
|
FROM platform_order_content
|
||||||
|
JOIN sku ON platform_order_content.sku_id = sku.id
|
||||||
WHERE platform_order_id IN
|
WHERE platform_order_id IN
|
||||||
<foreach collection="orderIds" separator="," open="(" close=")" index="index" item="orderId">
|
<foreach collection="orderIds" separator="," open="(" close=")" index="index" item="orderId">
|
||||||
#{orderId}
|
#{orderId}
|
||||||
</foreach>
|
</foreach>
|
||||||
AND erp_status IN ('1','2', '3')
|
AND erp_status IN ('1','2','3')
|
||||||
AND product_available = 0
|
AND product_available = 0
|
||||||
AND virtual_product_available = 0
|
AND virtual_product_available = 0
|
||||||
GROUP BY sku_id;
|
GROUP BY sku_id;
|
||||||
|
|
|
@ -15,5 +15,5 @@ public interface IProviderMabangService extends IService<ProviderData> {
|
||||||
*/
|
*/
|
||||||
void saveProviderFromMabang(List<ProviderData> providerDataList);
|
void saveProviderFromMabang(List<ProviderData> providerDataList);
|
||||||
|
|
||||||
void addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData);
|
boolean addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
package org.jeecg.modules.business.service;
|
package org.jeecg.modules.business.service;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
import org.jeecg.modules.business.controller.UserException;
|
import org.jeecg.modules.business.controller.UserException;
|
||||||
import org.jeecg.modules.business.entity.*;
|
import org.jeecg.modules.business.entity.*;
|
||||||
import org.jeecg.modules.business.vo.InvoiceMetaData;
|
import org.jeecg.modules.business.vo.InvoiceMetaData;
|
||||||
|
import org.jeecg.modules.business.vo.PurchaseOrderPage;
|
||||||
import org.jeecg.modules.business.vo.SkuQuantity;
|
import org.jeecg.modules.business.vo.SkuQuantity;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
@ -127,4 +129,12 @@ public interface IPurchaseOrderService extends IService<PurchaseOrder> {
|
||||||
List<PurchaseOrder> getPurchasesByInvoiceNumber(String invoiceNumber);
|
List<PurchaseOrder> getPurchasesByInvoiceNumber(String invoiceNumber);
|
||||||
|
|
||||||
List<PlatformOrder> getPlatformOrder(String invoiceNumber);
|
List<PlatformOrder> getPlatformOrder(String invoiceNumber);
|
||||||
|
|
||||||
|
List<SkuQuantity> getSkuQuantityByInvoiceNumber(String invoiceNumber);
|
||||||
|
|
||||||
|
InvoiceMetaData getMetaDataFromInvoiceNumbers(String invoiceNumber);
|
||||||
|
|
||||||
|
void setPageForList(Page<PurchaseOrderPage> page);
|
||||||
|
|
||||||
|
void updatePurchaseOrderStatus(String invoiceNumber, boolean isOrdered);
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,21 +10,27 @@ import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchase
|
||||||
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderResponse;
|
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderResponse;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.SkuStockData;
|
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.SkuStockData;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.purDoGetProvider.ProviderData;
|
import org.jeecg.modules.business.domain.api.mabang.purDoGetProvider.ProviderData;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.purDoGetProvider.ProviderRequestErrorException;
|
import org.jeecg.modules.business.domain.job.ThrottlingExecutorService;
|
||||||
import org.jeecg.modules.business.entity.Provider;
|
import org.jeecg.modules.business.entity.Provider;
|
||||||
import org.jeecg.modules.business.mapper.ProviderMabangMapper;
|
import org.jeecg.modules.business.mapper.ProviderMabangMapper;
|
||||||
import org.jeecg.modules.business.service.IProviderMabangService;
|
import org.jeecg.modules.business.service.IProviderMabangService;
|
||||||
import org.jeecg.modules.business.service.IProviderService;
|
import org.jeecg.modules.business.service.IProviderService;
|
||||||
|
import org.jeecg.modules.business.service.IPurchaseOrderService;
|
||||||
import org.jeecg.modules.business.service.ISkuService;
|
import org.jeecg.modules.business.service.ISkuService;
|
||||||
import org.jeecg.modules.business.vo.InvoiceMetaData;
|
import org.jeecg.modules.business.vo.InvoiceMetaData;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,8 +45,13 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
|
||||||
@Autowired
|
@Autowired
|
||||||
private IProviderService providerService;
|
private IProviderService providerService;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private IPurchaseOrderService purchaseOrderService;
|
||||||
|
@Autowired
|
||||||
ISkuService skuService;
|
ISkuService skuService;
|
||||||
|
|
||||||
|
private static final Integer DEFAULT_NUMBER_OF_THREADS = 1;
|
||||||
|
private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveProviderFromMabang(List<ProviderData> providerDataList) {
|
public void saveProviderFromMabang(List<ProviderData> providerDataList) {
|
||||||
if(providerDataList.isEmpty()) {
|
if(providerDataList.isEmpty()) {
|
||||||
|
@ -56,15 +67,20 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add purchase order to Mabang.
|
||||||
|
* @param skuQuantities Quantities mapped to sku erpCodes
|
||||||
|
* @param metaData invoice meta data
|
||||||
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public void addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData) {
|
public boolean addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData) {
|
||||||
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
||||||
String mabangUsername = sysUser.getMabangUsername();
|
String mabangUsername = sysUser.getMabangUsername();
|
||||||
String content = metaData.getFilename().substring(0, metaData.getFilename().lastIndexOf("."));
|
String content = metaData.getFilename();
|
||||||
List<String> stockSkuList = new ArrayList<>();
|
List<String> stockSkuList = new ArrayList<>();
|
||||||
String stockSkus;
|
String stockSkus;
|
||||||
log.info("Creating purchase order to Mabang : {} skus", skuQuantities.size());
|
log.info("Creating purchase order to Mabang {} : {} skus", metaData.getInvoiceCode(),skuQuantities.size());
|
||||||
Map<String, SkuData> skuDataMap = new HashMap<>();
|
Map<String, SkuData> skuDataMap = new HashMap<>();
|
||||||
List<SkuData> skuDataList = new ArrayList<>();
|
List<SkuData> skuDataList = new ArrayList<>();
|
||||||
log.info("Requesting SKU data from Mabang API.");
|
log.info("Requesting SKU data from Mabang API.");
|
||||||
|
@ -96,7 +112,8 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
|
||||||
skuDataList.addAll(skuListStream.all());
|
skuDataList.addAll(skuListStream.all());
|
||||||
}
|
}
|
||||||
if(skuDataList.isEmpty()) {
|
if(skuDataList.isEmpty()) {
|
||||||
throw new SkuListRequestErrorException("Couldn't get SKU data from Mabang API.");
|
log.error("Couldn't get SKU data from Mabang API for invoice : {}", metaData.getInvoiceCode());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(SkuData skuData : skuDataList) {
|
for(SkuData skuData : skuDataList) {
|
||||||
|
@ -106,7 +123,7 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
|
||||||
for(Map.Entry<String, SkuData> entry : skuDataMap.entrySet()) {
|
for(Map.Entry<String, SkuData> entry : skuDataMap.entrySet()) {
|
||||||
SkuStockData stockData = new SkuStockData();
|
SkuStockData stockData = new SkuStockData();
|
||||||
stockData.setStockSku(entry.getKey());
|
stockData.setStockSku(entry.getKey());
|
||||||
stockData.setPrice(entry.getValue().getPurchasePrice());
|
stockData.setPrice(entry.getValue().getPurchasePrice().compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ONE : entry.getValue().getPurchasePrice().setScale(2, RoundingMode.CEILING));
|
||||||
stockData.setPurchaseNum(skuQuantities.get(entry.getKey()));
|
stockData.setPurchaseNum(skuQuantities.get(entry.getKey()));
|
||||||
stockData.setProvider(entry.getValue().getProvider());
|
stockData.setProvider(entry.getValue().getProvider());
|
||||||
skuStockData.add(stockData);
|
skuStockData.add(stockData);
|
||||||
|
@ -122,21 +139,36 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
|
||||||
stockProviderMap.put(stockData.getProvider(), stockDataList);
|
stockProviderMap.put(stockData.getProvider(), stockDataList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.info("Create {} purchase orders to Mabang.", stockProviderMap.size());
|
log.info("Creating {} purchase orders to Mabang - {}", stockProviderMap.size(), metaData.getInvoiceCode());
|
||||||
|
|
||||||
// group id is the response from mabang API
|
// group id is the response from mabang API
|
||||||
|
ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
|
||||||
|
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
|
||||||
|
|
||||||
List<String> groupIds = new ArrayList<>();
|
List<String> groupIds = new ArrayList<>();
|
||||||
for(Map.Entry<String, List<SkuStockData>> entry : stockProviderMap.entrySet()) {
|
List<CompletableFuture<Boolean>> changeOrderFutures = stockProviderMap.entrySet().stream()
|
||||||
|
.map(entry -> CompletableFuture.supplyAsync(() -> {
|
||||||
String providerName = entry.getKey();
|
String providerName = entry.getKey();
|
||||||
List<SkuStockData> stockDataList = entry.getValue();
|
List<SkuStockData> stockDataList = entry.getValue();
|
||||||
|
log.info("Creating purchase order to Mabang {} :\n -provider : {}\n-content : {}\n-stockDataList : {}",metaData.getInvoiceCode(), providerName, content , stockDataList);
|
||||||
AddPurchaseOrderRequestBody body = new AddPurchaseOrderRequestBody(mabangUsername, providerName, content, stockDataList);
|
AddPurchaseOrderRequestBody body = new AddPurchaseOrderRequestBody(mabangUsername, providerName, content, stockDataList);
|
||||||
AddPurchaseOrderRequest request = new AddPurchaseOrderRequest(body);
|
AddPurchaseOrderRequest request = new AddPurchaseOrderRequest(body);
|
||||||
AddPurchaseOrderResponse response = request.send();
|
AddPurchaseOrderResponse response = request.send();
|
||||||
log.info("Response from Mabang Add purchase API : " + response.toString());
|
log.info("Mabang Add purchase API response | {} - {} : {}", metaData.getInvoiceCode(), providerName,response.toString());
|
||||||
if(!response.success())
|
if(!response.success()) {
|
||||||
throw new ProviderRequestErrorException("Couldn't add purchase order to Mabang.");
|
log.error("Failed to create purchase order to Mabang for {} - {}", metaData.getInvoiceCode(), providerName);
|
||||||
groupIds.add(response.getGroupId());
|
return false;
|
||||||
}
|
}
|
||||||
log.info("Purchase orders created to Mabang, groupIds : {}", groupIds);
|
groupIds.add(response.getGroupId());
|
||||||
|
return true;
|
||||||
|
}, throttlingExecutorService))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
List<Boolean> results = changeOrderFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
|
||||||
|
long nbSuccesses = results.stream().filter(b -> b).count();
|
||||||
|
log.info("{}/{} purchase orders created successfully on Mabang. {} : GroupIds : {}", nbSuccesses, stockProviderMap.size(), metaData.getInvoiceCode(),groupIds);
|
||||||
|
|
||||||
|
// change status of purchase order to 'ordered' = true
|
||||||
|
purchaseOrderService.updatePurchaseOrderStatus(metaData.getInvoiceCode(), true);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.jeecg.modules.business.service.impl.purchase;
|
package org.jeecg.modules.business.service.impl.purchase;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
@ -718,4 +719,27 @@ public class PurchaseOrderServiceImpl extends ServiceImpl<PurchaseOrderMapper, P
|
||||||
public List<PlatformOrder> getPlatformOrder(String invoiceNumber) {
|
public List<PlatformOrder> getPlatformOrder(String invoiceNumber) {
|
||||||
return purchaseOrderMapper.getPlatformOrder(invoiceNumber);
|
return purchaseOrderMapper.getPlatformOrder(invoiceNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SkuQuantity> getSkuQuantityByInvoiceNumber(String invoiceNumber) {
|
||||||
|
return purchaseOrderMapper.getSkuQuantityByInvoiceNumber(invoiceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InvoiceMetaData getMetaDataFromInvoiceNumbers(String invoiceNumber) {
|
||||||
|
return purchaseOrderMapper.getMetaDataFromInvoiceNumbers(invoiceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPageForList(Page<PurchaseOrderPage> page) {
|
||||||
|
System.out.println("Offset: " + page.offset() + ", Size: " + page.getSize());
|
||||||
|
List<PurchaseOrderPage> purchaseOrderPages = purchaseOrderMapper.getPage(page.offset(), page.getSize());
|
||||||
|
page.setRecords(purchaseOrderPages);
|
||||||
|
page.setTotal(purchaseOrderMapper.countPurchaseOrders());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePurchaseOrderStatus(String invoiceNumber, boolean isOrdered) {
|
||||||
|
purchaseOrderMapper.updatePurchaseOrderStatus(invoiceNumber, isOrdered);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,10 +68,14 @@ public class PurchaseOrderPage {
|
||||||
/**最终金额*/
|
/**最终金额*/
|
||||||
@ApiModelProperty(value = "最终金额")
|
@ApiModelProperty(value = "最终金额")
|
||||||
private java.math.BigDecimal finalAmount;
|
private java.math.BigDecimal finalAmount;
|
||||||
/**Purchase status*/
|
/**paid amount*/
|
||||||
@Excel(name = "status", width = 15)
|
@Excel(name = "已付金额", width = 15)
|
||||||
@ApiModelProperty(value = "status")
|
@ApiModelProperty(value = "已付金额")
|
||||||
private String status;
|
private java.math.BigDecimal paidAmount;
|
||||||
|
/**订单是否下了单*/
|
||||||
|
@Excel(name = "订单是否下了单", width = 15)
|
||||||
|
@ApiModelProperty(value = "订单是否下了单")
|
||||||
|
private boolean ordered;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Payment document
|
* Payment document
|
||||||
|
|
|
@ -1,12 +1,27 @@
|
||||||
package org.jeecg.modules.business.vo;
|
package org.jeecg.modules.business.vo;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class SkuQuantity {
|
public class SkuQuantity {
|
||||||
|
@JSONField(name = "id")
|
||||||
private final String ID;
|
private final String ID;
|
||||||
|
@JSONField(name = "erpCode")
|
||||||
|
private final String erpCode;
|
||||||
|
@JSONField(name = "quantity")
|
||||||
private final Integer quantity;
|
private final Integer quantity;
|
||||||
|
|
||||||
|
public SkuQuantity(String ID, String erpCode, Integer quantity){
|
||||||
|
this.ID = ID;
|
||||||
|
this.erpCode = erpCode;
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
public SkuQuantity(String ID, Integer quantity){
|
||||||
|
this.ID = ID;
|
||||||
|
this.quantity = quantity;
|
||||||
|
this.erpCode = null;
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return String.format("|Sku ID %s -- %d|", ID, quantity);
|
return String.format("|Sku ID %s -- %d|", ID, quantity);
|
||||||
|
|
Loading…
Reference in New Issue