Commit 46cd642f by 杨浩

客户订单签收

parent 8dc06376
......@@ -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.ErpSupplierService;
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.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -53,7 +56,7 @@ public class ErpPurchaseInController {
@Resource
private ErpStockService stockService;
@Resource
private ErpProductService productService;
private ProductSpuService productService;
@Resource
private ErpSupplierService supplierService;
......@@ -103,14 +106,14 @@ public class ErpPurchaseInController {
return success(null);
}
List<ErpPurchaseInItemDO> purchaseInItemList = purchaseInService.getPurchaseInItemListByInId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getSpuMap(
convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId));
return success(BeanUtils.toBean(purchaseIn, ErpPurchaseInRespVO.class, purchaseInVO ->
purchaseInVO.setItems(BeanUtils.toBean(purchaseInItemList, ErpPurchaseInRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
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 {
convertSet(pageResult.getList(), ErpPurchaseInDO::getId));
Map<Long, List<ErpPurchaseInItemDO>> purchaseInItemMap = convertMultiMap(purchaseInItemList, ErpPurchaseInItemDO::getInId);
// 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getSpuMap(
convertSet(purchaseInItemList, ErpPurchaseInItemDO::getProductId));
// 1.3 供应商信息
Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
......@@ -155,7 +158,7 @@ public class ErpPurchaseInController {
return BeanUtils.toBean(pageResult, ErpPurchaseInRespVO.class, purchaseIn -> {
purchaseIn.setItems(BeanUtils.toBean(purchaseInItemMap.get(purchaseIn.getId()), ErpPurchaseInRespVO.Item.class,
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));
MapUtils.findAndThen(supplierMap, purchaseIn.getSupplierId(), supplier -> purchaseIn.setSupplierName(supplier.getName()));
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;
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.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.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -27,6 +29,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -53,6 +56,8 @@ public class ErpPurchaseOrderController {
private ErpStockService stockService;
@Resource
private ErpSupplierService supplierService;
@Autowired
private ProductSpuService productService;
@Resource
private AdminUserApi adminUserApi;
......@@ -100,14 +105,14 @@ public class ErpPurchaseOrderController {
return success(null);
}
List<ErpPurchaseOrderItemDO> purchaseOrderItemList = purchaseOrderService.getPurchaseOrderItemListByOrderId(id);
/*Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));*/
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
return success(BeanUtils.toBean(purchaseOrder, ErpPurchaseOrderRespVO.class, purchaseOrderVO ->
purchaseOrderVO.setItems(BeanUtils.toBean(purchaseOrderItemList, ErpPurchaseOrderRespVO.Item.class, item -> {
BigDecimal purchaseCount = stockService.getStockCount(item.getProductId());
item.setStockCount(purchaseCount != null ? purchaseCount : BigDecimal.ZERO);
/*MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductBarCode(product.getBarCode()).setProductUnitName(product.getUnitName()));*/
MapUtils.findAndThen(productMap, item.getProductId(), product -> item.setProductName(product.getName())
.setProductUnitName(product.getUnitName()));
}))));
}
......@@ -140,8 +145,8 @@ public class ErpPurchaseOrderController {
convertSet(pageResult.getList(), ErpPurchaseOrderDO::getId));
Map<Long, List<ErpPurchaseOrderItemDO>> purchaseOrderItemMap = convertMultiMap(purchaseOrderItemList, ErpPurchaseOrderItemDO::getOrderId);
// 1.2 产品信息
/*Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));*/
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(purchaseOrderItemList, ErpPurchaseOrderItemDO::getProductId));
// 1.3 供应商信息
Map<Long, ErpSupplierDO> supplierMap = supplierService.getSupplierMap(
convertSet(pageResult.getList(), ErpPurchaseOrderDO::getSupplierId));
......@@ -151,9 +156,9 @@ public class ErpPurchaseOrderController {
// 2. 开始拼接
return BeanUtils.toBean(pageResult, ErpPurchaseOrderRespVO.class, purchaseOrder -> {
purchaseOrder.setItems(BeanUtils.toBean(purchaseOrderItemMap.get(purchaseOrder.getId()), ErpPurchaseOrderRespVO.Item.class
/*,
,
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));
MapUtils.findAndThen(supplierMap, purchaseOrder.getSupplierId(), supplier -> purchaseOrder.setSupplierName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(purchaseOrder.getCreator()), user -> purchaseOrder.setCreatorName(user.getNickname()));
......
......@@ -94,12 +94,6 @@ public class ErpPurchaseInRespVO {
@ExcelProperty("产品信息")
private String productNames;
@Schema(description = "销售订单")
private Long saleOrderId;
@Schema(description = "销售子订单")
private Long saleOrderItemId;
@Data
public static class Item {
......
......@@ -37,12 +37,6 @@ public class ErpPurchaseInSaveReqVO {
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "销售订单")
private Long saleOrderId;
@Schema(description = "销售子订单")
private Long saleOrderItemId;
@Schema(description = "入库清单列表")
private List<Item> items;
......
......@@ -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.ErpSaleOrderService;
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.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -52,7 +54,7 @@ public class ErpSaleOrderController {
@Resource
private ErpStockService stockService;
@Resource
private ErpProductService productService;
private ProductSpuService productService;
@Resource
private ErpCustomerService customerService;
......@@ -120,14 +122,14 @@ public class ErpSaleOrderController {
return success(null);
}
List<ErpSaleOrderItemDO> saleOrderItemList = saleOrderService.getSaleOrderItemListByOrderId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
return success(BeanUtils.toBean(saleOrder, ErpSaleOrderRespVO.class, saleOrderVO ->
saleOrderVO.setItems(BeanUtils.toBean(saleOrderItemList, ErpSaleOrderRespVO.Item.class, item -> {
BigDecimal stockCount = stockService.getStockCount(item.getProductId());
item.setStockCount(stockCount != null ? stockCount : BigDecimal.ZERO);
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 {
convertSet(pageResult.getList(), ErpSaleOrderDO::getId));
Map<Long, List<ErpSaleOrderItemDO>> saleOrderItemMap = convertMultiMap(saleOrderItemList, ErpSaleOrderItemDO::getOrderId);
// 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOrderItemList, ErpSaleOrderItemDO::getProductId));
// 1.3 客户信息
Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap(
......@@ -172,7 +174,7 @@ public class ErpSaleOrderController {
return BeanUtils.toBean(pageResult, ErpSaleOrderRespVO.class, saleOrder -> {
saleOrder.setItems(BeanUtils.toBean(saleOrderItemMap.get(saleOrder.getId()), ErpSaleOrderRespVO.Item.class,
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));
MapUtils.findAndThen(customerMap, saleOrder.getCustomerId(), supplier -> saleOrder.setCustomerName(supplier.getName()));
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;
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.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.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -53,7 +55,7 @@ public class ErpSaleOutController {
@Resource
private ErpStockService stockService;
@Resource
private ErpProductService productService;
private ProductSpuService productService;
@Resource
private ErpCustomerService customerService;
......@@ -103,14 +105,14 @@ public class ErpSaleOutController {
return success(null);
}
List<ErpSaleOutItemDO> saleOutItemList = saleOutService.getSaleOutItemListByOutId(id);
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId));
return success(BeanUtils.toBean(saleOut, ErpSaleOutRespVO.class, saleOutVO ->
saleOutVO.setItems(BeanUtils.toBean(saleOutItemList, ErpSaleOutRespVO.Item.class, item -> {
ErpStockDO stock = stockService.getStock(item.getProductId(), item.getWarehouseId());
item.setStockCount(stock != null ? stock.getCount() : BigDecimal.ZERO);
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 {
convertSet(pageResult.getList(), ErpSaleOutDO::getId));
Map<Long, List<ErpSaleOutItemDO>> saleOutItemMap = convertMultiMap(saleOutItemList, ErpSaleOutItemDO::getOutId);
// 1.2 产品信息
Map<Long, ErpProductRespVO> productMap = productService.getProductVOMap(
Map<Long, ProductSpuDO> productMap = productService.getProductVOMap(
convertSet(saleOutItemList, ErpSaleOutItemDO::getProductId));
// 1.3 客户信息
Map<Long, ErpCustomerDO> customerMap = customerService.getCustomerMap(
......@@ -155,7 +157,7 @@ public class ErpSaleOutController {
return BeanUtils.toBean(pageResult, ErpSaleOutRespVO.class, saleOut -> {
saleOut.setItems(BeanUtils.toBean(saleOutItemMap.get(saleOut.getId()), ErpSaleOutRespVO.Item.class,
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));
MapUtils.findAndThen(customerMap, saleOut.getCustomerId(), supplier -> saleOut.setCustomerName(supplier.getName()));
MapUtils.findAndThen(userMap, Long.parseLong(saleOut.getCreator()), user -> saleOut.setCreatorName(user.getNickname()));
......
......@@ -51,10 +51,10 @@ public class ErpSaleOrderRespVO {
@Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663")
@ExcelProperty("合计数量")
private BigDecimal totalCount;
private Integer totalCount;
@Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906")
@ExcelProperty("最终合计价格")
private BigDecimal totalPrice;
private Integer totalPrice;
@Schema(description = "合计产品价格,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127")
private BigDecimal totalProductPrice;
......@@ -140,11 +140,11 @@ public class ErpSaleOrderRespVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
private BigDecimal count;
private Integer count;
@Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent;
......
......@@ -84,11 +84,11 @@ public class ErpSaleOrderSaveReqVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
private BigDecimal count;
private Integer count;
@Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent;
......
......@@ -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.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 jakarta.validation.constraints.NotNull;
import lombok.Data;
......@@ -51,10 +55,10 @@ public class ErpSaleOutRespVO {
@Schema(description = "合计数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15663")
@ExcelProperty("合计数量")
private BigDecimal totalCount;
private Integer count;
@Schema(description = "最终合计价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "24906")
@ExcelProperty("最终合计价格")
private BigDecimal totalPrice;
private Integer totalPrice;
@Schema(description = "已收款金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "7127")
private BigDecimal receiptPrice;
......@@ -97,6 +101,25 @@ public class ErpSaleOutRespVO {
@ExcelProperty("产品信息")
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
public static class Item {
......@@ -116,7 +139,7 @@ public class ErpSaleOutRespVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
......
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 jakarta.validation.constraints.NotNull;
import lombok.Data;
......@@ -44,6 +48,25 @@ public class ErpSaleOutSaveReqVO {
@Schema(description = "出库清单列表")
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
public static class Item {
......@@ -67,11 +90,11 @@ public class ErpSaleOutSaveReqVO {
private String productUnit;
@Schema(description = "产品单价", example = "100.00")
private BigDecimal productPrice;
private Integer productPrice;
@Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
@NotNull(message = "产品数量不能为空")
private BigDecimal count;
private Integer count;
@Schema(description = "税率,百分比", example = "99.88")
private BigDecimal taxPercent;
......
......@@ -80,7 +80,7 @@ public class ErpPurchaseInDO extends BaseDO {
*
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/
private BigDecimal totalPrice;
private Integer totalPrice;
/**
* 已支付金额,单位:元
*
......@@ -91,7 +91,7 @@ public class ErpPurchaseInDO extends BaseDO {
/**
* 合计产品价格,单位:元
*/
private BigDecimal totalProductPrice;
private Integer totalProductPrice;
/**
* 合计税额,单位:元
*/
......@@ -120,14 +120,4 @@ public class ErpPurchaseInDO extends BaseDO {
*/
private String remark;
/**
* 销售订单
*/
private Long saleOrderId;
/**
* 销售子订单
*/
private Long saleOrderItemId;
}
\ No newline at end of file
......@@ -75,7 +75,7 @@ public class ErpPurchaseInItemDO extends BaseDO {
*
* totalPrice = productPrice * count
*/
private BigDecimal totalPrice;
private Integer totalPrice;
/**
* 税率,百分比
*/
......
......@@ -72,18 +72,18 @@ public class ErpSaleOrderDO extends BaseDO {
/**
* 合计数量
*/
private BigDecimal totalCount;
private Integer totalCount;
/**
* 最终合计价格,单位:元
*
* 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 {
/**
* 产品单位单价,单位:元
*/
private BigDecimal productPrice;
private Integer productPrice;
/**
* 数量
*/
private BigDecimal count;
private Integer count;
/**
* 总价,单位:元
*
* totalPrice = productPrice * count
*/
private BigDecimal totalPrice;
private Integer totalPrice;
/**
* 税率,百分比
*/
......
......@@ -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.module.erp.api.enums.ErpAuditStatus;
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.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.math.BigDecimal;
......@@ -16,7 +20,7 @@ import java.time.LocalDateTime;
*
* @author 芋道源码
*/
@TableName(value = "erp_sale_out")
@TableName(value = "erp_sale_out", autoResultMap = true)
@KeySequence("erp_sale_out_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
......@@ -80,13 +84,13 @@ public class ErpSaleOutDO extends BaseDO {
/**
* 合计数量
*/
private BigDecimal totalCount;
private Integer totalCount;
/**
* 最终合计价格,单位:元
*
* totalPrice = totalProductPrice + totalTaxPrice - discountPrice + otherPrice
*/
private BigDecimal totalPrice;
private Integer totalPrice;
/**
* 已收款金额,单位:元
*
......@@ -97,7 +101,7 @@ public class ErpSaleOutDO extends BaseDO {
/**
* 合计产品价格,单位:元
*/
private BigDecimal totalProductPrice;
private Integer totalProductPrice;
/**
* 合计税额,单位:元
*/
......@@ -126,4 +130,38 @@ public class ErpSaleOutDO extends BaseDO {
*/
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;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpStockOutDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.stock.ErpWarehouseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
import java.math.BigDecimal;
import java.util.List;
/**
* ERP 销售出库项 DO
*
* @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 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
......@@ -58,25 +61,23 @@ public class ErpSaleOutItemDO extends BaseDO {
private Long productId;
/**
* 产品单位单位
*
* 冗余 {@link ErpProductDO#getUnitId()}
*/
private String productUnit;
/**
* 产品单位单价,单位:
* 产品单位单价,单位:
*/
private BigDecimal productPrice;
private Integer productPrice;
/**
* 数量
*/
private BigDecimal count;
private Integer count;
/**
* 总价,单位:
* 总价,单位:
*
* totalPrice = productPrice * count
*/
private BigDecimal totalPrice;
private Integer totalPrice;
/**
* 税率,百分比
*/
......@@ -93,4 +94,10 @@ public class ErpSaleOutItemDO extends BaseDO {
*/
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> {
ALREADY("ALREADY", "已发货"),
ARRIVAL("ARRIVAL", "已到货"),
;
public static final String[] ARRAYS = Arrays.stream(values()).map(SaleOrderPickUpStatus::getType).toArray(String[]::new);
......
......@@ -163,7 +163,7 @@ public class ErpFinancePaymentServiceImpl implements ErpFinancePaymentService {
if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.PURCHASE_IN.getType())) {
ErpPurchaseInDO purchaseIn = purchaseInService.validatePurchaseIn(item.getBizId());
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())) {
ErpPurchaseReturnDO purchaseReturn = purchaseReturnService.validatePurchaseReturn(item.getBizId());
Assert.equals(purchaseReturn.getSupplierId(), supplierId, "供应商必须相同");
......
......@@ -163,7 +163,7 @@ public class ErpFinanceReceiptServiceImpl implements ErpFinanceReceiptService {
if (ObjectUtil.equal(item.getBizType(), ErpBizTypeEnum.SALE_OUT.getType())) {
ErpSaleOutDO saleOut = saleOutService.validateSaleOut(item.getBizId());
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())) {
ErpSaleReturnDO saleReturn = saleReturnService.validateSaleReturn(item.getBizId());
Assert.equals(saleReturn.getCustomerId(), customerId, "客户必须相同");
......
......@@ -3,6 +3,7 @@ package cn.iocoder.foodnexus.module.erp.service.purchase;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
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.object.BeanUtils;
import cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.in.ErpPurchaseInPageReqVO;
......@@ -57,8 +58,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private ErpNoRedisDAO noRedisDAO;
@Resource
private ErpProductService productService;
@Resource
@Lazy // 延迟加载,避免循环依赖
private ErpPurchaseOrderService purchaseOrderService;
@Resource
......@@ -66,8 +65,6 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
@Resource
private ErpStockRecordService stockRecordService;
@Resource
private AdminUserApi adminUserApi;
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -77,7 +74,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
// 1.2 校验入库项的有效性
List<ErpPurchaseInItemDO> purchaseInItems = validatePurchaseInItems(createReqVO.getItems());
// 1.3 校验结算账户
accountService.validateAccount(createReqVO.getAccountId());
if (CommonUtil.isNotEmpty(createReqVO.getAccountId())) {
accountService.validateAccount(createReqVO.getAccountId());
}
// 1.4 生成入库单号,并校验唯一性
String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_IN_NO_PREFIX);
if (purchaseInMapper.selectByNo(no) != null) {
......@@ -132,15 +131,15 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private void calculateTotalPrice(ErpPurchaseInDO purchaseIn, List<ErpPurchaseInItemDO> purchaseInItems) {
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.setTotalPrice(purchaseIn.getTotalProductPrice().add(purchaseIn.getTotalTaxPrice()));
purchaseIn.setTotalPrice(purchaseIn.getTotalProductPrice());
// 计算优惠价格
if (purchaseIn.getDiscountPercent() == null) {
purchaseIn.setDiscountPercent(BigDecimal.ZERO);
}
purchaseIn.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseIn.getTotalPrice(), purchaseIn.getDiscountPercent()));
purchaseIn.setTotalPrice(purchaseIn.getTotalPrice().subtract(purchaseIn.getDiscountPrice()).add(purchaseIn.getOtherPrice()));
// purchaseIn.setDiscountPrice(MoneyUtils.priceMultiplyPercent(purchaseIn.getTotalPrice(), purchaseIn.getDiscountPercent()));
purchaseIn.setTotalPrice(purchaseIn.getTotalPrice()/*.subtract(purchaseIn.getDiscountPrice()).add(purchaseIn.getOtherPrice())*/);
}
private void updatePurchaseOrderInCount(Long orderId) {
......@@ -193,7 +192,7 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
if (purchaseIn.getPaymentPrice().equals(paymentPrice)) {
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());
}
purchaseInMapper.updateById(new ErpPurchaseInDO().setId(id).setPaymentPrice(paymentPrice));
......@@ -201,19 +200,19 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
private List<ErpPurchaseInItemDO> validatePurchaseInItems(List<ErpPurchaseInSaveReqVO.Item> list) {
// 1. 校验产品存在
List<ErpProductDO> productList = productService.validProductList(
/*List<ErpProductDO> productList = productService.validProductList(
convertSet(list, ErpPurchaseInSaveReqVO.Item::getProductId));
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);
Map<Long, ErpProductDO> productMap = convertMap(productList, ErpProductDO::getId);*/
// 2. 转化为 ErpPurchaseInItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpPurchaseInItemDO.class, item -> {
// 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) {
return;
}
if (item.getTaxPercent() != null) {
/*if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
}
}*/
}));
}
......
......@@ -346,7 +346,6 @@ public class ErpPurchaseOrderServiceImpl implements ErpPurchaseOrderService {
}
if (!customerOrderSet.contains(item.getCustomerOrderId())) {
customerOrderApi.updateOrderStatus(item.getCustomerOrderId(), updateOrderStatus);
// 添加订单进度记录
CustomerOrderRecordEvent event = new CustomerOrderRecordEvent();
event.setOrderStatus(updateOrderStatus);
......
......@@ -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.dal.dataobject.sale.ErpSaleOrderDO;
import cn.iocoder.foodnexus.module.erp.dal.dataobject.sale.ErpSaleOrderItemDO;
import cn.iocoder.foodnexus.module.order.dto.DeliveryOrderUpdateReqVO;
import jakarta.validation.Valid;
import java.math.BigDecimal;
......@@ -123,7 +124,13 @@ public interface ErpSaleOrderService {
/**
* 配送
* @param id
*/
void delivery(Long id, Long deliveryStaffId);
/**
* 到货
* @param id
* @param deliveryStaffId
*/
void arrival(DeliveryOrderUpdateReqVO reqVO, Long deliveryStaffId);
}
\ No newline at end of file
......@@ -99,4 +99,5 @@ public interface ErpSaleOutService {
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 {
}
private void calculateTotalPrice(ErpSaleOutDO saleOut, List<ErpSaleOutItemDO> saleOutItems) {
saleOut.setTotalCount(getSumValue(saleOutItems, ErpSaleOutItemDO::getCount, BigDecimal::add));
saleOut.setTotalProductPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTotalPrice, BigDecimal::add, BigDecimal.ZERO));
saleOut.setTotalCount(getSumValue(saleOutItems, ErpSaleOutItemDO::getCount, Integer::sum));
saleOut.setTotalProductPrice(getSumValue(saleOutItems, ErpSaleOutItemDO::getTotalPrice, Integer::sum, 0));
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) {
saleOut.setDiscountPercent(BigDecimal.ZERO);
}
saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent()));
saleOut.setTotalPrice(saleOut.getTotalPrice().subtract(saleOut.getDiscountPrice().add(saleOut.getOtherPrice())));
// saleOut.setDiscountPrice(MoneyUtils.priceMultiplyPercent(saleOut.getTotalPrice(), saleOut.getDiscountPercent()));
saleOut.setTotalPrice(saleOut.getTotalPrice()/* - (saleOut.getDiscountPrice().add(saleOut.getOtherPrice()))*/);
}
private void updateSaleOrderOutCount(Long orderId) {
......@@ -190,9 +190,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
Integer bizType = approve ? ErpStockRecordBizTypeEnum.SALE_OUT.getType()
: ErpStockRecordBizTypeEnum.SALE_OUT_CANCEL.getType();
saleOutItems.forEach(saleOutItem -> {
BigDecimal count = approve ? saleOutItem.getCount().negate() : saleOutItem.getCount();
Integer count = approve ? - saleOutItem.getCount() : saleOutItem.getCount();
stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO(
saleOutItem.getProductId(), saleOutItem.getWarehouseId(), count,
saleOutItem.getProductId(), saleOutItem.getWarehouseId(), BigDecimal.valueOf(count),
bizType, saleOutItem.getOutId(), saleOutItem.getId(), saleOut.getNo()));
});
}
......@@ -203,7 +203,7 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
if (saleOut.getReceiptPrice().equals(receiptPrice)) {
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());
}
saleOutMapper.updateById(new ErpSaleOutDO().setId(id).setReceiptPrice(receiptPrice));
......@@ -215,13 +215,10 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
// 2. 转化为 ErpSaleOutItemDO 列表
return convertList(list, o -> BeanUtils.toBean(o, ErpSaleOutItemDO.class, item -> {
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) {
return;
}
if (item.getTaxPercent() != null) {
item.setTaxPrice(MoneyUtils.priceMultiplyPercent(item.getTotalPrice(), item.getTaxPercent()));
}
}));
}
......@@ -313,4 +310,9 @@ public class ErpSaleOutServiceImpl implements ErpSaleOutService {
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;
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.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.service.dept.DeptService;
import cn.iocoder.foodnexus.module.system.service.user.AdminUserService;
......@@ -158,4 +159,9 @@ public class DeliveryStaffServiceImpl implements DeliveryStaffService, DeliveryS
return Optional.ofNullable(deliveryStaffMapper.selectOne(DeliveryStaffDO::getUserId, loginUserId))
.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;
import cn.iocoder.foodnexus.module.order.dto.DeliveryStaffSimpleInfo;
/**
* @author : yanghao
* create at: 2025/9/25 15:54
......@@ -10,4 +12,6 @@ public interface DeliveryStaffApi {
String queryNameByStaffId(Long staffId);
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> {
CANCEL("取消订单", "CANCEL", 9999) {
@Override
public String getText() {
return "";
return "客户取消订单";
}
},
......
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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
......@@ -69,4 +70,7 @@ public class CustomerOrderItemRespVO {
@ExcelProperty("签收总价,单位:分")
private Integer signedTotal;
@Schema(description = "订单备注")
private CustomerOrderRemark orderRemark;
}
\ No newline at end of file
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.pojo.CommonResult;
import cn.iocoder.foodnexus.framework.common.pojo.PageParam;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
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.CustomerOrderRecordMapVO;
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.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.service.customerorder.CustomerOrderService;
import cn.iocoder.foodnexus.module.order.service.customerorderrecord.CustomerOrderRecordService;
......@@ -23,18 +21,14 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.sql.rowset.serial.SerialException;
import java.io.IOException;
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;
@Tag(name = "APP - 客户总订单")
......@@ -48,6 +42,8 @@ public class AppCustomerOrderController {
private CustomerOrderService customerOrderService;
@Autowired
private CustomerOrderRecordService customerOrderRecordService;
@Autowired
private ErpSaleOutService saleOutService;
@PostMapping("/create")
@Operation(summary = "创建客户总订单")
......@@ -72,6 +68,13 @@ public class AppCustomerOrderController {
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")
@Operation(summary = "签收客户订单")
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
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.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.sale.ErpCustomerService;
import cn.iocoder.foodnexus.module.erp.service.sale.ErpSaleOrderService;
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.api.user.AdminUserApi;
import cn.iocoder.foodnexus.module.system.api.user.dto.AdminUserRespDTO;
......@@ -27,7 +27,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -69,11 +68,13 @@ public class DeliveryOrderController {
@Operation(summary = "获得销售订单分页")
public CommonResult<PageResult<ErpSaleOrderRespVO>> getSaleOrderPage(@Valid ErpSaleOrderPageReqVO pageReqVO) {
pageReqVO.setDeliveryStaffId(deliveryStaffApi.queryStaffIdByUserId(SecurityFrameworkUtils.getLoginUserId()));
pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP);
// pageReqVO.setPickUpStatus(SaleOrderPickUpStatus.PICK_UP);
PageResult<ErpSaleOrderDO> pageResult = saleOrderService.getSaleOrderPage(pageReqVO);
return success(buildSaleOrderVOPageResult(pageResult));
}
// TODO 配送单修改实际配送数量在哪一步?
// 配送订单,生成销售出库单
@PostMapping("/delivery")
@Operation(summary = "配送订单")
......@@ -83,8 +84,14 @@ public class DeliveryOrderController {
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) {
......
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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
......@@ -79,5 +80,10 @@ public class CustomerOrderItemDO extends BaseDO {
*/
private Integer signedTotal;
/**
* 订单备注
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private CustomerOrderRemark orderRemark;
}
\ No newline at end of file
......@@ -16,6 +16,8 @@ public interface ErrorCodeConstants {
ErrorCode CUSTOMER_ORDER_WAREHOUSE_NOEXISTS = new ErrorCode(1_019_100_002, "仓库不存在");
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_STATUS_ERROR = new ErrorCode(1_019_100_005, "客户订单状态异常");
ErrorCode CUSTOMER_ORDER_OUT_ERROR = new ErrorCode(1_019_100_006, "客户订单出库环节异常");
// ========== 客户订单-子订单 1_020_100_0001 ==========
ErrorCode CUSTOMER_ORDER_ITEM_NOT_EXISTS = new ErrorCode(1_020_100_001, "客户订单-子订单不存在");
......
......@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.order.service.customerorder;
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.AppCustomerOrderSaveReqVO;
import cn.iocoder.foodnexus.module.order.controller.app.customerOrder.vo.AppCustomerOrderSaveReqVO;
......@@ -87,4 +88,6 @@ public interface CustomerOrderService {
* @param 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;
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.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.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.service.inquiresupplierpush.InquireSupplierPushService;
import cn.iocoder.foodnexus.module.order.api.CustomerOrderApi;
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.AppCustomerOrderReceiptRespVO;
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.dto.CustomerAddressInfo;
......@@ -54,7 +58,6 @@ import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
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.util.collection.CollectionUtils.convertList;
import static cn.iocoder.foodnexus.module.order.enums.ErrorCodeConstants.*;
/**
......@@ -104,6 +107,10 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
private ProductSpuService productSpuService;
@Autowired
@Lazy
private ErpSaleOutService saleOutService;
@Autowired
private GenCodeUtils genCodeUtils;
@Override
......@@ -263,13 +270,24 @@ public class CustomerOrderServiceImpl implements CustomerOrderService, CustomerO
throw exception(CUSTOMER_ORDER_NOT_EXISTS);
}
// TODO ... 取消订单校验待定(订单状态)
CustomerOrderRemark orderRemark = BeanUtils.toBean(reqVO, CustomerOrderRemark.class, item -> {
item.setOperTime(LocalDateTime.now());
});
customerOrderMapper.update(Wrappers.<CustomerOrderDO>lambdaUpdate()
.set(CustomerOrderDO::getOrderRemark, orderRemark)
.eq(CustomerOrderDO::getId, reqVO.getId()));
CustomerOrderStatus orderStatus = customerOrder.getOrderStatus();
if (orderStatus.equals(CustomerOrderStatus.ORDER_SUCCESS) ||
orderStatus.equals(CustomerOrderStatus.ORDER_MATCH)) {
CustomerOrderRemark orderRemark = BeanUtils.toBean(reqVO, CustomerOrderRemark.class, item -> {
item.setOperTime(LocalDateTime.now());
});
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
@Override
public void receipt(AppCustomerOrderRemarkReqVO reqVO) {
// 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
CustomerOrderStatus orderStatus = event.getOrderStatus();
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();
saveReqVO.setCustomerId(orderInfo.getCustomerId());
......@@ -150,5 +153,7 @@ public class CustomerOrderRecordServiceImpl implements CustomerOrderRecordServic
saveReqVO.setSupplierId(event.getSupplierId());
saveReqVO.setMessageInfo(message);
this.createCustomerOrderRecord(saveReqVO);
customerOrderApi.updateOrderStatus(orderId, orderStatus);
}
}
\ No newline at end of file
......@@ -16,6 +16,7 @@ import org.springframework.scheduling.annotation.Async;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 商品 SPU Service 接口
......@@ -151,4 +152,10 @@ public interface ProductSpuService {
void updateBrowseCount(Long id, int incrCount);
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 {
}
@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)
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