package com.microservices.pms.product.service;

import com.alibaba.fastjson2.JSONObject;
import com.microservices.common.core.web.page.GenericsTableDataInfo;
import com.microservices.pms.product.domain.PmsProductRequirement;
import com.microservices.pms.product.domain.vo.*;

import java.util.List;

/**
 * 产品需求Service接口
 * 
 * @author otto
 * @date 2023-10-10
 */
public interface IPmsProductRequirementService 
{
    /**
     * 查询产品需求
     *
     * @param id        产品需求主键
     * @param checkRole
     * @return 产品需求
     */
    public PmsProductRequirement selectPmsProductRequirementById(Long id, boolean checkRole);

    /**
     * 修改产品需求
     * 
     * @param pmsProductRequirement 产品需求
     * @return 结果
     */
    public int updatePmsProductRequirement(PmsProductRequirement pmsProductRequirement);

    /**
     * 更新产品需求变更
     *
     * @param id 产品需求ID
     * @return 结果
     */
    public int updatePmsProductRequirementChange(Long id);

    /**
     * 删除产品需求信息
     * 
     * @param id 产品需求主键
     * @return 结果
     */
    public int deletePmsProductRequirementById(Long id);

    /**
     * 查询产品需求数量
     * @param pmsProductRequirement 产品需求查询字段
     * @return 数量
     */
    Integer selectPmsProductRequirementCount(PmsProductRequirement pmsProductRequirement);

    /**
     * 删除产品下所有需求
     *
     * @param productIdentifier 产品标识
     */
    void deletePmsProductRequirementByProductIdentifier(String productIdentifier);

    /**
     * 根据计划id删除需求与计划id的关联关系
     *
     * @param planId 计划Id
     */
    void updatePmsProductRequirementNoPlanByPlanId(Long planId);

    /**
     * 根据模块ID删除需求与模块的关联关系
     *
     * @param moduleId 模块ID
     */
    void updatePmsProductRequirementToNoModule(Long moduleId);

    /**
     * 查询产品需求列表
     *
     * @param pmsProductRequirementSearch 搜索条件
     * @return 产品需求列表
     */
    List<PmsProductRequirement> selectPmsProductRequirementList(PmsProductRequirement pmsProductRequirementSearch);

    /**
     * 查询用户需求列表
     *
     * @param productUserReqSearchVo 查询条件
     * @return 用户需求列表
     */
    GenericsTableDataInfo<ProductUserReqDataVo> selectUserReqList(ProductUserReqSearchVo productUserReqSearchVo);

    ProductUserReqDetailVo selectUserReqDetailById(Long id);

    Long insertUserReq(ProductUserReqInputVo productUserReqInputVo);

    int updateUserReq(ProductUserReqUpdateVo productUserReqUpdateVo);

    int deleteUserReqByIds(Long[] ids);

    int reviewUserReq(ProductReqReviewVo productReqReviewVo);

    GenericsTableDataInfo<ProductReqSpecsDataVo> selectReqSpecsList(ProductReqSpecsSearchVo productReqSpecsSearchVo);

    ProductReqSpecsDetailVo selectReqSpecsDetailById(Long id);

    Long insertReqSpecs(ProductReqSpecsInputVo productReqSpecsInputVo);

    int updateReqSpecs(ProductReqSpecsUpdateVo productReqSpecsUpdateVo);

    int deleteReqSpecsByIds(Long[] ids);

    int reviewReqSpecs(ProductReqReviewVo productReqReviewVo);

    int changeReqSpecs(ProductReqSpecsChangeVo productReqSpecsChangeVo);

    int activePlan(ProductReqSpecsActivePlanVo productReqSpecsActivePlanVo);

    List<ReqStatusCommonVo> selectUserReqStatusList();

    List<ReqStatusCommonVo> selectReqSpecsStatusList();

    List<EnumCommonVo> selectReqSpecsTypeList();

    JSONObject selectReqSpecsAssociatedPlanData(Long reqSpecsId);
}
