Commit d063674b by 杨浩

供应商结算价

parent d97ee663
......@@ -6,9 +6,12 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.function.Function;
import static cn.iocoder.foodnexus.framework.common.exception.util.ServiceExceptionUtil.exception;
/**
* 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能
*
......@@ -102,4 +105,27 @@ public class NumberUtils {
}
return result;
}
// 计算下浮后价格的方法 - 仅对最终结果进行四舍五入
public static Integer calculateFloatingPrice(Integer marketPrice, BigDecimal floatingRate) {
// 检查市场价是否为null或负数
if (marketPrice == null) {
return null;
}
// 如果下浮率为null,默认为0%
BigDecimal rate = (floatingRate == null) ? BigDecimal.ZERO : floatingRate;
// 计算下浮后价格:市场价 × (1 - 下浮率 ÷ 100)
BigDecimal marketPriceBig = new BigDecimal(marketPrice);
// 计算比例时保持高精度,不进行四舍五入
BigDecimal multiplier = BigDecimal.ONE.subtract(rate.divide(new BigDecimal(100), 10, RoundingMode.HALF_UP));
// 计算中间结果时保持高精度
BigDecimal intermediateResult = marketPriceBig.multiply(multiplier);
// 仅在转换为最终结果时进行四舍五入,确保是整数
BigDecimal finalResult = intermediateResult.setScale(0, RoundingMode.HALF_UP);
// 转换为整数并赋值
return finalResult.intValue();
}
}
......@@ -4,6 +4,7 @@ import cn.iocoder.foodnexus.module.erp.api.vo.supplier.SupplierAddReqVO;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
......@@ -26,4 +27,6 @@ public interface ErpSupplierApi {
Map<Long, String> queryNameMapByIds(Collection<Long> list);
String queryNameById(Long supplierId);
BigDecimal querySettlementFloatingRate(Long supplierId);
}
......@@ -157,4 +157,7 @@ public class SupplierAddReqVO {
*/
private String files;
@NotNull(message = "供应商结算下浮率不能为空")
private BigDecimal settlementFloatingRate;
}
......@@ -69,4 +69,10 @@ public class SupplierMonthOrderDetailsExportVO {
@ExcelProperty("退款金额(元)")
private BigDecimal returnsTotalYuan;
@Schema(description = "供应商结算金额(分)")
private Integer settlementPrice;
@ExcelProperty("供应商结算金额(元)")
private BigDecimal settlementPriceYuan;
}
......@@ -34,6 +34,9 @@ public class SupplierMonthOrderDetailsRespVO extends ErpPurchaseOrderRespVO {
@Schema(description = "应对账总金额(分)")
private Integer payablePrice;
@Schema(description = "供应商结算金额(分)")
private Integer settlementPrice;
@Schema(description = "签收金额")
private Integer signedTotal;
......
......@@ -43,6 +43,13 @@ public class SupplierMonthOrderExportVO {
@ExcelProperty("应对账总金额(元)")
private BigDecimal payablePriceYuan;
@Schema(description = "供应商结算金额(分)")
private Integer settlementPrice;
@ExcelProperty("供应商结算金额(元)")
private BigDecimal settlementPriceYuan;
@Schema(description = "状态(是否对账)")
private Boolean status;
......
......@@ -3,6 +3,8 @@ package cn.iocoder.foodnexus.module.erp.controller.admin.purchase.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* @author : yanghao
* create at: 2025/10/11 10:33
......@@ -29,6 +31,14 @@ public class SupplierMonthOrderRespVO {
@Schema(description = "应对账总金额(分)")
private Integer payablePrice;
@Schema(description = "供应商结算金额(分)")
private Integer settlementPrice;
/**
* 供应商结算下浮率(%)
*/
private BigDecimal settlementFloatingRate;
@Schema(description = "状态(是否对账)")
private Boolean status;
......
......@@ -138,4 +138,7 @@ public class ErpSupplierRespVO {
* 关联部门id
*/
private Long systemDeptId;
@Schema(description = "供应商结算下浮率(%)")
private BigDecimal settlementFloatingRate;
}
......@@ -110,4 +110,8 @@ public class ErpSupplierSaveReqVO {
private Long systemDeptId;
@Schema(description = "供应商结算下浮率(%)")
@NotNull(message = "供应商结算下浮率不能为空")
private BigDecimal settlementFloatingRate;
}
\ No newline at end of file
......@@ -182,4 +182,9 @@ public class ErpSupplierDO extends BaseDO {
*/
private Integer auditScore;
/**
* 供应商结算下浮率(%)
*/
private BigDecimal settlementFloatingRate;
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package cn.iocoder.foodnexus.module.erp.dal.mysql.purchase;
import cn.iocoder.foodnexus.framework.common.pojo.PageResult;
import cn.iocoder.foodnexus.framework.common.util.CommonUtil;
import cn.iocoder.foodnexus.framework.common.util.number.NumberUtils;
import cn.iocoder.foodnexus.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.foodnexus.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
......@@ -163,7 +164,7 @@ public interface ErpPurchaseOrderMapper extends BaseMapperX<ErpPurchaseOrderDO>
default PageResult<SupplierMonthOrderRespVO> pageMonth(SupplierMonthOrderPageReqVO pageReqVO, Long supplierId) {
MPJQueryWrapper<ErpPurchaseOrderDO> wrapper = new MPJQueryWrapper<>();
wrapper.select("t.supplier_id");
wrapper.select("t.supplier_id, es.settlement_floating_rate");
wrapper.select("es.name as 'supplier_name'");
wrapper.select("DATE_FORMAT( t.create_time, '%Y-%m' ) AS 'month'");
wrapper.select("count( t.id ) AS 'orderCount'");
......@@ -185,8 +186,10 @@ public interface ErpPurchaseOrderMapper extends BaseMapperX<ErpPurchaseOrderDO>
wrapper.orderByDesc("t.id");
wrapper.groupBy("DATE_FORMAT( t.create_time, '%Y-%m' ), t.supplier_id");
PageResult<SupplierMonthOrderRespVO> supplierMonthOrderRespVOPageResult = this.selectJoinPage(pageReqVO, SupplierMonthOrderRespVO.class, wrapper);
supplierMonthOrderRespVOPageResult.getList().forEach(item -> {
item.setPayablePrice(this.queryMonthPayablePrice(item.getSupplierId(), item.getMonth()));
item.setSettlementPrice(NumberUtils.calculateFloatingPrice(item.getPayablePrice(), item.getSettlementFloatingRate()));
});
return supplierMonthOrderRespVOPageResult;
}
......
......@@ -33,6 +33,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
......@@ -243,4 +244,9 @@ public class ErpSupplierServiceImpl implements ErpSupplierService, ErpSupplierAp
public String queryNameById(Long supplierId) {
return Optional.ofNullable(supplierMapper.selectById(supplierId)).map(ErpSupplierDO::getName).orElse("");
}
@Override
public BigDecimal querySettlementFloatingRate(Long supplierId) {
return Optional.ofNullable(supplierMapper.selectById(supplierId)).map(ErpSupplierDO::getSettlementFloatingRate).orElse(BigDecimal.ZERO);
}
}
......@@ -6,6 +6,7 @@ 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.number.MoneyUtils;
import cn.iocoder.foodnexus.framework.common.util.number.NumberUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
......@@ -57,6 +58,9 @@ public class OperaSupplierPurchaseOrderController {
@Autowired
private CustomerOrderService customerOrderService;
@Autowired
private ErpSupplierApi supplierApi;
@GetMapping("/page-month")
@Operation(summary = "分页获取月度账单")
public CommonResult<PageResult<SupplierMonthOrderRespVO>> pageMonth(SupplierMonthOrderPageReqVO pageReqVO) {
......@@ -93,6 +97,7 @@ public class OperaSupplierPurchaseOrderController {
BeanUtils.toBean(list, SupplierMonthOrderExportVO.class, item -> {
item.setOrderPriceYuan(MoneyUtils.fenToYuan(item.getOrderPrice()));
item.setPayablePriceYuan(MoneyUtils.fenToYuan(item.getPayablePrice()));
item.setSettlementPriceYuan(MoneyUtils.fenToYuan(item.getSettlementPrice()));
item.setStatusStr(CommonUtil.isNotEmpty(item.getStatus()) && item.getStatus() ? "已对账" : "未对账");
}));
}
......@@ -122,6 +127,7 @@ public class OperaSupplierPurchaseOrderController {
item.setPayablePriceYuan(MoneyUtils.fenToYuan(item.getPayablePrice()));
item.setSignedTotalYuan(MoneyUtils.fenToYuan(item.getSignedTotal()));
item.setReturnsTotalYuan(MoneyUtils.fenToYuan(item.getReturnsTotal()));
item.setSettlementPriceYuan(MoneyUtils.fenToYuan(item.getSettlementPrice()));
}));
}
......@@ -134,6 +140,7 @@ public class OperaSupplierPurchaseOrderController {
purchaseOrder.setSignedTotal(customerOrderItemDOS.stream().mapToInt(CustomerOrderItemDO::getSignedTotal).sum());
purchaseOrder.setReturnsTotal(customerOrderItemDOS.stream().mapToInt(CustomerOrderItemDO::getReturnsTotal).sum());
purchaseOrder.setPayablePrice(CommonUtil.getEls(purchaseOrder.getSignedTotal(), 0) - CommonUtil.getEls(purchaseOrder.getReturnsTotal(), 0));
purchaseOrder.setSettlementPrice(NumberUtils.calculateFloatingPrice(purchaseOrder.getPayablePrice(), supplierApi.querySettlementFloatingRate(purchaseOrder.getSupplierId())));
purchaseOrder.setSupplierName(customerOrderItemDOS.get(0).getSupplierName());
StringBuilder productNames = new StringBuilder();
......
......@@ -7,6 +7,7 @@ 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.number.MoneyUtils;
import cn.iocoder.foodnexus.framework.common.util.number.NumberUtils;
import cn.iocoder.foodnexus.framework.common.util.object.BeanUtils;
import cn.iocoder.foodnexus.framework.excel.core.util.ExcelUtils;
import cn.iocoder.foodnexus.module.erp.api.enums.ErpDeliveryStatus;
......@@ -30,6 +31,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
......@@ -82,7 +84,7 @@ public class SupplierPurchaseOrderController {
orderPageReqVo.setDeliveryStatusList(CommonUtil.asList(ErpDeliveryStatus.ARRIVAL.getStatus(), ErpDeliveryStatus.RECONCILIATION.getStatus()));
orderPageReqVo.setOrderStatusList(CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(), CustomerOrderStatus.FINISH.getKey(), CustomerOrderStatus.RETURN.getKey()));
PageResult<ErpPurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(orderPageReqVo);
return success(BeanUtils.toBean(pageResult, SupplierMonthOrderDetailsRespVO.class, this::transform));
return success(BeanUtils.toBean(pageResult, SupplierMonthOrderDetailsRespVO.class, item -> this.transform(item, supplierApi.querySettlementFloatingRate(orderPageReqVo.getSupplierId()))));
}
@PostMapping("reconciliation")
......@@ -101,7 +103,7 @@ public class SupplierPurchaseOrderController {
return success(Boolean.TRUE);
}
private void transform(SupplierMonthOrderDetailsRespVO purchaseOrder) {
private void transform(SupplierMonthOrderDetailsRespVO purchaseOrder, BigDecimal supplierSettlementRate) {
CustomerOrderDO customerOrder = customerOrderService.getCustomerOrder(purchaseOrder.getCustomerOrderId());
List<CustomerOrderItemDO> customerOrderItemDOS = customerOrderItemService.queryByOrderId(purchaseOrder.getCustomerOrderId(), purchaseOrder.getSupplierId());
purchaseOrder.setDeliveryMode(customerOrder.getDeliveryMode());
......@@ -110,6 +112,7 @@ public class SupplierPurchaseOrderController {
purchaseOrder.setSignedTotal(customerOrderItemDOS.stream().mapToInt(CustomerOrderItemDO::getSignedTotal).sum());
purchaseOrder.setReturnsTotal(customerOrderItemDOS.stream().mapToInt(CustomerOrderItemDO::getReturnsTotal).sum());
purchaseOrder.setPayablePrice(CommonUtil.getEls(purchaseOrder.getSignedTotal(), 0) - CommonUtil.getEls(purchaseOrder.getReturnsTotal(), 0));
purchaseOrder.setSettlementPrice(NumberUtils.calculateFloatingPrice(purchaseOrder.getPayablePrice(), supplierSettlementRate));
purchaseOrder.setSupplierName(customerOrderItemDOS.get(0).getSupplierName());
StringBuilder productNames = new StringBuilder();
......@@ -133,6 +136,7 @@ public class SupplierPurchaseOrderController {
BeanUtils.toBean(list, SupplierMonthOrderExportVO.class, item -> {
item.setOrderPriceYuan(MoneyUtils.fenToYuan(item.getOrderPrice()));
item.setPayablePriceYuan(MoneyUtils.fenToYuan(item.getPayablePrice()));
item.setSettlementPriceYuan(MoneyUtils.fenToYuan(item.getSettlementPrice()));
item.setStatusStr(CommonUtil.isNotEmpty(item.getStatus()) && item.getStatus() ? "已对账" : "未对账");
}));
}
......@@ -153,7 +157,8 @@ public class SupplierPurchaseOrderController {
orderPageReqVo.setDeliveryStatusList(CommonUtil.asList(ErpDeliveryStatus.ARRIVAL.getStatus(), ErpDeliveryStatus.RECONCILIATION.getStatus()));
orderPageReqVo.setOrderStatusList(CommonUtil.asList(CustomerOrderStatus.SIGN_RECEIPT.getKey(), CustomerOrderStatus.FINISH.getKey(), CustomerOrderStatus.RETURN.getKey()));
PageResult<ErpPurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPage(orderPageReqVo);
List<SupplierMonthOrderDetailsRespVO> list = BeanUtils.toBean(pageResult, SupplierMonthOrderDetailsRespVO.class, this::transform).getList();
List<SupplierMonthOrderDetailsRespVO> list = BeanUtils.toBean(pageResult, SupplierMonthOrderDetailsRespVO.class, item ->
this.transform(item, supplierApi.querySettlementFloatingRate(orderPageReqVo.getSupplierId()))).getList();
// 导出 Excel
ExcelUtils.write(response, "月度账单明细.xls", "数据", SupplierMonthOrderDetailsExportVO.class,
BeanUtils.toBean(list, SupplierMonthOrderDetailsExportVO.class, item -> {
......@@ -161,6 +166,7 @@ public class SupplierPurchaseOrderController {
item.setPayablePriceYuan(MoneyUtils.fenToYuan(item.getPayablePrice()));
item.setSignedTotalYuan(MoneyUtils.fenToYuan(item.getSignedTotal()));
item.setReturnsTotalYuan(MoneyUtils.fenToYuan(item.getReturnsTotal()));
item.setSettlementPriceYuan(MoneyUtils.fenToYuan(item.getSettlementPrice()));
}));
}
}
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