/**
 * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
 */
package com.jeeplus.modules.sg.managementcenter.project.mapper;

import com.jeeplus.core.persistence.BaseMapper;
import com.jeeplus.core.persistence.annotation.MyBatisMapper;
import com.jeeplus.modules.sg.managementcenter.activiti.entity.Construction;
import com.jeeplus.modules.sg.managementcenter.activiti.entity.Quantity;
import com.jeeplus.modules.sg.managementcenter.materialinfo.entity.MaterialInfo;
import com.jeeplus.modules.sg.managementcenter.project.entity.*;
import com.jeeplus.modules.sg.managementcenter.reserveManagement.entity.PersonnelTurnover;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@MyBatisMapper
public interface ProjectMapper extends BaseMapper<Project> {

    /**
     * 修改项目前期基本信息
     * @param project 需要保存的项目数据
     */
    void insertBasic(Project project);

    /**
     * 导入批量项目前期基本信息
     * @param project 需要保存的项目数据集合
     */
    void insertBasicList(List<Project> project);

    /**
     * 导入批量项目前期基本信息
     * @param project 需要保存的项目数据集合
     */
    void insertAssList(List<Project> project);

    /**
     * 导入批量项目立项信息
     * @param project 需要保存的项目数据集合
     */
    void insertApprovalList(List<Project> project);

    /**
     * 批量修改导入的项目信息
     * @param project 需要保存的项目数据集合
     */
    void updateBasicList(List<Project> project);

    /**
     * 批量修改导入的施工任务分配信息
     * @param project 需要保存的项目数据集合
     */
    void updateAssList(List<Project> project);

    /**
     * 批量修改导入的项目立项信息
     * @param project 需要保存的项目数据集合
     */
    void updateApprovalList(List<Project> project);

    /**
     * 批量导入交底计划安排
     * @param project 需要保存的项目数据集合
     */
    void insertPlanList(List<Project> project);

    /**
     * 批量修改导入的交底计划安排
     * @param project 需要保存的项目数据集合
     */
    void updatePlanList(List<Project> project);

    /**
     * 批量拆旧表信息 insertTearList
     * @param projects 需要保存的项目数据集合
     */
    void insertTearList(List<Project> projects);

    /**
     * 批量修改基础拆旧表信息
     * @param projects 需要保存的项目数据集合
     * */
    void updateTearList(List<Project> projects);

    /**
     * 批量修改设计拆旧表信息
     * @param projects 需要保存的项目数据集合
     * */
    void updateDesTearList(List<Project> projects);

    /**
     * 批量修改交底拆旧表信息
     * @param projects 需要保存的项目数据集合
     * */
    void updateConTearList(List<Project> projects);

    /**
     * 批量修改实际拆旧表信息
     * @param projects 需要保存的项目数据集合
     * */
    void updateFinTearList(List<Project> projects);

    /**
     *  通过项目储备名称和设备材料名称查询判断拆旧信息是否已经存在
     * @return 返回拆旧信息存在的数量，0为没有，>0表示数据存在
     * @param reservedName
     * @param reserveProjectName
     */
    int isNotByName(@Param("reserveProjectName") String reserveProjectName, @Param("reservedName") String reservedName);

    /**
     * 项目现有项目所有的储备项目名称
     * @return 返回所有的储备项目名称
     */
    List<String> allProjectName();

    /**
     * 项目现有项目所有的项目定义号
     * @return 返回所有项目定义号不为空的，项目不是多次设点的项目定义号
     */
    List<String> allProjectId();

    /**
     * 根据名称查询项目前期基本信息
     * @return 返回通过储备项目名称查询获得的项目前期基本信息
     * @param name 储备项目名称
     */
    Project findProByName(String name);

    /**
     * 根据名称查询项目拆旧信息
     * @return 返回通过储备项目名称查询的拆旧信息
     * @param name 储备项目名称
     * */
    List<Project> findTearByName(String name);

