package com.pusong.business.service;

import com.pusong.business.domain.PsContractInfo;
import com.pusong.business.domain.bo.PsContractInfoQueryBo;
import com.pusong.business.domain.bo.PsInvoiceBo;
import com.pusong.business.domain.vo.PsContractInfoVo;
import com.pusong.business.domain.bo.PsContractInfoBo;
import com.pusong.business.domain.vo.PsSalaryContractVo;
import com.pusong.business.domain.vo.ServiceScheduleVo;
import com.pusong.business.enums.ContractStatusEnum;
import com.pusong.common.mybatis.core.page.TableDataInfo;
import com.pusong.common.mybatis.core.page.PageQuery;

import java.util.Collection;
import java.util.List;

/**
 * 合同基本信息Service接口
 *
 * @author wls
 * @date 2024-07-29
 */
public interface IPsContractInfoService {

    /**
     * 生成合同
     *
     * @param bo 合同信息
     *  @param type 操作类型 1保存2暂存
     * @return 是否新增成功
     */
    String createContract(PsContractInfoBo bo,Integer type);
    /**
     * 预览合同
     *
     * @param bo 合同信息
     * @return 是否新增成功
     */
    Long preview(PsContractInfoBo bo);

    /**
     * 根据客户id查询暂存的合同详情信息
     *
     * @param customerId 客户id
     * @return 合同基本信息
     */
    PsContractInfoVo queryInfoByCustomId(Long customerId);
    void fillMoney(PsContractInfoVo vo);
    List<PsContractInfo> queryByCode(Long customId, String code, String status);
    /**
     * 分页查询合同基本信息列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 合同基本信息分页列表
     */
    TableDataInfo<PsContractInfoVo> queryPageList(PsContractInfoQueryBo bo, PageQuery pageQuery);

    /**
     * 根据客户id 查询相关合同
     * @param pageQuery
     * @return
     */
    TableDataInfo<PsContractInfoVo> queryPageListByCustomId(Long customId, PageQuery pageQuery);

    /**
     * 根据合同编码查询合同详情信息
     *
     * @param contractCode 合同编码
     * @return 合同基本信息
     */
    PsContractInfoVo queryContractByCode(String contractCode);
    /**
     * 根据合同编码修改合同信息
     *
     * @param bo 合同信息
     * @return 合同基本信息
     */
    boolean updateContractByCode(PsContractInfoBo bo);

    void update(PsContractInfoVo old, PsContractInfoBo updateBo);

    /**
     * 作废合同
     *
     * @param contractCode 合同编码
     * @param desc 作废描述
     */
    boolean cancellation(String contractCode,String desc);
    /**
     * 重启合同
     *
     * @param contractCode 合同编码
     */
    boolean restart(String contractCode);
    /**
     * 根据合同编码修改合同
     * @param info
     * @return
     */
    PsContractInfo updateByCode(PsContractInfo info);

    /**
     * 生成合同pdf
     * @param add
     * @param bo
     * @param isSave 是否保存数据库
     */
    Long makePdf(PsContractInfo add ,PsContractInfoBo bo,boolean isSave);

    /**
     * 开发票（开发票操作）
     * @param contractCode
     * @return
     */
    void invoice(String contractCode);
    void invoice(PsInvoiceBo invoiceBo);
    /**
     * 免费工单
     * @param contractCode 合同编码
     * @param businessType 服务类别
     * @param businessProject 服务项目
     */
    void freeWork(String contractCode,String businessType,String businessProject);

    /**
     * 合同完成
     * @param contractCode 合同编码
     */
    String finish(String contractCode);


    /**
     * 根据合同编码查询服务进度
     * @param contractCode 合同编码
     */
    ServiceScheduleVo queryScheduleByCode(String contractCode, Long serviceCompanyId);

    /**
     * 全部退款回退合同状态
     * @param contractCode
     */
    void dealReturn(String contractCode);

    /**
     * 查询符合条件的合同基本信息列表
     *
     * @param bo 查询条件
     * @return 合同基本信息列表
     *//*
    List<PsContractInfoVo> queryList(PsContractInfoBo bo);

    *//**
     * 新增合同基本信息
     *
     * @param bo 合同基本信息
     * @return 是否新增成功
     *//*
    Boolean insertByBo(PsContractInfoBo bo);

    *//**
     * 修改合同基本信息
     *
     * @param bo 合同基本信息
     * @return 是否修改成功
     *//*
    Boolean updateByBo(PsContractInfoBo bo);

    *//**
     * 校验并批量删除合同基本信息信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     *//*
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);*/
}
