package com.fjhx.service;

import com.fjhx.base.BaseService;
import com.fjhx.entity.ApplyPurchase;

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

/**
 * <p>
 * 申购单 服务类
 * </p>
 *
 * @author ${author}
 * @since 2022-08-25
 */
public interface ApplyPurchaseService extends BaseService<ApplyPurchase> {

    /**
     * 添加申购单
     *
     * @param applyPurchase 申购对象
     */
    void add(ApplyPurchase applyPurchase);

    /**
     * 发起申购
     *
     * @param applyPurchaseList 申购列表
     * @param flowLinkNo        流程关联编号
     * @param code              申购单号
     */
    void initiateSubscription(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String code);

    /**
     * 发起申购（指定前缀自动生成申购单号）
     *
     * @param applyPurchaseList 申购列表
     * @param flowLinkNo        流程关联编号
     * @param codePrefix        编码前缀
     */
    void initiateSubscriptionAuto(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String codePrefix);

    /**
     * 发起申购（默认前缀自动生成申购单号）
     *
     * @param applyPurchaseList 申购列表
     * @param flowLinkNo        流程关联编号
     */
    void initiateSubscriptionAuto(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo);

    /**
     * 审批通过
     *
     * @param flowLinkNo 流程关联编号
     */
    void flowPass(Long flowLinkNo);

    /**
     * 审批不通过
     *
     * @param flowLinkNo 流程关联编号
     */
    void flowNotPass(Long flowLinkNo);

    /**
     * 发起采购订单审批
     *
     * @param applyPurchaseList 申购列表
     * @param orderId           订单id
     * @param orderCode         订单编码
     * @param supplierId        供应商id
     * @param accountPeriod     供应商账期/天
     */
    void flowOrder(List<ApplyPurchase> applyPurchaseList, Long orderId, String orderCode, Long supplierId, Integer accountPeriod);

    /**
     * 采购订单审批通过
     *
     * @param orderId 订单id
     */
    void flowOrderPass(Long orderId);

    /**
     * 采购订单审批未通过
     *
     * @param orderId 订单id
     */
    void flowOrderNotPass(Long orderId);

    /**
     * 到货
     *
     * @param applyPurchaseId 订单id
     * @param arrivalQuantity 到货数量
     * @param autoComplete    是否自动更新订单完成
     */
    void arrival(Long applyPurchaseId, BigDecimal arrivalQuantity, Boolean autoComplete);

    /**
     * 结束申购单
     *
     * @param applyPurchaseId 申购单id
     */
    void endApplyPurchase(Long applyPurchaseId);

    /**
     * 作废申购单
     *
     * @param applyPurchaseId 申购单id
     */
    void discardApplyPurchase(Long applyPurchaseId);

    /**
     * 验证订单是否完成
     *
     * @param orderId 订单id
     * @return 订单是否完成
     */
    boolean orderIsComplete(Long orderId);
}