    /**
     * 根据名称查询施工任务分配信息
     * @return 返回通过储备项目名称返回项目的施工任务分配信息
     * @param name 储备项目名称
     */
    Project findAssByName(String name);


    /**
     * 根据名称查询交底计划安排信息
     * @return 返回项目的负责人员信息，施工交底状态信息，交底计划安排信息
     * @param name 储备项目名称
     */
    Project findPlanByName(String name);

    /**
     * 根据名称查询该计划的id，用于流程在表中添加procInsId
     * @return 通过储备项目名称获取施工交底流程记录表中的数据
     * @param name 储备项目名称
     * */
    String findPlanIdByName(String name);

    /**
     * 根据名称查询项目立项信息
     * @return 返回项目立项信息
     * @param id 项目立项表id
     */
    Project findApprovalByName(String id);

    /**
     * 修改项目前期基本信息
     * @param project 需要修改的数据
     * */
    void updateBasic(Project project);

    /**
     * 施工任务分配信息数据
     * @return 施工任务分配信息集合
     * @param project 查询条件实体类
     */
    List<Project> findBasicList(Project project);

    /**
     * 施工任务分配信息数据
     * @return 施工任务分配信息集合
     * @param project 查询条件实体类
     */
    List<Project> findAssList(Project project);

    /**
     * 交底计划安排
     * @return 返回交底计划安排信息
     * @param project 查询条件实体类
     */
    List<Project> findPlanList(Project project);

    /**
     * 项目立项信息
     * @return 返回项目立项信息
     * @param project 查询条件实体类
     */
    List<Project> findApprovalList(Project project);

    /**
     * 项目拆旧信息
     * @return 返回项目拆旧信息列表
     * @param project 查询条件实体类
     * */
    List<Project> findTearDownList(Project project);

    /**
     * 项目关闭管理模块验证数据-资金计划数据表
     * @return 返回资金计划数据，项目流程状态，项目基础信息
     * @param closureManage 项目关闭管理实体类，获取项目基础信息列表数据
     * */
    List<ClosureManage> findClosureManagementList(ClosureManage closureManage);

    /**
     * 项目名称查询项目信息
     * @param name 储备项目名称
     * @return 获取项目状态
     * */
    Project findProcess(String name);

    /**
     * 根据年度物资上报id获取施工任务分配信息
     * @return 施工任务分配信息
     * @param project 查询条件实体类
     */
    Project getAss(Project project);

    /**
     * 根据年度物资上报id获取交底计划安排信息
     * @return  返回项目交底计划安排信息
     * @param project 查询条件实体类（根据年度物资上报id）
     */
    Project getPlan(Project project);

    /**
     * 根据年度物资上报id获取项目立项信息
     * @return 返回项目立项信息
     * @param project 查询条件实体类（根据年度物资上报id）
     */
    Project getApproval(Project project);

    /**
     * 获取拆旧表的某一条数据
     * @return 返回拆旧表信息
     * @param project 查询条件实体类（根据拆旧表id）
     * */
    Project getTear(Project project);

    /**
     * 基础项目拆旧信息修改
     * @param project 拆旧表修改信息
     */
    void tearEditSave(Project project);

    /**
     * 修改项目关闭状态
     * @param project 修改项目关闭状态
     */
    void updateClosure(Project project);

    /**
     * 查找系统中所有人员信息
     * @return 返回系统所有人员姓名
     */
    List<String> findAllMember();

    /**
     * 通过储备项目名称获取需求单位
     * @return 返回项目需求单位
     * @param name（储备项目名称）
     */
    String findDemandUnit(String name);

    /**
     * 通过流程定义号获取需求单位
     * @return  返回需求单位
     * @param procInsId 流程实例id
     */
    String demandByProcInsId(String procInsId);


    /**
     * 通过id获取项目储备项目名称
     * @return 储备项目名称
     * @param id 项目id
     */
    String reserveProjectNameById(String id);

