
package com.tmerclub.cloud.order.service;

import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.dto.OrderVirtualInfoDTO;
import com.tmerclub.cloud.common.order.vo.OrderVirtualInfoVO;
import com.tmerclub.cloud.order.bo.OrderVirtualInfoLogBO;
import com.tmerclub.cloud.order.model.Order;
import com.tmerclub.cloud.order.model.OrderVirtualInfo;
import com.tmerclub.cloud.order.vo.OrderShopVO;
import com.tmerclub.cloud.order.vo.OrderVirtualInfoLogVO;

import java.util.Date;
import java.util.List;

/**
 * 订单虚拟商品信息
 *
 * @author tmerclub
 * @date 2023-02-24 13:55:55
 */
public interface OrderVirtualInfoService {

    /**
     * 分页获取订单虚拟商品信息列表
     * @param pageDTO 分页参数
     * @return 订单虚拟商品信息列表分页数据
     */
    PageVO<OrderVirtualInfo> page(PageDTO pageDTO);

    /**
     * 根据订单虚拟商品信息id获取订单虚拟商品信息
     *
     * @param id 订单虚拟商品信息id
     * @return 订单虚拟商品信息
     */
    OrderVirtualInfo getById(Long id);

    /**
     * 保存订单虚拟商品信息
     * @param orderVirtualInfo 订单虚拟商品信息
     */
    void save(OrderVirtualInfo orderVirtualInfo);

    /**
     * 更新订单虚拟商品信息
     * @param orderVirtualInfo 订单虚拟商品信息
     */
    void update(OrderVirtualInfoVO orderVirtualInfo);

    /**
     * 根据订单虚拟商品信息id删除订单虚拟商品信息
     * @param id 订单虚拟商品信息id
     */
    void deleteById(Long id);

    /**
     * 批量保存虚拟订单信息
     * @param orderVirtualInfoList
     */
    void saveBatch(List<OrderVirtualInfo> orderVirtualInfoList);

    /**
     * 获取虚拟订单卡券信息
     * @param order
     * @param orderShopVO
     * @param stationId
     */
    void handlerVirtualProdOrder(Order order, OrderShopVO orderShopVO, Long stationId);

    /**
     * 根据订单id和自提点id获取虚拟订单
     * @param orderId
     * @param stationId
     * @return
     */
    List<OrderVirtualInfoVO> getByOrderIdAndStationId(Long orderId, Long stationId);

    /**
     * 根据订单id和店铺id获取虚拟订单
     * @param orderId
     * @param shopId
     * @param isWriteOff 1.已核销 0.未核销
     * @return
     */
    List<OrderVirtualInfoVO> getByOrderIdAndShopId(Long orderId, Long shopId, Integer isWriteOff);

    /**
     * 用户卡券订单核销操作
     * @param orderVirtualInfoDTO 订单核销信息
     * @param order 订单信息
     * @param stationId 门店id
     */
    void orderWriteOffByOrderId(OrderVirtualInfoDTO orderVirtualInfoDTO, Order order, Long stationId);

    /**
     * 根据订单id和核销码获取虚拟订单
     * @param orderId
     * @param code
     * @return
     */
    List<OrderVirtualInfoVO> getByOrderIdAndCode(Long orderId, String code);

    /**
     * 根据订单id获取核销数量
     * @param orderId
     * @return
     */
    int countWriteOffByOrderId(Long orderId);

    /**
     * 根据订单号获取核销记录
     * @param orderId
     * @return
     */
    OrderVirtualInfoLogVO getByOrderId(Long orderId);

    /**
     * 根据核销码获取核销记录
     * @param writeOffCode
     * @return
     */
    List<OrderVirtualInfoLogBO> getByWriteOffCode(String writeOffCode);

    /**
     * 批量修改
     *
     * @param updateVirtualInfos
     * @param userId
     * @param date
     */
    void updateBatchByItemIds(List<OrderVirtualInfoVO> updateVirtualInfos, Long userId, Date date);

}
