package cn.iocoder.yudao.module.pms.service.iotoperationmeeting;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingPageReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingRespVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveBatchVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeeting.vo.IotOperationMeetingSaveReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailPageReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.iotoperationmeetingdetail.vo.IotOperationMeetingDetailRespVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotoperationmeeting.IotOperationMeetingDO;
import cn.iocoder.yudao.module.pms.dal.dataobject.iotprojecttaskattrs.IotTaskAttrModelProperty;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 生产运营会 Service 接口
 *
 * @author ruiqi
 */
public interface IotOperationMeetingService {

    /**
     * 创建生产运营会
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createIotOperationMeeting(@Valid IotOperationMeetingSaveReqVO createReqVO);

    /**
     * 更新生产运营会
     *
     * @param updateReqVO 更新信息
     */
    void updateIotOperationMeeting(@Valid IotOperationMeetingSaveReqVO updateReqVO);

    /**
     * 删除生产运营会
     *
     * @param id 编号
     */
    void deleteIotOperationMeeting(Long id);

    /**
     * 获得生产运营会
     *
     * @param id 编号
     * @return 生产运营会
     */
    IotOperationMeetingDO getIotOperationMeeting(Long id);

    /**
     * 获得生产运营会分页
     *
     * @param pageReqVO 分页查询
     * @return 生产运营会分页
     */
    PageResult<IotOperationMeetingDO> getIotOperationMeetingPage(IotOperationMeetingPageReqVO pageReqVO);

    /**
     * 批量保存生产运营会 主表+明细
     *
     * @param saveBatchVO 保存对象
     * @return 保存记录数
     */
    Long saveBatch(IotOperationMeetingSaveBatchVO saveBatchVO);

    /**
     * 将当前公司填写过的项目名称作为下拉列表返回 提高填写效率
     */
    Set<String> cachedProjects();

    /**
     * 填报运营会议明细时查询上期填写的工作计划
     */
    IotOperationMeetingDetailRespVO previousWorkPlan(IotOperationMeetingDetailPageReqVO pageReqVO);

    /**
     * 设备利用率是否需要必填
     * @return
     */
    IotOperationMeetingRespVO mandatoryOrNot();

    /**
     * 石油技术查询所有公司整合的生产会议项目信息 按照期次维度整合
     * @param pageReqVO
     * @return
     */
    Map<String, List<IotOperationMeetingDO>> integratedMeeting(IotOperationMeetingPageReqVO pageReqVO);

    /**
     * 石油技术 查询汇总各专业公司的项目明细
     * @param pageReqVO
     * @return
     */
    List<IotOperationMeetingRespVO> summarizedProjectDetails(IotOperationMeetingPageReqVO pageReqVO);

    /**
     * 石油技术 查询所有公司的线上运营会议期次 下拉列表
     * @param
     * @return
     */
    Set<String> availableQueryPeriods();

    /**
     * 查询当前登录人所在公司相关的 工作量 扩展属性
     * @param
     * @return
     */
    List<IotTaskAttrModelProperty> currentCompanyExtProperties();

    /**
     * 汇总页面 查询指定公司 的拆分工作量明细
     * @param
     * @return
     */
    List<IotOperationMeetingRespVO> companyWorkloadDetails(IotOperationMeetingPageReqVO pageReqVO);
}