    /**
     * 通过流程定义号获取项目领料，土建状态，扭转人员信息
     * @return 项目信息，人员信息
     * @param procInsId 流程实例id
     * */
    Project findByProcInsId(String procInsId);

    /**
     * 通过储备项目名称获取项目状态，是否可以进程状态，基础信息，人员流转信息
     * @return 返回项目信息，人员信息
     * @param reserveProjectName 储备项目名称
     * */
    Project findByName(String reserveProjectName);

    /**
     * 获取项目基础信息根据id
     * @return 项目id，项目定义号，项目定义名称
     * @param id 项目id
     */
    Project findMaterialProject(String id);
    /*#################################################################################################*/

//    void updateStatusBy(String acquisitionStatus,String projectId);


    //void  updateStatusByClose(@Param("close") String close,@Param("procInsId") String procInsid);

    /**
     * 根据项目储备名称修改项目土建超权限状态
     * @param reserveProjectName 储备项目名称
     * @param status 提前土建权限
     */
    void updateAdvCon(@Param("reserveProjectName") String reserveProjectName,@Param("status") String status);


//    void updateAcquisitionStatus(@Param("acquisitionStatus")String acquisitionStatus,@Param("id") String id);

    /**
     * 根据id，查询所有项目信息
     * @return 项目信息，前期基本信息，施工任务分配信息
     * @param projectIds 项目id数组
     * */
    List<Project> findListById(String[] projectIds);


    /*int insertList(@Param("list") List<Project1> list);*/

    /*List<Project> findListProject(List<Project1> projects);*/

    /**
     * 通过流程定实例id查询项目流转人员信息-施工交底流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findUser(String procInsId);


    /**
     * 通过流程定实例id查询储备人员信息
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    PersonnelTurnover findCbUser(String procInsId);

    /**
     * 通过流程定义id查询项目流转人员信息-土建流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findTJUser(String procInsId);

    /**
     * 通过流程定义id查询项目流转人员信息-领料流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findWZUser(String procInsId);

    /**
     * 通过流程定义id查询项目流转人员信息-施工验收（电气）流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findSGUser(String procInsId);

    /*Project findJSUser(String procInsId);*/

    /**
     * 通过流程定义id查询项目流转人员信息-转资流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findFundUser(String procInsId);

//    Project findUserById(String projectId);

//    Integer updatePreConstruction(Project1 project);


//    List<Project> findListProjectRequisitions(@Param("list") List<PickingRequisition> list);

//    List<String> findAllUser();

    /**
     * 通过key获取相同key的最新版本号，通过key和版本号获取流程id
     * @return 流程对应id
     * @param key 流程定义表key标识
     * */
    String findDefId(String key);

//    Project1 findIdConProc(String procInsId);


//    Project findProjectList(Project project);

    /**
     * 通过项目需求名称修改土建流程状态
     * @param reserveProjectName 储备项目名称
     * @param numerical 土建状态标识0-未发起，1-流程中，2-流程完成
     */
    void updateAdvanceStart(@Param("reserveProjectName")String reserveProjectName, @Param("numerical")String numerical);

    /**
     * 获取项目的年度物资上报明细
     * @return 年度物资上报明细
     * @param id 项目id
     * */
    List<MaterialInfo> findAllInfo(String id);

    /**
     * 获取项目的年度物资上报明细-物资领料流程
     * @return 年度物资上报明细
     * @param procInsId 流程实例id
     * */
    List<MaterialInfo> findWzInfo(String procInsId);

    //根据储备项目名称查询出所有的领料单数据-施工流程
    /**
     * 获取项目的年度物资上报明细-施工验收（电气）流程
     * @return 年度物资上报明细
     * @param id 施工验收（电气）id
     * */
    List<MaterialInfo> findSgInfo(String id);

    /**
     * 根据id查询项目的数据，包含停电线路，流转人员信息
     * @return 项目名称信息，工程量（停电线路信息），人员流转信息
     * @param id 项目id
     * */
    Construction findBlockAss(String id);

    /**
     * 根据id查询项目的数据，包含停电线路，流转人员信息-领料流程
     * @return 项目名称信息，工程量（停电线路信息），人员流转信息
     * @param procInsId 领料流程实例id
     * */
    Construction findWzAss(String procInsId);

    /**
     * 根据id查询项目的数据，包含停电线路，流转人员信息-施工验收流程
     * @return 项目名称信息，工程量（停电线路信息），人员流转信息
     * @param id 施工验收流程id
     * */
    Construction findSgBlockAss(String id);

    //根据流程定义号获取项目信息添加项目二次涉电项目
    /**
     * 通过流程定义号获取项目所有信息-施工验收流程
     * @param procInsId 流程定义号
     * @return 项目信息
     * */
    Project findSgProject(String procInsId);

    /**
     * 插入年度物资上报统计表
     * @param project 需要插入的数据
     * */
    void insertSgProject(Project project);

    /**
     * 获取人员流转信息-施工验收流程
     * @return 人员流转信息
     * @param procInsId 流程实例id
     * */
    Assignment findSgAss(String procInsId);

    /**
     * 获取工程量信息-施工验收流程
     * @return 工程量信息
     * @param procInsId 流程实例id
     * */
    Quantity findSgQuantity(String procInsId);

    /**
     *  插入工程量
     * @param quantity 需要插入的数据
     * */
    void insertSgQuantity(Quantity quantity);

    /**
     * 修改项目施工状态-施工验收流程
     * @param status 修改状态的值
     * @param procInsId 流程实例id
     * */
    void updateSgStatus(@Param("status") String status,@Param("procInsId") String procInsId);

    /**
     * 修改项目土建状态-土建验收流程
     * @param status 修改状态的值
     * @param procInsId 流程实例id
     * */
    void updateTjStatus(@Param("status") String status, @Param("procInsId") String procInsId);

    /**
     * 修改项目施工状态-物资领料流程
     * @param status 修改状态的值
     * @param procInsId 流程实例id
     * */
    void updateWzStatus(@Param("status") String status, @Param("procInsId") String procInsId);

    /**
     * 通过流程定义号查询项目的土建及施工状态-施工验收（电气）流程
     * @return 项目信息，土建状态，施工状态，人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findSgProcInsId(String procInsId);

    /**
     * 通过流程定义号查询项目的物资领料及项目进场状态-领料流程
     * @return 项目信息，领料状态，是否可以进场，停电线路，人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findWzProcInsId(String procInsId);

    //通过流程定义号查询项目的物资领料及项目进场状态
    /**
     * 通过流程定义号查询项目的土建及施工状态-土建流程
     * @return 项目信息，土建状态，施工状态，人员流转信息
     * @param procInsId 流程实例id
     * */
    Project findTjProcInsId(String procInsId);

    /**
     * 修改项目结算状态
     * @param reserveProjectName 储备项目名称
     * @param status 结算状态
     * */
    void updateJsStatus(@Param("status") String status, @Param("reserveProjectName") String reserveProjectName);

    /**
     * 修改项目领料状态
     * @param reserveProjectName 储备项目名称
     * @param status 领料状态
     * */
    void wzStatusByName(@Param("status") String status, @Param("reserveProjectName") String reserveProjectName);

    /**
     * 删除土建信息
     * @param id 土建信息id
     * */
    void deleteTearAll(String id);

    /**
     * 通过查询返回可以导出的项目前期基础信息数据集合
     * @return 根据储备项目名称，项目定义号，项目定义名称，项目id查询出的结果
     * @param beforeExport 项目前期基础信息导出实体类，查询条件
     * */
    List<BeforeExport> findBtnExport(BeforeExport beforeExport);
}