diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java index b45abcda5..473f48a17 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java @@ -12,14 +12,9 @@ import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; -import org.jeecg.modules.business.entity.ShippingDiscount; -import org.jeecg.modules.business.entity.Sku; -import org.jeecg.modules.business.entity.SkuDeclaredValue; -import org.jeecg.modules.business.entity.SkuPrice; +import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.service.*; -import org.jeecg.modules.business.vo.SkuName; -import org.jeecg.modules.business.vo.SkuPage; -import org.jeecg.modules.business.vo.SkuUpdate; +import org.jeecg.modules.business.vo.*; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -46,7 +41,7 @@ import java.util.stream.Collectors; */ @Api(tags = "SKU表") @RestController -@RequestMapping("/business/sku") +@RequestMapping("/sku") @Slf4j public class SkuController { @Autowired @@ -57,6 +52,8 @@ public class SkuController { private IShippingDiscountService shippingDiscountService; @Autowired private ISkuDeclaredValueService skuDeclaredValueService; + @Autowired + private IClientService clientService; /** * 分页列表查询 @@ -349,10 +346,10 @@ public class SkuController { @GetMapping("/skusByClient") public Result skusByClient(@RequestParam String clientId) { - List skus = skuService.fetchSkusByClient(clientId); - IPage page = new Page<>(); - page.setRecords(skus); - page.setTotal(skus.size()); + List skuOrdersPage = skuService.fetchSkusByClient(clientId); + IPage page = new Page<>(); + page.setRecords(skuOrdersPage); + page.setTotal(skuOrdersPage.size()); return Result.OK(page); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index 3088a161b..f30eb0416 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -418,7 +418,27 @@ public class InvoiceController { throw new RuntimeException(e); } } - + @PostMapping("/makeManualSkuPurchaseInvoice") + public Result createOrder(@RequestBody Map payload) { + InvoiceMetaData metaData; + List skuQuantities = new ArrayList<>(); + for(Map.Entry entry : payload.entrySet()) { + String skuId = skuService.getIdFromErpCode(entry.getKey()); + skuQuantities.add(new SkuQuantity(skuId, entry.getValue())); + } + try { + String purchaseId = purchaseOrderService.addPurchase(skuQuantities); + metaData = purchaseOrderService.makeInvoice(purchaseId); + return Result.OK(metaData); + } catch (UserException e) { + return Result.error(e.getMessage()); + } catch (IOException e) { + log.error(e.getMessage()); + return Result.error("Sorry, server error, please try later"); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } @GetMapping(value = "/preShipping/orderTime") public Result getValidOrderTimePeriod(@RequestParam("shopIds[]") List shopIDs, @RequestParam("erpStatuses[]") List erpStatuses) { log.info("Request for valid order time period for shops: " + shopIDs.toString() + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java index 954e6802e..ae9702ebe 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java @@ -27,4 +27,6 @@ public interface ClientMapper extends BaseMapper { Client getClientFromPurchase(@Param("purchaseId") String purchaseId); List getClientsFromPurchases(@Param("purchaseIds") List purchaseIds); + + Client getClientBySku(@Param("skuId") String skuId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java index 732e5689f..4bf21b144 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java @@ -3,6 +3,7 @@ package org.jeecg.modules.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; 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.inventory.InventoryRecord; @@ -53,5 +54,7 @@ public interface SkuMapper extends BaseMapper { List getSkuQuantitiesFromOrderIds(@Param("orderIds") List orderIds); - List fetchSkusByClient(@Param("clientId") String clientId); + List fetchSkusByClient(@Param("clientId") String clientId); + + String getIdFromErpCode(@Param("erpCode") String erpCode); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml index 31045d414..8f26e725b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml @@ -58,4 +58,10 @@ #{purchaseId} ; + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml index 27afbc6b5..67d701f76 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml @@ -151,11 +151,66 @@ AND virtual_product_available = 0 GROUP BY sku_id; - + WITH 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 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.zh_name as product, + s.purchasing_amount, + s.available_amount, + qtyInOrdersNotShipped.quantity 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, + 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 cs ON s.id = cs.sku_id - JOIN product p ON s.product_id = p.id + JOIN client_sku cs ON s.id = cs.sku_id + JOIN product p ON s.product_id = p.id + 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 WHERE cs.client_id = #{clientId}; + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java index 2b3151202..dc13aff0d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java @@ -54,4 +54,6 @@ public interface IClientService extends IService { Client getClientFromPurchase(String purchaseId); List getClientsFromPurchases(List purchaseIds); + + Client getClientBySku(String skuId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java index 556363e56..91cd3e266 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java @@ -11,6 +11,7 @@ import java.io.Serializable; import java.time.LocalDateTime; import java.util.Collection; import java.util.List; +import java.util.Map; /** * @Description: SKU表 @@ -94,5 +95,9 @@ public interface ISkuService extends IService { List getSkuQuantitiesFromOrderIds(List orderIds); - List fetchSkusByClient(String clientId); + List fetchSkusByClient(String clientId); + + void addSkuQuantity(Map quantityPurchased); + + String getIdFromErpCode(String erpCode); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java index bf763d972..072f0893d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java @@ -138,6 +138,11 @@ public class ClientServiceImpl extends ServiceImpl impleme return clientMapper.getClientsFromPurchases(purchaseIds); } + @Override + public Client getClientBySku(String skuId) { + return clientMapper.getClientBySku(skuId); + } + @Override public String getClientEntity(String id) { return clientMapper.getClientEntity(id); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java index 0e1b10f3c..9c920594b 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java @@ -412,7 +412,17 @@ public class SkuServiceImpl extends ServiceImpl implements ISkuS } @Override - public List fetchSkusByClient(String clientId) { + public List fetchSkusByClient(String clientId) { return skuMapper.fetchSkusByClient(clientId); } + + @Override + public void addSkuQuantity(Map quantityPurchased) { + skuMapper.addSkuQuantity(quantityPurchased); + } + + @Override + public String getIdFromErpCode(String erpCode) { + return skuMapper.getIdFromErpCode(erpCode); + } } \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java index 3f183ab64..49dc5c5da 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java @@ -328,19 +328,6 @@ public class PurchaseOrderServiceImpl extends ServiceImpl skuQuantities) throws UserException { - return addPurchase(skuQuantities, Collections.emptyList()); - } - - /** * Generated a purchase order based on sku quantity, these sku are bought * for some platform orders, their quantity may higher than those in platform @@ -434,6 +421,93 @@ public class PurchaseOrderServiceImpl extends ServiceImpl skuQuantities) throws UserException { + + Client client = clientService.getCurrentClient(); + if(client == null) { + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + if(sysUser.getOrgCode().contains("A01") || sysUser.getOrgCode().contains("A03")) { + client = clientService.getClientBySku(skuQuantities.get(0).getID()); + } + else + throw new UserException("User is not a client"); + } + String currencyId = currencyService.getIdByCode(client.getCurrency()); + List details = platformOrderService.searchPurchaseOrderDetail(skuQuantities); + OrdersStatisticData data = OrdersStatisticData.makeData(details, null); + + String purchaseID = UUID.randomUUID().toString(); + + String lastInvoiceNumber = purchaseOrderMapper.lastInvoiceNumber(); + String invoiceNumber = new PurchaseInvoiceCodeRule().next(lastInvoiceNumber); + // 1. save purchase itself + purchaseOrderMapper.addPurchase( + purchaseID, + client.fullName(), + currencyId, + client.getId(), + data.getEstimatedTotalPrice(), + data.getReducedAmount(), + data.finalAmount(), + invoiceNumber + ); + + // 2. save purchase's content + List entries = details.stream() + .map( + d -> ( + new OrderContentEntry( + d.getQuantity(), + d.totalPrice(), + d.getSkuDetail().getSkuId() + ) + ) + ) + .collect(Collectors.toList()); + purchaseOrderContentMapper.addAll(client.fullName(), purchaseID, entries); + Map quantityPurchased = skuQuantities.stream() + .collect( + Collectors.toMap( + SkuQuantity::getID, + SkuQuantity::getQuantity + ) + ); + skuService.addSkuQuantity(quantityPurchased); + + // 3. save the application of promotion information + List promotionHistoryEntries = details.stream() + .filter(orderContentDetail -> orderContentDetail.getSkuDetail().getPromotion() != Promotion.ZERO_PROMOTION) + .map(orderContentDetail -> { + String promotion = orderContentDetail.getSkuDetail().getPromotion().getId(); + int count = orderContentDetail.promotionCount(); + return new PromotionHistoryEntry(promotion, count); + }).collect(Collectors.toList()); + if (!promotionHistoryEntries.isEmpty()) { + skuPromotionHistoryMapper.addAll(client.fullName(), promotionHistoryEntries, purchaseID); + } + + // TODO use real client address + // send email to client + Map map = new HashMap<>(); + map.put("client", client.getFirstName()); + map.put("order_number", invoiceNumber); + pushMsgUtil.sendMessage( + SendMsgTypeEnum.EMAIL.getType(), + "purchase_order_confirmation", + map, + "service@wia-sourcing.com" + ); + + // 4. return purchase id + return purchaseID; + } /** diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/SkuOrderPage.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/SkuOrderPage.java new file mode 100644 index 000000000..f52ce5271 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/SkuOrderPage.java @@ -0,0 +1,117 @@ +package org.jeecg.modules.business.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.modules.business.entity.SkuPrice; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; + +/** + * @Description: SKU表 + * @Author: jeecg-boot + * @Date: 2021-08-13 + * @Version: V1.2 + */ +@Data +@ApiModel(value = "skuOrderPage对象", description = "SKU表") +public class SkuOrderPage { + + /** + * 主键 + */ + @ApiModelProperty(value = "主键") + private String id; + /** + * 商品ID + */ + @Excel(name = "商品ID", width = 15, dictTable = "product", dicText = "code", dicCode = "id") + @Dict(dictTable = "product", dicText = "code", dicCode = "id") + @ApiModelProperty(value = "商品ID") + private String product; + /** + * ERP中商品代码 + */ + @Excel(name = "ERP中商品代码", width = 15) + @ApiModelProperty(value = "ERP中商品代码") + private String erpCode; + /** + * 库存数量 + */ + @Excel(name = "库存数量", width = 15) + @ApiModelProperty(value = "库存数量") + private Integer availableAmount; + /** + * 在途数量 + */ + @Excel(name = "在途数量", width = 15) + @ApiModelProperty(value = "在途数量") + private Integer purchasingAmount; + /** + * 未发货数量 + */ + @Excel(name = "未发货数量", width = 15) + @ApiModelProperty(value = "未发货数量") + private Integer qtyInOrdersNotShipped; + /** + * stock + */ + @Excel(name = "stock", width = 15) + @ApiModelProperty(value = "stock") + private Integer stock; + /** + * 图片链接 + */ + @Excel(name = "图片链接", width = 15) + @ApiModelProperty(value = "图片链接") + private String imageSource; + /** + * 运费折扣 + */ + @Excel(name = "运费折扣", width = 15) + @ApiModelProperty(value = "运费折扣") + private java.math.BigDecimal shippingDiscount; + /** + * 服务费 + */ + @Excel(name = "服务费", width = 15) + @ApiModelProperty(value = "服务费") + private java.math.BigDecimal serviceFee; + /** + * SKU价格 + */ + @ExcelCollection(name = "SKU价格") + @ApiModelProperty(value = "SKU价格") + private java.math.BigDecimal skuPrice; + /** + * 优惠价起订量 + */ + @Excel(name = "优惠价起订量", width = 15) + @ApiModelProperty(value = "优惠价起订量") + private java.lang.Integer discountMoq; + /** + * 优惠价 + */ + @Excel(name = "优惠价", width = 15) + @ApiModelProperty(value = "优惠价") + private java.math.BigDecimal discountedPrice; + /** + * Sales last week + */ + @Excel(name = "sales last week", width = 15) + @ApiModelProperty(value = "sales last week") + private java.lang.Integer salesLastWeek; + /** + * Sales last four week + */ + @Excel(name = "sales last 28 days", width = 15) + @ApiModelProperty(value = "sales last 28 days") + private java.lang.Integer salesFourWeeks; + /** + * Sales last six weeks + */ + @Excel(name = "sales last 42 days", width = 15) + @ApiModelProperty(value = "sales last 42 days") + private java.lang.Integer salesSixWeeks; +}