
package cn.iocoder.yudao.module.order.service.orderSplit;

import cn.iocoder.yudao.module.order.dal.dataobject.orderItem.OrderItemDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderSplitItem.OrderSplitItemDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseIn.OrderWarehouseInDO;
import cn.iocoder.yudao.module.order.dto.OrderSplitWorthDto;
import cn.iocoder.yudao.module.order.vo.orderSplitItem.OrderSpiltItemSpecsRecordVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 订单拆单校验 Service 接口
 *
 * @author zhengYi
 */
public interface OrderSplitCheckService {


    /**
     * 拆单数据强一致性校验
     *
     * @param orderItemId    订单项ID
     * @param allNum         原订单项总入仓箱数
     * @param quantity       原订单项总入仓数量
     * @param weight         原订单项总入仓重量
     * @param volume         原订单项总入仓体积
     * @param chargeWeight   原订单项总收费重量
     * @param chargeVolume   原订单项总收费体积
     * @param chargeQuantity 原订单项总收费数量
     */
    void splitConsistencyCheck(OrderItemDO sourceOrderItemDO, Long orderItemId, int allNum, int quantity, BigDecimal weight,
                               BigDecimal volume, BigDecimal chargeWeight, BigDecimal chargeVolume,
                               BigDecimal chargeQuantity);


    /**
     * 拆单数据强一致性校验
     *
     * @param orderSplitItemDOList 同一品名拆单项列表
     * @param allNum               原订单项总入仓箱数
     * @param quantity             原订单项总入仓数量
     * @param weight               原订单项总入仓重量
     * @param volume               原订单项总入仓体积
     * @param chargeWeight         原订单项总收费重量
     * @param chargeVolume         原订单项总收费体积
     * @param chargeQuantity       原订单项总收费数量
     */
    void splitConsistencyCheck(List<OrderSplitItemDO> orderSplitItemDOList, int allNum, int quantity, BigDecimal weight,
                               BigDecimal volume, BigDecimal chargeWeight, BigDecimal chargeVolume,
                               BigDecimal chargeQuantity);

    /**
     * 拆单货值数据强一致性校验
     *
     * @param orderAllSplitItemDOList 整个订单的拆单项列表
     * @param worth                   原订单项总货值
     */
    void splitWorthConsistencyCheck(List<OrderSplitItemDO> orderAllSplitItemDOList, BigDecimal worth);

    /**
     * 校验入仓记录id
     *
     * @param specsRecordVOList 拆单入仓记录
     * @param warehouseInDOList 原单入仓记录
     */
    void checkWarehouseInId(List<OrderSpiltItemSpecsRecordVO> specsRecordVOList, List<OrderWarehouseInDO> warehouseInDOList);


    /**
     * 获取校验订单拆单整体剩余货值与剩余箱数的数据
     *
     * @param orderId 订单ID
     * @param orderSplitItemId 拆单项ID
     * @return 返回订单拆单货值整体箱数与货值比参数
     */
    OrderSplitWorthDto getCheckOrderWorthDtoByOrderId(Long orderId, Long orderSplitItemId);
}
