Commit 46cd642f by 杨浩

客户订单签收

parent 8dc06376
...@@ -20,6 +20,9 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService; ...@@ -20,6 +20,9 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseInService; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseInService;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService; import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService;
import cn.iocoder.foodnexus.module.product.api.ProductSpuApi;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
...@@ -53,7 +56,7 @@ public class ErpPurchaseInController { ...@@ -53,7 +56,7 @@ public class ErpPurchaseInController {
@Resource @Resource
private ErpStockService stockService; private ErpStockService stockService;
@Resource @Resource
private ErpProductService productService; private ProductSpuService productService;
@Resource @Resource
private ErpSupplierService supplierService; private ErpSupplierService supplierService;
...@@ -103,14 +106,14 @@ public class ErpPurchaseInController { ...@@ -103,14 +106,14 @@ public class ErpPurchaseInController {
return success(null); return success(null);
} }
List<ErpPurchaseInItemDO> purchaseInItemList = purchaseInService.getPurchaseInItemListByInId(id); List<ErpPurchaseInItemDO> purchaseInItemList = purchaseInService.getPurchaseInItemListByInId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getSpuMap(
convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId)); convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId));
return success(BeanUtils.toBean(purchaseIn, ErpPurchaseInRespVO.class, purchaseInVO -> return success(BeanUtils.toBean(purchaseIn, ErpPurchaseInRespVO.class, purchaseInVO ->
purchaseInVO.setItems(BeanUtils.toBean(purchaseInItemList, ErpPurchaseInRespVO.Item.class, item -> { purchaseInVO.setItems(BeanUtils.toBean(purchaseInItemList, ErpPurchaseInRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId()); ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())); .setProductUnitName(product.getUnitName()));
})))); }))));
} }
...@@ -143,7 +146,7 @@ public class ErpPurchaseInController { ...@@ -143,7 +146,7 @@ public class ErpPurchaseInController {
convertSet(pageResult.getList(), ErpPurchaseInDO::getId)); convertSet(pageResult.getList(), ErpPurchaseInDO::getId));
Map<Long, List<ErpPurchaseInItemDO>> purchaseInItemMap = convertMultiMap(purchaseInItemList, ErpPurchaseInItemDO::getInId); Map<Long, List<ErpPurchaseInItemDO>> purchaseInItemMap = convertMultiMap(purchaseInItemList, ErpPurchaseInItemDO::getInId);
// 1.2 产品信息 // 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getSpuMap(
convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId)); convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId));
// 1.3 供应商信息 // 1.3 供应商信息
Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
...@@ -155,7 +158,7 @@ public class ErpPurchaseInController { ...@@ -155,7 +158,7 @@ public class ErpPurchaseInController {
return BeanUtils.toBean(pageResult, ErpPurchaseInRespVO.class, purchaseIn -> { return BeanUtils.toBean(pageResult, ErpPurchaseInRespVO.class, purchaseIn -> {
purchaseIn.setItems(BeanUtils.toBean(purchaseInItemMap.get(purchaseIn.getId()), ErpPurchaseInRespVO.Item.class, purchaseIn.setItems(BeanUtils.toBean(purchaseInItemMap.get(purchaseIn.getId()), ErpPurchaseInRespVO.Item.class,
item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); .setProductUnitName(product.getUnitName()))));
purchaseIn.setProductNames(CollUtil.join(purchaseIn.getItems(), ",", ErpPurchaseInRespVO.Item::getProductName)); purchaseIn.setProductNames(CollUtil.join(purchaseIn.getItems(), ",", ErpPurchaseInRespVO.Item::getProductName));
MapUtils.findAndThen(supplierMap, purchaseIn.getSupplierId(), supplier -> purchaseIn.setSupplierName(supplier.getName())); MapUtils.findAndThen(supplierMap, purchaseIn.getSupplierId(), supplier -> purchaseIn.setSupplierName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(purchaseIn.getCreator()), user -> purchaseIn.setCreatorName(user.getNickname())); MapUtils.findAndThen(userMap, Long.parseLong(purchaseIn.getCreator()), user -> purchaseIn.setCreatorName(user.getNickname()));
......
...@@ -19,6 +19,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService; ...@@ -19,6 +19,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderService; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderService;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpSupplierService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService; import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
...@@ -27,6 +29,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; ...@@ -27,6 +29,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -53,6 +56,8 @@ public class ErpPurchaseOrderController { ...@@ -53,6 +56,8 @@ public class ErpPurchaseOrderController {
private ErpStockService stockService; private ErpStockService stockService;
@Resource @Resource
private ErpSupplierService supplierService; private ErpSupplierService supplierService;
@Autowired
private ProductSpuService productService;
@Resource @Resource
private AdminUserApi adminUserApi; private AdminUserApi adminUserApi;
...@@ -100,14 +105,14 @@ public class ErpPurchaseOrderController { ...@@ -100,14 +105,14 @@ public class ErpPurchaseOrderController {
return success(null); return success(null);
} }
List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderId(id); List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderId(id);
/*Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));*/ convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
return success(BeanUtils.toBean(purchaseOrder, ErpPurchaseOrderRespVO.class, purchaseOrderVO -> return success(BeanUtils.toBean(purchaseOrder, ErpPurchaseOrderRespVO.class, purchaseOrderVO ->
purchaseOrderVO.setItems(BeanUtils.toBean(purchaseOrderItemList, ErpPurchaseOrderRespVO.Item.class, item -> { purchaseOrderVO.setItems(BeanUtils.toBean(purchaseOrderItemList, ErpPurchaseOrderRespVO.Item.class, item -> {
BigDecimal purchaseCount = stockService.getStockCount(item.getProductId()); BigDecimal purchaseCount = stockService.getStockCount(item.getProductId());
item.setStockCount(purchaseCount != null ? purchaseCount : BigDecimal.ZERO); item.setStockCount(purchaseCount != null ? purchaseCount : BigDecimal.ZERO);
/*MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()));*/ .setProductUnitName(product.getUnitName()));
})))); }))));
} }
...@@ -140,8 +145,8 @@ public class ErpPurchaseOrderController { ...@@ -140,8 +145,8 @@ public class ErpPurchaseOrderController {
convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId)); convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId));
Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId); Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId);
// 1.2 产品信息 // 1.2 产品信息
/*Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));*/ convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
// 1.3 供应商信息 // 1.3 供应商信息
Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap( Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
convertSet(pageResult.getList(), ErpPurchaseOrderDO::getSupplierId)); convertSet(pageResult.getList(), ErpPurchaseOrderDO::getSupplierId));
...@@ -151,9 +156,9 @@ public class ErpPurchaseOrderController { ...@@ -151,9 +156,9 @@ public class ErpPurchaseOrderController {
// 2. 开始拼接 // 2. 开始拼接
return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> { return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class
/*, ,
item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()))*/)); .setProductUnitName(product.getUnitName()))));
purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), ",", ErpPurchaseOrderRespVO.Item::getProductName)); purchaseOrder.setProductNames(CollUtil.join(purchaseOrder.getItems(), ",", ErpPurchaseOrderRespVO.Item::getProductName));
MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName())); MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname())); MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname()));
......
...@@ -94,12 +94,6 @@ public class ErpPurchaseInRespVO { ...@@ -94,12 +94,6 @@ public class ErpPurchaseInRespVO {
@ExcelProperty("产品信息") @ExcelProperty("产品信息")
private String productNames; private String productNames;
@Schema(description = "销售订单")
private Long saleOrderId;
@Schema(description = "销售子订单")
private Long saleOrderItemId;
@Data @Data
public static class Item { public static class Item {
......
...@@ -37,12 +37,6 @@ public class ErpPurchaseInSaveReqVO { ...@@ -37,12 +37,6 @@ public class ErpPurchaseInSaveReqVO {
@Schema(description = "备注", example = "你猜") @Schema(description = "备注", example = "你猜")
private String remark; private String remark;
@Schema(description = "销售订单")
private Long saleOrderId;
@Schema(description = "销售子订单")
private Long saleOrderItemId;
@Schema(description = "入库清单列表") @Schema(description = "入库清单列表")
private List<Item> items; private List<Item> items;
......
...@@ -19,6 +19,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService; ...@@ -19,6 +19,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService; import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
...@@ -52,7 +54,7 @@ public class ErpSaleOrderController { ...@@ -52,7 +54,7 @@ public class ErpSaleOrderController {
@Resource @Resource
private ErpStockService stockService; private ErpStockService stockService;
@Resource @Resource
private ErpProductService productService; private ProductSpuService productService;
@Resource @Resource
private ErpCustomerService customerService; private ErpCustomerService customerService;
...@@ -120,14 +122,14 @@ public class ErpSaleOrderController { ...@@ -120,14 +122,14 @@ public class ErpSaleOrderController {
return success(null); return success(null);
} }
List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderId(id); List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
return success(BeanUtils.toBean(saleOrder, ErpSaleOrderRespVO.class, saleOrderVO -> return success(BeanUtils.toBean(saleOrder, ErpSaleOrderRespVO.class, saleOrderVO ->
saleOrderVO.setItems(BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> { saleOrderVO.setItems(BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> {
BigDecimal stockCount = stockService.getStockCount(item.getProductId()); BigDecimal stockCount = stockService.getStockCount(item.getProductId());
item.setStockCount(stockCount != null ? stockCount : BigDecimal.ZERO); item.setStockCount(stockCount != null ? stockCount : BigDecimal.ZERO);
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())); .setProductUnitName(product.getUnitName()));
})))); }))));
} }
...@@ -160,7 +162,7 @@ public class ErpSaleOrderController { ...@@ -160,7 +162,7 @@ public class ErpSaleOrderController {
convertSet(pageResult.getList(), ErpSaleOrderDO::getId)); convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId); Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId);
// 1.2 产品信息 // 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId)); convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
// 1.3 客户信息 // 1.3 客户信息
Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap( Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap(
...@@ -172,7 +174,7 @@ public class ErpSaleOrderController { ...@@ -172,7 +174,7 @@ public class ErpSaleOrderController {
return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> { return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class, saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); .setProductUnitName(product.getUnitName()))));
saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), ",", ErpSaleOrderRespVO.Item::getProductName)); saleOrder.setProductNames(CollUtil.join(saleOrder.getItems(), ",", ErpSaleOrderRespVO.Item::getProductName));
MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName())); MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname())); MapUtils.findAndThen(userMap, Long.parseLong(saleOrder.getCreator()), user -> saleOrder.setCreatorName(user.getNickname()));
......
...@@ -20,6 +20,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService; ...@@ -20,6 +20,8 @@ import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService; import cn.iocoder.foodnexus.module.erp.service.stock.ErpStockService;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
...@@ -53,7 +55,7 @@ public class ErpSaleOutController { ...@@ -53,7 +55,7 @@ public class ErpSaleOutController {
@Resource @Resource
private ErpStockService stockService; private ErpStockService stockService;
@Resource @Resource
private ErpProductService productService; private ProductSpuService productService;
@Resource @Resource
private ErpCustomerService customerService; private ErpCustomerService customerService;
...@@ -103,14 +105,14 @@ public class ErpSaleOutController { ...@@ -103,14 +105,14 @@ public class ErpSaleOutController {
return success(null); return success(null);
} }
List<ErpSaleOutItemDO> saleOutItemList = saleOutService.getSaleOutItemListByOutId(id); List<ErpSaleOutItemDO> saleOutItemList = saleOutService.getSaleOutItemListByOutId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId)); convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId));
return success(BeanUtils.toBean(saleOut, ErpSaleOutRespVO.class, saleOutVO -> return success(BeanUtils.toBean(saleOut, ErpSaleOutRespVO.class, saleOutVO ->
saleOutVO.setItems(BeanUtils.toBean(saleOutItemList, ErpSaleOutRespVO.Item.class, item -> { saleOutVO.setItems(BeanUtils.toBean(saleOutItemList, ErpSaleOutRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId()); ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO); item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())); .setProductUnitName(product.getUnitName()));
})))); }))));
} }
...@@ -143,7 +145,7 @@ public class ErpSaleOutController { ...@@ -143,7 +145,7 @@ public class ErpSaleOutController {
convertSet(pageResult.getList(), ErpSaleOutDO::getId)); convertSet(pageResult.getList(), ErpSaleOutDO::getId));
Map<Long, List<ErpSaleOutItemDO>> saleOutItemMap = convertMultiMap(saleOutItemList, ErpSaleOutItemDO::getOutId); Map<Long, List<ErpSaleOutItemDO>> saleOutItemMap = convertMultiMap(saleOutItemList, ErpSaleOutItemDO::getOutId);
// 1.2 产品信息 // 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap( Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId)); convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId));
// 1.3 客户信息 // 1.3 客户信息
Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap( Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap(
...@@ -155,7 +157,7 @@ public class ErpSaleOutController { ...@@ -155,7 +157,7 @@ public class ErpSaleOutController {
return BeanUtils.toBean(pageResult, ErpSaleOutRespVO.class, saleOut -> { return BeanUtils.toBean(pageResult, ErpSaleOutRespVO.class, saleOut -> {
saleOut.setItems(BeanUtils.toBean(saleOutItemMap.get(saleOut.getId()), ErpSaleOutRespVO.Item.class, saleOut.setItems(BeanUtils.toBean(saleOutItemMap.get(saleOut.getId()), ErpSaleOutRespVO.Item.class,
item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName()) item -> MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName())))); .setProductUnitName(product.getUnitName()))));
saleOut.setProductNames(CollUtil.join(saleOut.getItems(), ",", ErpSaleOutRespVO.Item::getProductName)); saleOut.setProductNames(CollUtil.join(saleOut.getItems(), ",", ErpSaleOutRespVO.Item::getProductName));
MapUtils.findAndThen(customerMap, saleOut.getCustomerId(), supplier -> saleOut.setCustomerName(supplier.getName())); MapUtils.findAndThen(customerMap, saleOut.getCustomerId(), supplier -> saleOut.setCustomerName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(saleOut.getCreator()), user -> saleOut.setCreatorName(user.getNickname())); MapUtils.findAndThen(userMap, Long.parseLong(saleOut.getCreator()), user -> saleOut.setCreatorName(user.getNickname()));
......
...@@ -51,10 +51,10 @@ public class ErpSaleOrderRespVO { ...@@ -51,10 +51,10 @@ public class ErpSaleOrderRespVO {
@Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663") @Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663")
@ExcelProperty("合计数量") @ExcelProperty("合计数量")
private BigDecimal totalCount; private Integer totalCount;
@Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906") @Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906")
@ExcelProperty("最终合计价格") @ExcelProperty("最终合计价格")
private BigDecimal totalPrice; private Integer totalPrice;
@Schema(description = "合计产品价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127") @Schema(description = "合计产品价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127")
private BigDecimal totalProductPrice; private BigDecimal totalProductPrice;
...@@ -140,11 +140,11 @@ public class ErpSaleOrderRespVO { ...@@ -140,11 +140,11 @@ public class ErpSaleOrderRespVO {
private String productUnit; private String productUnit;
@Schema(description = "产品单价", example = "100.00") @Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice; private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空") @NotNull(message = "产品数量不能为空")
private BigDecimal count; private Integer count;
@Schema(description = "税率,百分比", example = "99.88") @Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent; private BigDecimal taxPercent;
......
...@@ -84,11 +84,11 @@ public class ErpSaleOrderSaveReqVO { ...@@ -84,11 +84,11 @@ public class ErpSaleOrderSaveReqVO {
private String productUnit; private String productUnit;
@Schema(description = "产品单价", example = "100.00") @Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice; private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空") @NotNull(message = "产品数量不能为空")
private BigDecimal count; private Integer count;
@Schema(description = "税率,百分比", example = "99.88") @Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent; private BigDecimal taxPercent;
......
...@@ -2,6 +2,10 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out; ...@@ -2,6 +2,10 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelProperty;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
...@@ -51,10 +55,10 @@ public class ErpSaleOutRespVO { ...@@ -51,10 +55,10 @@ public class ErpSaleOutRespVO {
@Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663") @Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663")
@ExcelProperty("合计数量") @ExcelProperty("合计数量")
private BigDecimal totalCount; private Integer count;
@Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906") @Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906")
@ExcelProperty("最终合计价格") @ExcelProperty("最终合计价格")
private BigDecimal totalPrice; private Integer totalPrice;
@Schema(description = "已收款金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127") @Schema(description = "已收款金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127")
private BigDecimal receiptPrice; private BigDecimal receiptPrice;
...@@ -97,6 +101,25 @@ public class ErpSaleOutRespVO { ...@@ -97,6 +101,25 @@ public class ErpSaleOutRespVO {
@ExcelProperty("产品信息") @ExcelProperty("产品信息")
private String productNames; private String productNames;
@Schema(description = "客户订单id")
private Long customerOrderId;
@Schema(description = "配送模式")
private DeliveryMode deliveryMode;
@Schema(description = "配送时间")
private LocalDateTime deliveryTime;
@Schema(description = "配送人员")
private Long deliveryStaffId;
@Schema(description = "客户收货地址id")
private Long addressId;
@Schema(description = "客户收货地址info")
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerAddressInfo addressInfo;
@Data @Data
public static class Item { public static class Item {
...@@ -116,7 +139,7 @@ public class ErpSaleOutRespVO { ...@@ -116,7 +139,7 @@ public class ErpSaleOutRespVO {
private String productUnit; private String productUnit;
@Schema(description = "产品单价", example = "100.00") @Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice; private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空") @NotNull(message = "产品数量不能为空")
......
package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out; package cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.out;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
...@@ -44,6 +48,25 @@ public class ErpSaleOutSaveReqVO { ...@@ -44,6 +48,25 @@ public class ErpSaleOutSaveReqVO {
@Schema(description = "出库清单列表") @Schema(description = "出库清单列表")
private List<Item> items; private List<Item> items;
@Schema(description = "客户订单id")
private Long customerOrderId;
@Schema(description = "配送模式")
private DeliveryMode deliveryMode;
@Schema(description = "配送时间")
private LocalDateTime deliveryTime;
@Schema(description = "配送人员")
private Long deliveryStaffId;
@Schema(description = "客户收货地址id")
private Long addressId;
@Schema(description = "客户收货地址info")
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerAddressInfo addressInfo;
@Data @Data
public static class Item { public static class Item {
...@@ -67,11 +90,11 @@ public class ErpSaleOutSaveReqVO { ...@@ -67,11 +90,11 @@ public class ErpSaleOutSaveReqVO {
private String productUnit; private String productUnit;
@Schema(description = "产品单价", example = "100.00") @Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice; private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空") @NotNull(message = "产品数量不能为空")
private BigDecimal count; private Integer count;
@Schema(description = "税率,百分比", example = "99.88") @Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent; private BigDecimal taxPercent;
......
...@@ -80,7 +80,7 @@ public class ErpPurchaseInDO extends BaseDO { ...@@ -80,7 +80,7 @@ public class ErpPurchaseInDO extends BaseDO {
* *
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice * totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 已支付金额,单位:元 * 已支付金额,单位:元
* *
...@@ -91,7 +91,7 @@ public class ErpPurchaseInDO extends BaseDO { ...@@ -91,7 +91,7 @@ public class ErpPurchaseInDO extends BaseDO {
/** /**
* 合计产品价格,单位:元 * 合计产品价格,单位:元
*/ */
private BigDecimal totalProductPrice; private Integer totalProductPrice;
/** /**
* 合计税额,单位:元 * 合计税额,单位:元
*/ */
...@@ -120,14 +120,4 @@ public class ErpPurchaseInDO extends BaseDO { ...@@ -120,14 +120,4 @@ public class ErpPurchaseInDO extends BaseDO {
*/ */
private String remark; private String remark;
/**
* 销售订单
*/
private Long saleOrderId;
/**
* 销售子订单
*/
private Long saleOrderItemId;
} }
\ No newline at end of file
...@@ -75,7 +75,7 @@ public class ErpPurchaseInItemDO extends BaseDO { ...@@ -75,7 +75,7 @@ public class ErpPurchaseInItemDO extends BaseDO {
* *
* totalPrice = productPrice * count * totalPrice = productPrice * count
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 税率,百分比 * 税率,百分比
*/ */
......
...@@ -72,18 +72,18 @@ public class ErpSaleOrderDO extends BaseDO { ...@@ -72,18 +72,18 @@ public class ErpSaleOrderDO extends BaseDO {
/** /**
* 合计数量 * 合计数量
*/ */
private BigDecimal totalCount; private Integer totalCount;
/** /**
* 最终合计价格,单位:元 * 最终合计价格,单位:元
* *
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice * totalPrice = totalProductPrice + totalTaxPrice - discountPrice
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 合计产品价格,单位:元 * 合计产品价格,单位:元
*/ */
private BigDecimal totalProductPrice; private Integer totalProductPrice;
/** /**
* 合计税额,单位:元 * 合计税额,单位:元
*/ */
......
...@@ -52,17 +52,17 @@ public class ErpSaleOrderItemDO extends BaseDO { ...@@ -52,17 +52,17 @@ public class ErpSaleOrderItemDO extends BaseDO {
/** /**
* 产品单位单价,单位:元 * 产品单位单价,单位:元
*/ */
private BigDecimal productPrice; private Integer productPrice;
/** /**
* 数量 * 数量
*/ */
private BigDecimal count; private Integer count;
/** /**
* 总价,单位:元 * 总价,单位:元
* *
* totalPrice = productPrice * count * totalPrice = productPrice * count
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 税率,百分比 * 税率,百分比
*/ */
......
...@@ -3,9 +3,13 @@ package cn.iocoder.foodnexus.module.erp.dal.dataobject.sale; ...@@ -3,9 +3,13 @@ package cn.iocoder.foodnexus.module.erp.dal.dataobject.sale;
import cn.iocoder.foodnexus.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.foodnexus.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus; import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.finance.ErpAccountDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.finance.ErpAccountDO;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
import cn.iocoder.foodnexus.module.order.enums.DeliveryMode;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -16,7 +20,7 @@ import java.time.LocalDateTime; ...@@ -16,7 +20,7 @@ import java.time.LocalDateTime;
* *
* @author 芋道源码 * @author 芋道源码
*/ */
@TableName(value = "erp_sale_out") @TableName(value = "erp_sale_out", autoResultMap = true)
@KeySequence("erp_sale_out_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("erp_sale_out_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
...@@ -80,13 +84,13 @@ public class ErpSaleOutDO extends BaseDO { ...@@ -80,13 +84,13 @@ public class ErpSaleOutDO extends BaseDO {
/** /**
* 合计数量 * 合计数量
*/ */
private BigDecimal totalCount; private Integer totalCount;
/** /**
* 最终合计价格,单位:元 * 最终合计价格,单位:元
* *
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice * totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 已收款金额,单位:元 * 已收款金额,单位:元
* *
...@@ -97,7 +101,7 @@ public class ErpSaleOutDO extends BaseDO { ...@@ -97,7 +101,7 @@ public class ErpSaleOutDO extends BaseDO {
/** /**
* 合计产品价格,单位:元 * 合计产品价格,单位:元
*/ */
private BigDecimal totalProductPrice; private Integer totalProductPrice;
/** /**
* 合计税额,单位:元 * 合计税额,单位:元
*/ */
...@@ -126,4 +130,38 @@ public class ErpSaleOutDO extends BaseDO { ...@@ -126,4 +130,38 @@ public class ErpSaleOutDO extends BaseDO {
*/ */
private String remark; private String remark;
/**
* 客户订单id
*/
private Long customerOrderId;
/**
* 配送模式
*
* 枚举 {@link DeliveryMode}
*/
private DeliveryMode deliveryMode;
/**
* 配送时间
*/
private LocalDateTime deliveryTime;
/**
* 配送人员
*
* DeliveryStaffDO
*/
private Long deliveryStaffId;
/**
* 客户收货地址id
*/
private Long addressId;
/**
* 客户收货地址info
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerAddressInfo addressInfo;
} }
\ No newline at end of file
...@@ -5,18 +5,21 @@ import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO; ...@@ -5,18 +5,21 @@ import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockOutDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockOutDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpWarehouseDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* ERP 销售出库项 DO * ERP 销售出库项 DO
* *
* @author 芋道源码 * @author 芋道源码
*/ */
@TableName("erp_sale_out_items") @TableName(value = "erp_sale_out_items", autoResultMap = true)
@KeySequence("erp_sale_out_items_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("erp_sale_out_items_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
...@@ -58,25 +61,23 @@ public class ErpSaleOutItemDO extends BaseDO { ...@@ -58,25 +61,23 @@ public class ErpSaleOutItemDO extends BaseDO {
private Long productId; private Long productId;
/** /**
* 产品单位单位 * 产品单位单位
*
* 冗余 {@link ErpProductDO#getUnitId()}
*/ */
private String productUnit; private String productUnit;
/** /**
* 产品单位单价,单位: * 产品单位单价,单位:
*/ */
private BigDecimal productPrice; private Integer productPrice;
/** /**
* 数量 * 数量
*/ */
private BigDecimal count; private Integer count;
/** /**
* 总价,单位: * 总价,单位:
* *
* totalPrice = productPrice * count * totalPrice = productPrice * count
*/ */
private BigDecimal totalPrice; private Integer totalPrice;
/** /**
* 税率,百分比 * 税率,百分比
*/ */
...@@ -93,4 +94,10 @@ public class ErpSaleOutItemDO extends BaseDO { ...@@ -93,4 +94,10 @@ public class ErpSaleOutItemDO extends BaseDO {
*/ */
private String remark; private String remark;
/**
* 相关文件
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> remarkFiles;
} }
\ No newline at end of file
...@@ -22,6 +22,8 @@ public enum SaleOrderPickUpStatus implements ArrayValuable<String> { ...@@ -22,6 +22,8 @@ public enum SaleOrderPickUpStatus implements ArrayValuable<String> {
ALREADY("ALREADY", "已发货"), ALREADY("ALREADY", "已发货"),
ARRIVAL("ARRIVAL", "已到货"),
; ;
public static final String[] ARRAYS = Arrays.stream(values()).map(SaleOrderPickUpStatus::getType).toArray(String[]::new); public static final String[] ARRAYS = Arrays.stream(values()).map(SaleOrderPickUpStatus::getType).toArray(String[]::new);
......
...@@ -163,7 +163,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService { ...@@ -163,7 +163,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService {
if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) { if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) {
ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId()); ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId());
Assert.equals(purchaseIn.getSupplierId(), supplierId, "供应商必须相同"); Assert.equals(purchaseIn.getSupplierId(), supplierId, "供应商必须相同");
item.setTotalPrice(purchaseIn.getTotalPrice()).setBizNo(purchaseIn.getNo()); item.setTotalPrice(BigDecimal.valueOf(purchaseIn.getTotalPrice())).setBizNo(purchaseIn.getNo());
} else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) { } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_RETURN.getType())) {
ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId()); ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId());
Assert.equals(purchaseReturn.getSupplierId(), supplierId, "供应商必须相同"); Assert.equals(purchaseReturn.getSupplierId(), supplierId, "供应商必须相同");
......
...@@ -163,7 +163,7 @@ public class ErpFinanceReceiptServiceImpl implements ErpFinanceReceiptService { ...@@ -163,7 +163,7 @@ public class ErpFinanceReceiptServiceImpl implements ErpFinanceReceiptService {
if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_OUT.getType())) { if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_OUT.getType())) {
ErpSaleOutDO saleOut = saleOutService.validateSaleOut(item.getBizId()); ErpSaleOutDO saleOut = saleOutService.validateSaleOut(item.getBizId());
Assert.equals(saleOut.getCustomerId(), customerId, "客户必须相同"); Assert.equals(saleOut.getCustomerId(), customerId, "客户必须相同");
item.setTotalPrice(saleOut.getTotalPrice()).setBizNo(saleOut.getNo()); item.setTotalPrice(BigDecimal.valueOf(saleOut.getTotalPrice())).setBizNo(saleOut.getNo());
} else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_RETURN.getType())) { } else if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_RETURN.getType())) {
ErpSaleReturnDO saleReturn = saleReturnService.validateSaleReturn(item.getBizId()); ErpSaleReturnDO saleReturn = saleReturnService.validateSaleReturn(item.getBizId());
Assert.equals(saleReturn.getCustomerId(), customerId, "客户必须相同"); Assert.equals(saleReturn.getCustomerId(), customerId, "客户必须相同");
......
...@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.service.purchase; ...@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.service.purchase;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils; import cn.iocoder.foodnexus.framework.common.util.number.MoneyUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO;
...@@ -57,8 +58,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -57,8 +58,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private ErpNoRedisDAO noRedisDAO; private ErpNoRedisDAO noRedisDAO;
@Resource @Resource
private ErpProductService productService;
@Resource
@Lazy // 延迟加载,避免循环依赖 @Lazy // 延迟加载,避免循环依赖
private ErpPurchaseOrderService purchaseOrderService; private ErpPurchaseOrderService purchaseOrderService;
@Resource @Resource
...@@ -66,8 +65,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -66,8 +65,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
@Resource @Resource
private ErpStockRecordService stockRecordService; private ErpStockRecordService stockRecordService;
@Resource
private AdminUserApi adminUserApi;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -77,7 +74,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -77,7 +74,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
// 1.2 校验入库项的有效性 // 1.2 校验入库项的有效性
List<ErpPurchaseInItemDO> purchaseInItems = validatePurchaseInItems(createReqVO.getItems()); List<ErpPurchaseInItemDO> purchaseInItems = validatePurchaseInItems(createReqVO.getItems());
// 1.3 校验结算账户 // 1.3 校验结算账户
accountService.validateAccount(createReqVO.getAccountId()); if (CommonUtil.isNotEmpty(createReqVO.getAccountId())) {
accountService.validateAccount(createReqVO.getAccountId());
}
// 1.4 生成入库单号,并校验唯一性 // 1.4 生成入库单号,并校验唯一性
String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_IN_NO_PREFIX); String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_IN_NO_PREFIX);
if (purchaseInMapper.selectByNo(no) != null) { if (purchaseInMapper.selectByNo(no) != null) {
...@@ -132,15 +131,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -132,15 +131,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private void calculateTotalPrice(ErpPurchaseInDO purchaseIn, List<ErpPurchaseInItemDO> purchaseInItems) { private void calculateTotalPrice(ErpPurchaseInDO purchaseIn, List<ErpPurchaseInItemDO> purchaseInItems) {
purchaseIn.setTotalCount(purchaseInItems.stream().mapToInt(ErpPurchaseInItemDO::getCount).sum()); purchaseIn.setTotalCount(purchaseInItems.stream().mapToInt(ErpPurchaseInItemDO::getCount).sum());
purchaseIn.setTotalProductPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); purchaseIn.setTotalProductPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTotalPrice, Integer::sum , 0));
purchaseIn.setTotalTaxPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); purchaseIn.setTotalTaxPrice(getSumValue(purchaseInItems, ErpPurchaseInItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
purchaseIn.setTotalPrice(purchaseIn.getTotalProductPrice().add(purchaseIn.getTotalTaxPrice())); purchaseIn.setTotalPrice(purchaseIn.getTotalProductPrice());
// 计算优惠价格 // 计算优惠价格
if (purchaseIn.getDiscountPercent() == null) { if (purchaseIn.getDiscountPercent() == null) {
purchaseIn.setDiscountPercent(BigDecimal.ZERO); purchaseIn.setDiscountPercent(BigDecimal.ZERO);
} }
purchaseIn.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseIn.getTotalPrice(), purchaseIn.getDiscountPercent())); // purchaseIn.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseIn.getTotalPrice(), purchaseIn.getDiscountPercent()));
purchaseIn.setTotalPrice(purchaseIn.getTotalPrice().subtract(purchaseIn.getDiscountPrice()).add(purchaseIn.getOtherPrice())); purchaseIn.setTotalPrice(purchaseIn.getTotalPrice()/*.subtract(purchaseIn.getDiscountPrice()).add(purchaseIn.getOtherPrice())*/);
} }
private void updatePurchaseOrderInCount(Long orderId) { private void updatePurchaseOrderInCount(Long orderId) {
...@@ -193,7 +192,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -193,7 +192,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
if (purchaseIn.getPaymentPrice().equals(paymentPrice)) { if (purchaseIn.getPaymentPrice().equals(paymentPrice)) {
return; return;
} }
if (paymentPrice.compareTo(purchaseIn.getTotalPrice()) > 0) { if (paymentPrice.compareTo(BigDecimal.valueOf(purchaseIn.getTotalPrice())) > 0) {
throw exception(PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED, paymentPrice, purchaseIn.getTotalPrice()); throw exception(PURCHASE_IN_FAIL_PAYMENT_PRICE_EXCEED, paymentPrice, purchaseIn.getTotalPrice());
} }
purchaseInMapper.updateById(new ErpPurchaseInDO().setId(id).setPaymentPrice(paymentPrice)); purchaseInMapper.updateById(new ErpPurchaseInDO().setId(id).setPaymentPrice(paymentPrice));
...@@ -201,19 +200,19 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { ...@@ -201,19 +200,19 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private List<ErpPurchaseInItemDO> validatePurchaseInItems(List<ErpPurchaseInSaveReqVO.Item> list) { private List<ErpPurchaseInItemDO> validatePurchaseInItems(List<ErpPurchaseInSaveReqVO.Item> list) {
// 1. 校验产品存在 // 1. 校验产品存在
List<ErpProductDO> productList = productService.validProductList( /*List<ErpProductDO> productList = productService.validProductList(
convertSet(list, ErpPurchaseInSaveReqVO.Item::getProductId)); convertSet(list, ErpPurchaseInSaveReqVO.Item::getProductId));
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId); Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);*/
// 2. 转化为 ErpPurchaseInItemDO 列表 // 2. 转化为 ErpPurchaseInItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseInItemDO.class, item -> { return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseInItemDO.class, item -> {
// item.setProductUnitId(productMap.get(item.getProductId()).getUnitId()); // item.setProductUnitId(productMap.get(item.getProductId()).getUnitId());
item.setTotalPrice(BigDecimal.valueOf(item.getProductPrice() * item.getCount())); item.setTotalPrice(item.getProductPrice() * item.getCount());
if (item.getTotalPrice() == null) { if (item.getTotalPrice() == null) {
return; return;
} }
if (item.getTaxPercent() != null) { /*if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent())); item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
} }*/
})); }));
} }
......
...@@ -346,7 +346,6 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService { ...@@ -346,7 +346,6 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
} }
if (!customerOrderSet.contains(item.getCustomerOrderId())) { if (!customerOrderSet.contains(item.getCustomerOrderId())) {
customerOrderApi.updateOrderStatus(item.getCustomerOrderId(), updateOrderStatus);
// 添加订单进度记录 // 添加订单进度记录
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent(); CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(updateOrderStatus); event.setOrderStatus(updateOrderStatus);
......
...@@ -5,6 +5,7 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd ...@@ -5,6 +5,7 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd
import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO; import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrderSaveReqVO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -123,7 +124,13 @@ public interface ErpSaleOrderService { ...@@ -123,7 +124,13 @@ public interface ErpSaleOrderService {
/** /**
* 配送 * 配送
* @param id
*/ */
void delivery(Long id, Long deliveryStaffId); void delivery(Long id, Long deliveryStaffId);
/**
* 到货
* @param id
* @param deliveryStaffId
*/
void arrival(DeliveryOrderUpdateReqVO reqVO, Long deliveryStaffId);
} }
\ No newline at end of file
...@@ -15,8 +15,11 @@ import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO; ...@@ -15,8 +15,11 @@ import cn.iocoder.foodnexus.module.erp.dal.dataobject.product.ErpProductDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutItemDO;
import cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper; import cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderItemMapper;
import cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderMapper; import cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOrderMapper;
import cn.iocoder.foodnexus.module.erp.dal.mysql.sale.ErpSaleOutItemMapper;
import cn.iocoder.foodnexus.module.erp.dal.redis.no.ErpNoRedisDAO; import cn.iocoder.foodnexus.module.erp.dal.redis.no.ErpNoRedisDAO;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus; import cn.iocoder.foodnexus.module.erp.api.enums.ErpAuditStatus;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus; import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
...@@ -29,7 +32,11 @@ import cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi; ...@@ -29,7 +32,11 @@ import cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi;
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi; import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.order.dto.CustomerOrderDTO; import cn.iocoder.foodnexus.module.order.dto.CustomerOrderDTO;
import cn.iocoder.foodnexus.module.order.dto.CustomerOrderRecordEvent; import cn.iocoder.foodnexus.module.order.dto.CustomerOrderRecordEvent;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
import cn.iocoder.foodnexus.module.order.enums.CustomerOrderStatus; import cn.iocoder.foodnexus.module.order.enums.CustomerOrderStatus;
import cn.iocoder.foodnexus.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.foodnexus.module.product.service.spu.ProductSpuService;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
...@@ -66,7 +73,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -66,7 +73,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
private ErpNoRedisDAO noRedisDAO; private ErpNoRedisDAO noRedisDAO;
@Resource @Resource
private ErpProductService productService; private ProductSpuService productService;
@Resource @Resource
private ErpCustomerService customerService; private ErpCustomerService customerService;
@Resource @Resource
...@@ -93,6 +100,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -93,6 +100,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
@Autowired @Autowired
private ErpSaleOutService saleOutService; private ErpSaleOutService saleOutService;
@Autowired
private ErpSaleOutItemMapper saleOutItemMapper;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createSaleOrder(ErpSaleOrderSaveReqVO createReqVO) { public Long createSaleOrder(ErpSaleOrderSaveReqVO createReqVO) {
...@@ -155,16 +165,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -155,16 +165,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
} }
private void calculateTotalPrice(ErpSaleOrderDO saleOrder, List<ErpSaleOrderItemDO> saleOrderItems) { private void calculateTotalPrice(ErpSaleOrderDO saleOrder, List<ErpSaleOrderItemDO> saleOrderItems) {
saleOrder.setTotalCount(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getCount, BigDecimal::add)); saleOrder.setTotalCount(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getCount, Integer::sum));
saleOrder.setTotalProductPrice(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); saleOrder.setTotalProductPrice(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getTotalPrice, Integer::sum, 0));
saleOrder.setTotalTaxPrice(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); saleOrder.setTotalTaxPrice(getSumValue(saleOrderItems, ErpSaleOrderItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
saleOrder.setTotalPrice(saleOrder.getTotalProductPrice().add(saleOrder.getTotalTaxPrice())); saleOrder.setTotalPrice(saleOrder.getTotalProductPrice());
// 计算优惠价格 // 计算优惠价格
if (saleOrder.getDiscountPercent() == null) { if (saleOrder.getDiscountPercent() == null) {
saleOrder.setDiscountPercent(BigDecimal.ZERO); saleOrder.setDiscountPercent(BigDecimal.ZERO);
} }
saleOrder.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOrder.getTotalPrice(), saleOrder.getDiscountPercent())); // saleOrder.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOrder.getTotalPrice(), saleOrder.getDiscountPercent()));
saleOrder.setTotalPrice(saleOrder.getTotalPrice().subtract(saleOrder.getDiscountPrice())); saleOrder.setTotalPrice(saleOrder.getTotalPrice()/*.subtract(saleOrder.getDiscountPrice()*/);
} }
@Override @Override
...@@ -196,19 +206,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -196,19 +206,16 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
private List<ErpSaleOrderItemDO> validateSaleOrderItems(List<ErpSaleOrderSaveReqVO.Item> list) { private List<ErpSaleOrderItemDO> validateSaleOrderItems(List<ErpSaleOrderSaveReqVO.Item> list) {
// 1. 校验产品存在 // 1. 校验产品存在
List<ErpProductDO> productList = productService.validProductList(
convertSet(list, ErpSaleOrderSaveReqVO.Item::getProductId));
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
// 2. 转化为 ErpSaleOrderItemDO 列表 // 2. 转化为 ErpSaleOrderItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOrderItemDO.class, item -> { return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOrderItemDO.class, item -> {
// item.setProductUnit(productMap.get(item.getProductId()).getUni()); // item.setProductUnit(productMap.get(item.getProductId()).getUni());
item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); item.setTotalPrice(item.getProductPrice() * item.getCount());
if (item.getTotalPrice() == null) { if (item.getTotalPrice() == null) {
return; return;
} }
if (item.getTaxPercent() != null) { /*if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent())); item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
} }*/
})); }));
} }
...@@ -240,9 +247,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -240,9 +247,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
if (item.getOutCount().equals(outCount)) { if (item.getOutCount().equals(outCount)) {
return; return;
} }
if (outCount.compareTo(item.getCount()) > 0) { if (outCount.compareTo(BigDecimal.valueOf(item.getCount())) > 0) {
throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED, throw exception(SALE_ORDER_ITEM_OUT_FAIL_PRODUCT_EXCEED,
productService.getProduct(item.getProductId()).getName(), item.getCount()); productService.getSpu(item.getProductId()).getName(), item.getCount());
} }
saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setOutCount(outCount)); saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setOutCount(outCount));
}); });
...@@ -262,7 +269,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -262,7 +269,7 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
} }
if (returnCount.compareTo(item.getOutCount()) > 0) { if (returnCount.compareTo(item.getOutCount()) > 0) {
throw exception(SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED, throw exception(SALE_ORDER_ITEM_RETURN_FAIL_OUT_EXCEED,
productService.getProduct(item.getProductId()).getName(), item.getOutCount()); productService.getSpu(item.getProductId()).getName(), item.getOutCount());
} }
saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setReturnCount(returnCount)); saleOrderItemMapper.updateById(new ErpSaleOrderItemDO().setId(item.getId()).setReturnCount(returnCount));
}); });
...@@ -378,11 +385,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -378,11 +385,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
String deliveryName = deliveryStaffApi.queryNameByStaffId(saleOrder.getDeliveryStaffId()); String deliveryName = deliveryStaffApi.queryNameByStaffId(saleOrder.getDeliveryStaffId());
String warehouseName = Optional.ofNullable(customerOrder.getWarehouseInfo()).map(WarehouseInfo::getName).orElse(""); String warehouseName = Optional.ofNullable(customerOrder.getWarehouseInfo()).map(WarehouseInfo::getName).orElse("");
ErpPurchaseOrderDO purchaseOrder = purchaseOrderService.getPurchaseOrder(saleItemOrder.getPurchaseOrderId());
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent(); CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.SORTING); event.setOrderStatus(CustomerOrderStatus.SORTING);
event.setCustomerOrderId(saleOrder.getCustomerOrderId()); event.setCustomerOrderId(saleOrder.getCustomerOrderId());
event.setSupplierId(purchaseOrder.getSupplierId());
event.setCopyWriter(CommonUtil.asList(warehouseName, deliveryName)); event.setCopyWriter(CommonUtil.asList(warehouseName, deliveryName));
orderRecordApi.recordEvent(event); orderRecordApi.recordEvent(event);
} }
...@@ -391,10 +396,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -391,10 +396,9 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
/** /**
* 配送 * 配送
*
* @param id
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class)
public void delivery(Long id, Long deliveryStaffId) { public void delivery(Long id, Long deliveryStaffId) {
ErpSaleOrderDO saleOrder = this.validateSaleOrder(id); ErpSaleOrderDO saleOrder = this.validateSaleOrder(id);
if (!SaleOrderPickUpStatus.PICK_UP.equals(saleOrder.getPickUpStatus())) { if (!SaleOrderPickUpStatus.PICK_UP.equals(saleOrder.getPickUpStatus())) {
...@@ -402,8 +406,12 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -402,8 +406,12 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
} }
saleOrderMapper.update(Wrappers.<ErpSaleOrderDO>lambdaUpdate() saleOrderMapper.update(Wrappers.<ErpSaleOrderDO>lambdaUpdate()
.set(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.ALREADY.getType()) .set(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.ALREADY.getType())
.set(ErpSaleOrderDO::getDeliveryTime, LocalDateTime.now())
.set(ErpSaleOrderDO::getDeliveryStaffId, deliveryStaffId) .set(ErpSaleOrderDO::getDeliveryStaffId, deliveryStaffId)
.eq(ErpSaleOrderDO::getId, saleOrder.getId())); .eq(ErpSaleOrderDO::getId, saleOrder.getId()));
saleOrderItemMapper.update(Wrappers.<ErpSaleOrderItemDO>lambdaUpdate()
.set(ErpSaleOrderItemDO::getPickUpStatus, SaleOrderPickUpStatus.ALREADY.getType())
.eq(ErpSaleOrderItemDO::getOrderId, saleOrder.getId()));
List<ErpSaleOrderItemDO> saleOrderItems = saleOrderItemMapper.selectListByOrderId(id); List<ErpSaleOrderItemDO> saleOrderItems = saleOrderItemMapper.selectListByOrderId(id);
// 新增销售出库单 // 新增销售出库单
...@@ -415,11 +423,19 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -415,11 +423,19 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
saleOutSaveReqVO.setDiscountPercent(saleOrder.getDiscountPercent()); saleOutSaveReqVO.setDiscountPercent(saleOrder.getDiscountPercent());
saleOutSaveReqVO.setFileUrl(saleOrder.getFileUrl()); saleOutSaveReqVO.setFileUrl(saleOrder.getFileUrl());
saleOutSaveReqVO.setRemark(saleOrder.getRemark()); saleOutSaveReqVO.setRemark(saleOrder.getRemark());
saleOutSaveReqVO.setCustomerOrderId(saleOrder.getCustomerOrderId());
saleOutSaveReqVO.setDeliveryMode(saleOrder.getDeliveryMode());
saleOutSaveReqVO.setDeliveryTime(saleOrder.getDeliveryTime());
saleOutSaveReqVO.setDeliveryStaffId(saleOrder.getDeliveryStaffId());
saleOutSaveReqVO.setAddressId(saleOrder.getAddressId());
saleOutSaveReqVO.setAddressInfo(saleOrder.getAddressInfo());
CustomerOrderDTO customerOrderDTO = customerOrderApi.queryById(saleOrder.getCustomerOrderId());
saleOutSaveReqVO.setItems(CommonUtil.listConvert(saleOrderItems, saleOrderItem -> { saleOutSaveReqVO.setItems(CommonUtil.listConvert(saleOrderItems, saleOrderItem -> {
ErpSaleOutSaveReqVO.Item item = new ErpSaleOutSaveReqVO.Item(); ErpSaleOutSaveReqVO.Item item = new ErpSaleOutSaveReqVO.Item();
item.setOrderItemId(saleOrderItem.getId()); item.setOrderItemId(saleOrderItem.getId());
item.setWarehouseId(customerOrderDTO.getWarehouseAreaId());
// item.setWarehouseId();
item.setProductId(saleOrderItem.getProductId()); item.setProductId(saleOrderItem.getProductId());
item.setProductUnit(saleOrderItem.getProductUnit()); item.setProductUnit(saleOrderItem.getProductUnit());
item.setProductPrice(saleOrderItem.getProductPrice()); item.setProductPrice(saleOrderItem.getProductPrice());
...@@ -429,6 +445,60 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService { ...@@ -429,6 +445,60 @@ public class ErpSaleOrderServiceImpl implements ErpSaleOrderService {
return item; return item;
})); }));
saleOutService.createSaleOut(saleOutSaveReqVO); saleOutService.createSaleOut(saleOutSaveReqVO);
DeliveryStaffSimpleInfo deliveryStaffSimpleInfo = deliveryStaffApi.querybyStaffId(saleOrder.getDeliveryStaffId());
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.DELIVERY);
event.setCustomerOrderId(saleOrder.getCustomerOrderId());
event.setCopyWriter(CommonUtil.asList(deliveryStaffSimpleInfo.getName(), deliveryStaffSimpleInfo.getContact()));
orderRecordApi.recordEvent(event);
}
/**
* 到货
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void arrival(DeliveryOrderUpdateReqVO reqVO, Long deliveryStaffId) {
ErpSaleOutDO saleOut = saleOutService.validateSaleOut(reqVO.getSaleOutId());
ErpSaleOrderDO saleOrder = this.validateSaleOrder(saleOut.getOrderId());
if (!SaleOrderPickUpStatus.ALREADY.equals(saleOrder.getPickUpStatus())) {
throw exception(SALE_ORDER_PICKUP_STATUS_FAIL);
}
saleOrderMapper.update(Wrappers.<ErpSaleOrderDO>lambdaUpdate()
.set(ErpSaleOrderDO::getPickUpStatus, SaleOrderPickUpStatus.ARRIVAL.getType())
.set(ErpSaleOrderDO::getDeliveryStaffId, deliveryStaffId)
.eq(ErpSaleOrderDO::getId, saleOrder.getId()));
saleOrderItemMapper.update(Wrappers.<ErpSaleOrderItemDO>lambdaUpdate()
.set(ErpSaleOrderItemDO::getPickUpStatus, SaleOrderPickUpStatus.ARRIVAL.getType())
.eq(ErpSaleOrderItemDO::getOrderId, saleOrder.getId()));
// 更新出库单价格
if (CommonUtil.isNotEmpty(reqVO.getItems())) {
Map<Long, DeliveryOrderUpdateReqVO.Item> itemMap = CommonUtil.listConvertMap(reqVO.getItems(), DeliveryOrderUpdateReqVO.Item::getSaleOutItemid);
List<ErpSaleOutItemDO> saleOutItems = saleOutService.getSaleOutItemListByOutId(reqVO.getSaleOutId());
List<ErpSaleOutItemDO> updateBatch = new ArrayList<>();
saleOutItems.forEach(saleOutItem -> {
if (itemMap.containsKey(saleOutItem.getId())) {
DeliveryOrderUpdateReqVO.Item item = itemMap.get(saleOutItem.getId());
ErpSaleOutItemDO updateItem = new ErpSaleOutItemDO();
updateItem.setId(item.getSaleOutItemid());
updateItem.setCount(item.getSignedQuantity());
updateItem.setRemark(item.getRemark());
updateItem.setRemarkFiles(item.getRemarkFiles());
updateItem.setTotalPrice(item.getSignedQuantity() * saleOutItem.getProductPrice());
updateBatch.add(updateItem);
}
});
saleOutItemMapper.updateBatch(updateBatch);
}
DeliveryStaffSimpleInfo deliveryStaffSimpleInfo = deliveryStaffApi.querybyStaffId(saleOrder.getDeliveryStaffId());
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.ARRIVAL);
event.setCustomerOrderId(saleOrder.getCustomerOrderId());
event.setCopyWriter(CommonUtil.asList(deliveryStaffSimpleInfo.getName(), deliveryStaffSimpleInfo.getContact()));
orderRecordApi.recordEvent(event);
} }
} }
...@@ -99,4 +99,5 @@ public interface ErpSaleOutService { ...@@ -99,4 +99,5 @@ public interface ErpSaleOutService {
List<ErpSaleOutItemDO> getSaleOutItemListByOutIds(Collection<Long> outIds); List<ErpSaleOutItemDO> getSaleOutItemListByOutIds(Collection<Long> outIds);
ErpSaleOutDO getSaleOutByCustomerOrderId(Long customerOrderId);
} }
\ No newline at end of file
...@@ -141,16 +141,16 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -141,16 +141,16 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
} }
private void calculateTotalPrice(ErpSaleOutDO saleOut, List<ErpSaleOutItemDO> saleOutItems) { private void calculateTotalPrice(ErpSaleOutDO saleOut, List<ErpSaleOutItemDO> saleOutItems) {
saleOut.setTotalCount(getSumValue(saleOutItems, ErpSaleOutItemDO::getCount, BigDecimal::add)); saleOut.setTotalCount(getSumValue(saleOutItems, ErpSaleOutItemDO::getCount, Integer::sum));
saleOut.setTotalProductPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO)); saleOut.setTotalProductPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTotalPrice, Integer::sum, 0));
saleOut.setTotalTaxPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO)); saleOut.setTotalTaxPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTaxPrice, BigDecimal::add, BigDecimal.ZERO));
saleOut.setTotalPrice(saleOut.getTotalProductPrice().add(saleOut.getTotalTaxPrice())); saleOut.setTotalPrice(saleOut.getTotalProductPrice());
// 计算优惠价格 // 计算优惠价格
if (saleOut.getDiscountPercent() == null) { if (saleOut.getDiscountPercent() == null) {
saleOut.setDiscountPercent(BigDecimal.ZERO); saleOut.setDiscountPercent(BigDecimal.ZERO);
} }
saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent())); // saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent()));
saleOut.setTotalPrice(saleOut.getTotalPrice().subtract(saleOut.getDiscountPrice().add(saleOut.getOtherPrice()))); saleOut.setTotalPrice(saleOut.getTotalPrice()/* - (saleOut.getDiscountPrice().add(saleOut.getOtherPrice()))*/);
} }
private void updateSaleOrderOutCount(Long orderId) { private void updateSaleOrderOutCount(Long orderId) {
...@@ -190,9 +190,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -190,9 +190,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_OUT.getType() Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_OUT.getType()
: ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType(); : ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType();
saleOutItems.forEach(saleOutItem -> { saleOutItems.forEach(saleOutItem -> {
BigDecimal count = approve ? saleOutItem.getCount().negate() : saleOutItem.getCount(); Integer count = approve ? - saleOutItem.getCount() : saleOutItem.getCount();
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
saleOutItem.getProductId(), saleOutItem.getWarehouseId(), count, saleOutItem.getProductId(), saleOutItem.getWarehouseId(), BigDecimal.valueOf(count),
bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo())); bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo()));
}); });
} }
...@@ -203,7 +203,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -203,7 +203,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
if (saleOut.getReceiptPrice().equals(receiptPrice)) { if (saleOut.getReceiptPrice().equals(receiptPrice)) {
return; return;
} }
if (receiptPrice.compareTo(saleOut.getTotalPrice()) > 0) { if (receiptPrice.compareTo(BigDecimal.valueOf(saleOut.getTotalPrice())) > 0) {
throw exception(SALE_OUT_FAIL_RECEIPT_PRICE_EXCEED, receiptPrice, saleOut.getTotalPrice()); throw exception(SALE_OUT_FAIL_RECEIPT_PRICE_EXCEED, receiptPrice, saleOut.getTotalPrice());
} }
saleOutMapper.updateById(new ErpSaleOutDO().setId(id).setReceiptPrice(receiptPrice)); saleOutMapper.updateById(new ErpSaleOutDO().setId(id).setReceiptPrice(receiptPrice));
...@@ -215,13 +215,10 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -215,13 +215,10 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
// 2. 转化为 ErpSaleOutItemDO 列表 // 2. 转化为 ErpSaleOutItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> { return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> {
item.setProductUnit(productMap.get(item.getProductId()).getUnitName()); item.setProductUnit(productMap.get(item.getProductId()).getUnitName());
item.setTotalPrice(MoneyUtils.priceMultiply(item.getProductPrice(), item.getCount())); item.setTotalPrice(item.getProductPrice() * item.getCount());
if (item.getTotalPrice() == null) { if (item.getTotalPrice() == null) {
return; return;
} }
if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
}
})); }));
} }
...@@ -313,4 +310,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService { ...@@ -313,4 +310,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
return saleOutItemMapper.selectListByOutIds(outIds); return saleOutItemMapper.selectListByOutIds(outIds);
} }
@Override
public ErpSaleOutDO getSaleOutByCustomerOrderId(Long customerOrderId) {
return saleOutMapper.selectOne(ErpSaleOutDO::getCustomerOrderId, customerOrderId);
}
} }
...@@ -7,6 +7,7 @@ import cn.iocoder.foodnexus.framework.common.util.CommonUtil; ...@@ -7,6 +7,7 @@ import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.module.operations.dal.dataobject.deliverystaffcustomer.DeliveryStaffCustomerDO; import cn.iocoder.foodnexus.module.operations.dal.dataobject.deliverystaffcustomer.DeliveryStaffCustomerDO;
import cn.iocoder.foodnexus.module.operations.dal.mysql.deliverystaffcustomer.DeliveryStaffCustomerMapper; import cn.iocoder.foodnexus.module.operations.dal.mysql.deliverystaffcustomer.DeliveryStaffCustomerMapper;
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi; import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
import cn.iocoder.foodnexus.module.system.controller.admin.user.vo.user.UserSaveReqVO; import cn.iocoder.foodnexus.module.system.controller.admin.user.vo.user.UserSaveReqVO;
import cn.iocoder.foodnexus.module.system.service.dept.DeptService; import cn.iocoder.foodnexus.module.system.service.dept.DeptService;
import cn.iocoder.foodnexus.module.system.service.user.AdminUserService; import cn.iocoder.foodnexus.module.system.service.user.AdminUserService;
...@@ -158,4 +159,9 @@ public class DeliveryStaffServiceImpl implements DeliveryStaffService, DeliveryS ...@@ -158,4 +159,9 @@ public class DeliveryStaffServiceImpl implements DeliveryStaffService, DeliveryS
return Optional.ofNullable(deliveryStaffMapper.selectOne(DeliveryStaffDO::getUserId, loginUserId)) return Optional.ofNullable(deliveryStaffMapper.selectOne(DeliveryStaffDO::getUserId, loginUserId))
.map(DeliveryStaffDO::getId).orElse(null); .map(DeliveryStaffDO::getId).orElse(null);
} }
@Override
public DeliveryStaffSimpleInfo querybyStaffId(Long staffId) {
return BeanUtils.toBean(deliveryStaffMapper.selectById(staffId), DeliveryStaffSimpleInfo.class);
}
} }
\ No newline at end of file
package cn.iocoder.foodnexus.module.order.api; package cn.iocoder.foodnexus.module.order.api;
import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
/** /**
* @author : yanghao * @author : yanghao
* create at: 2025/9/25 15:54 * create at: 2025/9/25 15:54
...@@ -10,4 +12,6 @@ public interface DeliveryStaffApi { ...@@ -10,4 +12,6 @@ public interface DeliveryStaffApi {
String queryNameByStaffId(Long staffId); String queryNameByStaffId(Long staffId);
Long queryStaffIdByUserId(Long loginUserId); Long queryStaffIdByUserId(Long loginUserId);
DeliveryStaffSimpleInfo querybyStaffId(Long staffId);
} }
package cn.iocoder.foodnexus.module.order.dto;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* @author : yanghao
* create at: 2025/9/28 17:35
* @description: 配送订单 - 实际配送信息
*/
@Data
public class DeliveryOrderUpdateReqVO {
/**
* 销售出库单id
*/
@NotNull(message = "销售出库单id不能为空")
private Long saleOutId;
/**
* 销售出库子项
*/
@NotNull(message = "销售出库子项不能为空")
@Valid
private List<Item> items;
@Data
public static class Item {
/**
* 销售出库子id
*/
@NotNull(message = "销售出库子id不能为空")
private Long saleOutItemid;
/**
* 实际签收数量
*/
@NotNull(message = "实际签收数量不能为空")
@Min(value = 0, message = "实际签收数量最小为0")
private Integer signedQuantity;
/**
* 说明
*/
private String remark;
/**
* 相关文件
*/
private List<String> remarkFiles;
}
}
package cn.iocoder.foodnexus.module.order.dto;
import lombok.Data;
/**
* @author : yanghao
* create at: 2025/9/28 16:40
* @description:
*/
@Data
public class DeliveryStaffSimpleInfo {
private Long id;
/**
* 姓名
*/
private String name;
/**
* 联系方式
*/
private String contact;
/**
* 关联系统用户id
*/
private Long userId;
}
...@@ -91,7 +91,7 @@ public enum CustomerOrderStatus implements ArrayValuable<String> { ...@@ -91,7 +91,7 @@ public enum CustomerOrderStatus implements ArrayValuable<String> {
CANCEL("取消订单", "CANCEL", 9999) { CANCEL("取消订单", "CANCEL", 9999) {
@Override @Override
public String getText() { public String getText() {
return ""; return "客户取消订单";
} }
}, },
......
package cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo; package cn.iocoder.foodnexus.module.order.controller.admin.customerorderitem.vo;
import cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderRemark;
import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo; import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
...@@ -69,4 +70,7 @@ public class CustomerOrderItemRespVO { ...@@ -69,4 +70,7 @@ public class CustomerOrderItemRespVO {
@ExcelProperty("签收总价,单位:分") @ExcelProperty("签收总价,单位:分")
private Integer signedTotal; private Integer signedTotal;
@Schema(description = "订单备注")
private CustomerOrderRemark orderRemark;
} }
\ No newline at end of file
package cn.iocoder.foodnexus.module.order.controller.app.customerOrder; package cn.iocoder.foodnexus.module.order.controller.app.customerOrder;
import cn.iocoder.foodnexus.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum; import cn.iocoder.foodnexus.framework.common.enums.UserSystemEnum;
import cn.iocoder.foodnexus.framework.common.pojo.CommonResult; import cn.iocoder.foodnexus.framework.common.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult; import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil; import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderPageReqVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderPageReqVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRecordMapVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRecordMapVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO; import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderRespVO;
import cn.iocoder.foodnexus.module.order.controller.admin.customerorder.vo.CustomerOrderSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReceiptRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
import cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderDO; import cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderDO;
import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService; import cn.iocoder.foodnexus.module.order.service.customerorder.CustomerOrderService;
import cn.iocoder.foodnexus.module.order.service.customerorderrecord.CustomerOrderRecordService; import cn.iocoder.foodnexus.module.order.service.customerorderrecord.CustomerOrderRecordService;
...@@ -23,18 +21,14 @@ import io.swagger.v3.oas.annotations.Operation; ...@@ -23,18 +21,14 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.sql.rowset.serial.SerialException; import javax.sql.rowset.serial.SerialException;
import java.io.IOException;
import java.util.List; import java.util.List;
import static cn.iocoder.foodnexus.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success; import static cn.iocoder.foodnexus.framework.common.pojo.CommonResult.success;
@Tag(name = "APP - 客户总订单") @Tag(name = "APP - 客户总订单")
...@@ -48,6 +42,8 @@ public class AppCustomerOrderController { ...@@ -48,6 +42,8 @@ public class AppCustomerOrderController {
private CustomerOrderService customerOrderService; private CustomerOrderService customerOrderService;
@Autowired @Autowired
private CustomerOrderRecordService customerOrderRecordService; private CustomerOrderRecordService customerOrderRecordService;
@Autowired
private ErpSaleOutService saleOutService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建客户总订单") @Operation(summary = "创建客户总订单")
...@@ -72,6 +68,13 @@ public class AppCustomerOrderController { ...@@ -72,6 +68,13 @@ public class AppCustomerOrderController {
return success(Boolean.TRUE); return success(Boolean.TRUE);
} }
@GetMapping("receipt")
@Operation(summary = "获取签收客户订单信息")
@Parameter(name = "id", description = "客户订单id", required = true)
public CommonResult<List<AppCustomerOrderReceiptRespVO>> receipt(@RequestParam("id") Long id) {
return success(customerOrderService.queryReceipt(id));
}
@PostMapping("receipt") @PostMapping("receipt")
@Operation(summary = "签收客户订单") @Operation(summary = "签收客户订单")
public CommonResult<Boolean> receipt(@Valid @RequestBody AppCustomerOrderRemarkReqVO reqVO) { public CommonResult<Boolean> receipt(@Valid @RequestBody AppCustomerOrderRemarkReqVO reqVO) {
......
package cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* @author : yanghao
* create at: 2025/9/24 15:51
* @description: 订单备注
*/
@Data
public class AppCustomerOrderReceiptRespVO {
@Schema(description = "商品id")
private Long productId;
@Schema(description = "实际签收数量")
private Integer signedQuantity;
@Schema(description = "说明")
private String remark;
@Schema(description = "相关文件")
private List<String> remarkFiles;
}
...@@ -13,11 +13,11 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd ...@@ -13,11 +13,11 @@ import cn.iocoder.foodnexus.module.erp.controller.admin.sale.vo.order.ErpSaleOrd
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpCustomerDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpCustomerDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO; import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.erp.enums.SaleOrderPickUpStatus;
import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService; import cn.iocoder.foodnexus.module.erp.service.product.ErpProductService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpCustomerService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService; import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi; import cn.iocoder.foodnexus.module.order.api.DeliveryStaffApi;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth; import cn.iocoder.foodnexus.module.system.annotations.AppSystemAuth;
import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi; import cn.iocoder.foodnexus.module.system.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
...@@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; ...@@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -69,11 +68,13 @@ public class DeliveryOrderController { ...@@ -69,11 +68,13 @@ public class DeliveryOrderController {
@Operation(summary = "获得销售订单分页") @Operation(summary = "获得销售订单分页")
public CommonResult<PageResult<ErpSaleOrderRespVO>> getSaleOrderPage(@Valid ErpSaleOrderPageReqVO pageReqVO) { public CommonResult<PageResult<ErpSaleOrderRespVO>> getSaleOrderPage(@Valid ErpSaleOrderPageReqVO pageReqVO) {
pageReqVO.setDeliveryStaffId(deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId())); pageReqVO.setDeliveryStaffId(deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId()));
pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP); // pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP);
PageResult<ErpSaleOrderDO> pageResult = saleOrderService.getSaleOrderPage(pageReqVO); PageResult<ErpSaleOrderDO> pageResult = saleOrderService.getSaleOrderPage(pageReqVO);
return success(buildSaleOrderVOPageResult(pageResult)); return success(buildSaleOrderVOPageResult(pageResult));
} }
// TODO 配送单修改实际配送数量在哪一步?
// 配送订单,生成销售出库单 // 配送订单,生成销售出库单
@PostMapping("/delivery") @PostMapping("/delivery")
@Operation(summary = "配送订单") @Operation(summary = "配送订单")
...@@ -83,8 +84,14 @@ public class DeliveryOrderController { ...@@ -83,8 +84,14 @@ public class DeliveryOrderController {
return success(Boolean.TRUE); return success(Boolean.TRUE);
} }
// 订单到货
// 订单修改 @PostMapping("/arrival")
@Operation(summary = "订单到货")
@Parameter(name = "id", description = "销售订单id", required = true)
public CommonResult<Boolean> arrival(@RequestBody @Valid DeliveryOrderUpdateReqVO reqVO) {
saleOrderService.arrival(reqVO, deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId()));
return success(Boolean.TRUE);
}
private PageResult<ErpSaleOrderRespVO> buildSaleOrderVOPageResult(PageResult<ErpSaleOrderDO> pageResult) { private PageResult<ErpSaleOrderRespVO> buildSaleOrderVOPageResult(PageResult<ErpSaleOrderDO> pageResult) {
......
package cn.iocoder.foodnexus.module.order.dal.dataobject.customerorderitem; package cn.iocoder.foodnexus.module.order.dal.dataobject.customerorderitem;
import cn.iocoder.foodnexus.module.order.dal.dataobject.customerorder.CustomerOrderRemark;
import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo; import cn.iocoder.foodnexus.module.product.api.dto.ProductInfo;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*; import lombok.*;
...@@ -79,5 +80,10 @@ public class CustomerOrderItemDO extends BaseDO { ...@@ -79,5 +80,10 @@ public class CustomerOrderItemDO extends BaseDO {
*/ */
private Integer signedTotal; private Integer signedTotal;
/**
* 订单备注
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerOrderRemark orderRemark;
} }
\ No newline at end of file
...@@ -16,6 +16,8 @@ public interface ErrorCodeConstants { ...@@ -16,6 +16,8 @@ public interface ErrorCodeConstants {
ErrorCode CUSTOMER_ORDER_WAREHOUSE_NOEXISTS = new ErrorCode(1_019_100_002, "仓库不存在"); ErrorCode CUSTOMER_ORDER_WAREHOUSE_NOEXISTS = new ErrorCode(1_019_100_002, "仓库不存在");
ErrorCode CUSTOMER_WAREHOUSE_NOT_BIND = new ErrorCode(1_019_100_003, "所选仓库未绑定"); ErrorCode CUSTOMER_WAREHOUSE_NOT_BIND = new ErrorCode(1_019_100_003, "所选仓库未绑定");
ErrorCode CUSTOMER_ORDER_ADDRESS_NOEXISTS = new ErrorCode(1_019_100_004, "仓库不存在"); ErrorCode CUSTOMER_ORDER_ADDRESS_NOEXISTS = new ErrorCode(1_019_100_004, "仓库不存在");
ErrorCode CUSTOMER_ORDER_STATUS_ERROR = new ErrorCode(1_019_100_005, "客户订单状态异常");
ErrorCode CUSTOMER_ORDER_OUT_ERROR = new ErrorCode(1_019_100_006, "客户订单出库环节异常");
// ========== 客户订单-子订单 1_020_100_0001 ========== // ========== 客户订单-子订单 1_020_100_0001 ==========
ErrorCode CUSTOMER_ORDER_ITEM_NOT_EXISTS = new ErrorCode(1_020_100_001, "客户订单-子订单不存在"); ErrorCode CUSTOMER_ORDER_ITEM_NOT_EXISTS = new ErrorCode(1_020_100_001, "客户订单-子订单不存在");
......
...@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.order.service.customerorder; ...@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.order.service.customerorder;
import java.util.*; import java.util.*;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReceiptRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
...@@ -87,4 +88,6 @@ public interface CustomerOrderService { ...@@ -87,4 +88,6 @@ public interface CustomerOrderService {
* @param reqVO * @param reqVO
*/ */
void receipt(AppCustomerOrderRemarkReqVO reqVO); void receipt(AppCustomerOrderRemarkReqVO reqVO);
List<AppCustomerOrderReceiptRespVO> queryReceipt(Long id);
} }
\ No newline at end of file
...@@ -9,13 +9,17 @@ import cn.iocoder.foodnexus.module.erp.api.PurchaseOrderSplitEvent; ...@@ -9,13 +9,17 @@ import cn.iocoder.foodnexus.module.erp.api.PurchaseOrderSplitEvent;
import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpCustomerApi;
import cn.iocoder.foodnexus.module.erp.api.service.ErpSupplierApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpSupplierApi;
import cn.iocoder.foodnexus.module.erp.api.service.ErpWarehouseApi; import cn.iocoder.foodnexus.module.erp.api.service.ErpWarehouseApi;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOutItemDO;
import cn.iocoder.foodnexus.module.erp.service.customerwarehouse.CustomerWarehouseService; import cn.iocoder.foodnexus.module.erp.service.customerwarehouse.CustomerWarehouseService;
import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderServiceImpl; import cn.iocoder.foodnexus.module.erp.service.purchase.ErpPurchaseOrderServiceImpl;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOutService;
import cn.iocoder.foodnexus.module.operations.dal.dataobject.inquiresupplierpush.InquireSupplierPushDO; import cn.iocoder.foodnexus.module.operations.dal.dataobject.inquiresupplierpush.InquireSupplierPushDO;
import cn.iocoder.foodnexus.module.operations.service.inquiresupplierpush.InquireSupplierPushService; import cn.iocoder.foodnexus.module.operations.service.inquiresupplierpush.InquireSupplierPushService;
import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi; import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi;
import cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi; import cn.iocoder.foodnexus.module.order.api.CustomerOrderRecordApi;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderItemSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderItemSaveReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderReceiptRespVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderRemarkReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO; import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo; import cn.iocoder.foodnexus.module.order.dto.CustomerAddressInfo;
...@@ -54,7 +58,6 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils; ...@@ -54,7 +58,6 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.module.order.dal.mysql.customerorder.CustomerOrderMapper; import cn.iocoder.foodnexus.module.order.dal.mysql.customerorder.CustomerOrderMapper;
import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.foodnexus.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.foodnexus.module.order.enums.ErrorCodeConstants.*; import static cn.iocoder.foodnexus.module.order.enums.ErrorCodeConstants.*;
/** /**
...@@ -104,6 +107,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -104,6 +107,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
private ProductSpuService productSpuService; private ProductSpuService productSpuService;
@Autowired @Autowired
@Lazy
private ErpSaleOutService saleOutService;
@Autowired
private GenCodeUtils genCodeUtils; private GenCodeUtils genCodeUtils;
@Override @Override
...@@ -263,13 +270,24 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -263,13 +270,24 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
throw exception(CUSTOMER_ORDER_NOT_EXISTS); throw exception(CUSTOMER_ORDER_NOT_EXISTS);
} }
// TODO ... 取消订单校验待定(订单状态) // TODO ... 取消订单校验待定(订单状态)
CustomerOrderStatus orderStatus = customerOrder.getOrderStatus();
CustomerOrderRemark orderRemark = BeanUtils.toBean(reqVO, CustomerOrderRemark.class, item -> { if (orderStatus.equals(CustomerOrderStatus.ORDER_SUCCESS) ||
item.setOperTime(LocalDateTime.now()); orderStatus.equals(CustomerOrderStatus.ORDER_MATCH)) {
}); CustomerOrderRemark orderRemark = BeanUtils.toBean(reqVO, CustomerOrderRemark.class, item -> {
customerOrderMapper.update(Wrappers.<CustomerOrderDO>lambdaUpdate() item.setOperTime(LocalDateTime.now());
.set(CustomerOrderDO::getOrderRemark, orderRemark) });
.eq(CustomerOrderDO::getId, reqVO.getId())); customerOrderMapper.update(Wrappers.<CustomerOrderDO>lambdaUpdate()
.set(CustomerOrderDO::getOrderRemark, orderRemark)
.eq(CustomerOrderDO::getId, reqVO.getId()));
// 订单记录
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.CANCEL);
event.setCustomerOrderId(reqVO.getId());
orderRecordApi.recordEvent(event);
} else {
throw exception(CUSTOMER_ORDER_STATUS_ERROR);
}
} }
/** /**
...@@ -280,10 +298,81 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO ...@@ -280,10 +298,81 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
@Override @Override
public void receipt(AppCustomerOrderRemarkReqVO reqVO) { public void receipt(AppCustomerOrderRemarkReqVO reqVO) {
// TODO .. 校验订单 // TODO .. 校验订单
CustomerOrderDO customerOrder = getCustomerOrder(reqVO.getId());
if (CommonUtil.isEmpty(customerOrder)) {
throw exception(CUSTOMER_ORDER_NOT_EXISTS);
}
if (!customerOrder.getOrderStatus().equals(CustomerOrderStatus.ARRIVAL)) {
throw exception(CUSTOMER_ORDER_STATUS_ERROR);
}
List<CustomerOrderItemDO> customerOrderItems = customerOrderItemMapper.selectList(CustomerOrderItemDO::getOrderId, reqVO.getId());
ErpSaleOutDO saleOut = saleOutService.getSaleOutByCustomerOrderId(reqVO.getId());
if (CommonUtil.isEmpty(saleOut)) {
throw exception(CUSTOMER_ORDER_OUT_ERROR);
}
List<ErpSaleOutItemDO> saleOutItems = saleOutService.getSaleOutItemListByOutId(saleOut.getId());
Map<Long, ErpSaleOutItemDO> productMap = CommonUtil.listConvertMap(saleOutItems, ErpSaleOutItemDO::getProductId);
List<CustomerOrderItemDO> updateBatch = new ArrayList<>();
customerOrderItems.forEach(customerOrderItem -> {
CustomerOrderItemDO updateItem = new CustomerOrderItemDO();
updateItem.setId(customerOrderItem.getId());
if (productMap.containsKey(customerOrderItem.getProductId())) {
ErpSaleOutItemDO saleOutItem = productMap.get(customerOrderItem.getProductId());
updateItem.setSignedQuantity(saleOutItem.getCount());
CustomerOrderRemark remark = new CustomerOrderRemark();
remark.setOperTime(saleOutItem.getCreateTime());
remark.setRemarkFiles(saleOutItem.getRemarkFiles());
remark.setRemark(saleOutItem.getRemark());
updateItem.setOrderRemark(remark);
} else {
updateItem.setSignedQuantity(customerOrderItem.getOrderItemQuantity());
}
updateItem.setSignedTotal(updateItem.getSignedQuantity() * customerOrderItem.getOrderItemPrice());
updateBatch.add(updateItem);
});
// TODO .. 根据签收单调整订单价格等 customerOrderItemMapper.updateBatch(updateBatch);
// TODO .. 修改订单状态 // 订单记录
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(CustomerOrderStatus.SIGN_RECEIPT);
event.setCustomerOrderId(reqVO.getId());
// TODO 签收单链接
event.setCopyWriter(CommonUtil.asList("TODO 签收单链接"));
orderRecordApi.recordEvent(event);
}
@Override
public List<AppCustomerOrderReceiptRespVO> queryReceipt(Long id) {
CustomerOrderDO customerOrder = getCustomerOrder(id);
if (CommonUtil.isEmpty(customerOrder)) {
throw exception(CUSTOMER_ORDER_NOT_EXISTS);
}
if (!customerOrder.getOrderStatus().equals(CustomerOrderStatus.ARRIVAL)) {
throw exception(CUSTOMER_ORDER_STATUS_ERROR);
}
List<CustomerOrderItemDO> customerOrderItems = customerOrderItemMapper.selectList(CustomerOrderItemDO::getOrderId, id);
ErpSaleOutDO saleOut = saleOutService.getSaleOutByCustomerOrderId(id);
if (CommonUtil.isEmpty(saleOut)) {
throw exception(CUSTOMER_ORDER_OUT_ERROR);
}
List<ErpSaleOutItemDO> saleOutItems = saleOutService.getSaleOutItemListByOutId(saleOut.getId());
Map<Long, ErpSaleOutItemDO> productMap = CommonUtil.listConvertMap(saleOutItems, ErpSaleOutItemDO::getProductId);
return CommonUtil.listConvert(customerOrderItems, customerOrderItem -> {
AppCustomerOrderReceiptRespVO result = new AppCustomerOrderReceiptRespVO();
result.setProductId(customerOrderItem.getProductId());
if (productMap.containsKey(customerOrderItem.getProductId())) {
ErpSaleOutItemDO saleOutItem = productMap.get(customerOrderItem.getProductId());
result.setSignedQuantity(saleOutItem.getCount());
result.setRemark(saleOutItem.getRemark());
result.setRemarkFiles(saleOutItem.getRemarkFiles());
} else {
result.setSignedQuantity(customerOrderItem.getOrderItemQuantity());
}
return result;
});
} }
/** /**
......
...@@ -141,7 +141,10 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic ...@@ -141,7 +141,10 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic
CustomerOrderStatus orderStatus = event.getOrderStatus(); CustomerOrderStatus orderStatus = event.getOrderStatus();
CustomerOrderDTO orderInfo = customerOrderApi.queryById(orderId); CustomerOrderDTO orderInfo = customerOrderApi.queryById(orderId);
String message = String.format(orderStatus.getText(), event.getCopyWriter().toArray(new String[0])); String message = orderStatus.getText();
if (CommonUtil.isNotEmpty(event.getCopyWriter())) {
message = String.format(orderStatus.getText(), event.getCopyWriter().toArray(new String[0]));
}
CustomerOrderRecordSaveReqVO saveReqVO = new CustomerOrderRecordSaveReqVO(); CustomerOrderRecordSaveReqVO saveReqVO = new CustomerOrderRecordSaveReqVO();
saveReqVO.setCustomerId(orderInfo.getCustomerId()); saveReqVO.setCustomerId(orderInfo.getCustomerId());
...@@ -150,5 +153,7 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic ...@@ -150,5 +153,7 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic
saveReqVO.setSupplierId(event.getSupplierId()); saveReqVO.setSupplierId(event.getSupplierId());
saveReqVO.setMessageInfo(message); saveReqVO.setMessageInfo(message);
this.createCustomerOrderRecord(saveReqVO); this.createCustomerOrderRecord(saveReqVO);
customerOrderApi.updateOrderStatus(orderId, orderStatus);
} }
} }
\ No newline at end of file
...@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.Async; ...@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.Async;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* 商品 SPU Service 接口 * 商品 SPU Service 接口
...@@ -151,4 +152,10 @@ public interface ProductSpuService { ...@@ -151,4 +152,10 @@ public interface ProductSpuService {
void updateBrowseCount(Long id, int incrCount); void updateBrowseCount(Long id, int incrCount);
void audit(AuditCommonReqVO auditReqVO); void audit(AuditCommonReqVO auditReqVO);
default Map<Long, ProductSpuDO> getProductVOMap(Set<Long> longs) {
return this.getSpuMap(longs);
}
List<ProductSpuDO> validProductList(Set<Long> ids);
} }
...@@ -141,6 +141,25 @@ public class ProductSpuServiceImpl implements ProductSpuService { ...@@ -141,6 +141,25 @@ public class ProductSpuServiceImpl implements ProductSpuService {
} }
@Override @Override
public List<ProductSpuDO> validProductList(Set<Long> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
List<ProductSpuDO> list = productSpuMapper.selectByIds(ids);
Map<Long, ProductSpuDO> productMap = convertMap(list, ProductSpuDO::getId);
for (Long id : ids) {
ProductSpuDO product = productMap.get(id);
if (productMap.get(id) == null) {
throw exception(SPU_NOT_EXISTS);
}
if (CommonStatusEnum.isDisable(product.getStatus())) {
throw exception(SPU_NOT_ENABLE, product.getName());
}
}
return list;
}
@Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteSpu(Long id) { public void deleteSpu(Long id) {
// 校验存在 // 校验存在
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment