package com.jeeplus.finance.reimbursementApproval.approvalInfo.service;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jeeplus.common.TokenProvider;
import com.jeeplus.core.query.QueryWrapperGenerator;
import com.jeeplus.finance.contractRegistration.service.ContractInfoService;
import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
import com.jeeplus.finance.projectRecords.service.CwProjectRecordsService;
import com.jeeplus.finance.reimbursementApproval.approvalInfo.domain.*;
import com.jeeplus.finance.reimbursementApproval.approvalInfo.mapper.*;
import com.jeeplus.finance.reimbursementApproval.approvalInfo.service.dto.*;
//import com.jeeplus.pubmodules.oss.domain.WorkAttachment;
//import com.jeeplus.pubmodules.oss.mapper.OssServiceMapper;
//import com.jeeplus.pubmodules.serialNumTpl.service.SerialnumTplService;
import com.jeeplus.sys.domain.Office;
import com.jeeplus.sys.domain.WorkAttachmentInfo;
import com.jeeplus.sys.feign.*;
//import com.jeeplus.sys.service.OfficeService;
import com.jeeplus.sys.service.dto.OfficeDTO;
import com.jeeplus.sys.service.dto.RoleDTO;
import com.jeeplus.sys.service.dto.UserDTO;
//import com.jeeplus.sys.utils.DictUtils;
//import com.jeeplus.sys.utils.UserUtils;
import org.apache.commons.compress.utils.Lists;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author: 王强
 * @create: 2022-11-24 16:11
 **/
@Service
public class CwReimbursementInfoService {

    @Resource
    private CwReimbursementInfoMapper infoMapper;

    @Resource
    private CwReimbursementDetailInfoContractMapper cwReimbursementDetailInfoContractMapper;

    @Resource
    private CwReimbursementDetailInfoReportMapper cwReimbursementDetailInfoReportMapper;

    @Resource
    private CwReimbursementDetailInfoOtherMapper cwReimbursementDetailInfoOtherMapper;

    @Resource
    private CwReimbursementDetailInfoProcuredMapper cwReimbursementDetailInfoProcuredMapper;

    @Resource
    private CwReimbursementDetailInfoMapper detailInfoMapper;

    @Resource
    private CwReimbursementAmountInfoMapper amountInfoMapper;

//    @Resource
//    private OssServiceMapper ossServiceMapper;

//    @Resource
//    private SerialnumTplService serialnumTplService;

    @Resource
    private ContractInfoService infoService;

//    @Resource
//    private OfficeService officeService;

    @Resource
    private CwProjectRecordsService cwProjectRecordsService;

    /**
     * 报告号查询
     */
    public IPage<ReportNoDto> getReportNoList(Page<ReportNoDto> page , ReportNoDto dto) throws Exception{
        QueryWrapper<ReportNoDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, ReportNoDto.class);
        /**
         * a表是reimbursementInfo
         * b表是reimbursementDetailInfo
         * c表是sysUser
         */
        queryWrapper.eq("a.del_flag", 0);
        queryWrapper.eq("c.id", dto.getProjectId());
        return infoMapper.getReportNoList(page, queryWrapper);
    }

    /**
     * 列表查询
     */
    public IPage<RetureListDto> list(Page<RetureListDto> page , QueryListDto dto) throws Exception{
        QueryWrapper<QueryListDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, QueryListDto.class);
        /**
         * a表是reimbursementInfo
         * b表是reimbursementDetailInfo
         * c表是sysUser
         */
        queryWrapper.eq("a.del_flag", 0);
        // 报销项目
        if (StringUtils.isNotEmpty(dto.getProject())) {
            queryWrapper.apply("(b.project_id Like {0} OR b.project_name LIKE {1})", "%" + dto.getProject() + "%", "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b3.project_id = {0} OR p3.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b4.project_id = {0} OR b4.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b5.project_id = {0} OR b5.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");

        }
        // 报销时间
        if (dto.getDates() != null) {
            queryWrapper.between("a.reim_date", dto.getDates()[0], dto.getDates()[1]);
        }
        // 经办人
        if (StringUtils.isNotEmpty(dto.getHandled())) {
            queryWrapper.apply("(a.create_by_id = {0} OR c.name LIKE {1})", dto.getHandled(), "%" + dto.getHandled() + "%");
        }
        // 报销人
        if (StringUtils.isNotEmpty(dto.getReimBy())) {
            queryWrapper.apply("( b.user_id = {0} OR us.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b2.user_id = {0} OR us2.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b3.user_id = {0} OR us3.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b4.user_id = {0} OR us4.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b5.user_id = {0} OR us5.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");

        }
        // 报销状态
        if (StringUtils.isNotEmpty(dto.getType())) {
            queryWrapper.eq("a.type", dto.getType());
        }
        // 报销部门
        if (StringUtils.isNotEmpty(dto.getDepartment())) {
            queryWrapper.apply("( b.dept_id = {0} OR so.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b2.dept_id = {0} OR so2.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b3.dept_id = {0} OR so3.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b4.dept_id = {0} OR so4.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b5.dept_id = {0} OR so5.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");

        }
        // 报销类别
        if (StringUtils.isNotEmpty(dto.getRemiType())) {
            queryWrapper.apply(" (b.type_id = {0} OR t.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b2.type_id = {0} OR t2.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b3.type_id = {0} OR t3.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b4.type_id = {0} OR t4.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b5.type_id = {0} OR t5.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");

        }
        // 报销金额
        if (dto.getAmounts() != null) {
            if (StringUtils.isNotEmpty(dto.getAmounts()[0])) {
                queryWrapper.and(w ->
                    w.ge("b.number", Double.parseDouble(dto.getAmounts()[0]))
                        .or().ge("b2.number", Double.parseDouble(dto.getAmounts()[0]))
                        .or().ge("b3.number", Double.parseDouble(dto.getAmounts()[0]))
                        .or().ge("b4.number", Double.parseDouble(dto.getAmounts()[0]))
                        .or().ge("b5.number", Double.parseDouble(dto.getAmounts()[0]))
                );
            }
            if (dto.getAmounts().length>1 && StringUtils.isNotEmpty(dto.getAmounts()[1])) {
                queryWrapper.and(w ->
                    w.le("b.number", Double.parseDouble(dto.getAmounts()[1]))
                        .or().le("b2.number", Double.parseDouble(dto.getAmounts()[1]))
                        .or().le("b3.number", Double.parseDouble(dto.getAmounts()[1]))
                        .or().le("b4.number", Double.parseDouble(dto.getAmounts()[1]))
                        .or().le("b5.number", Double.parseDouble(dto.getAmounts()[1]))
                );
            }
        }
        // 报告号
        if (StringUtils.isNotEmpty(dto.getReportNumber())) {
            queryWrapper.like("b.report_number", dto.getReportNumber());
            queryWrapper.or().like("b2.report_number", dto.getReportNumber());
            queryWrapper.or().like("b3.report_number", dto.getReportNumber());
            queryWrapper.or().like("b4.report_number", dto.getReportNumber());
            queryWrapper.or().like("b5.report_number", dto.getReportNumber());
        }
        // 报销类型
        if (StringUtils.isNotBlank(dto.getSourceType())) {
            queryWrapper.eq("a.source_type", dto.getSourceType());
        }

        // 如果当前用户是部门主任，则可以查看部门所有的项目、自己创建的项目以及所属项目组的项目
        // 如果当前用户是员工，则可以查看自己创建的项目以及所属项目组的项目
        StringBuilder officeIds = new StringBuilder();
//        UserDTO userDTO = UserUtils.getCurrentUserDTO();
        List<String> manageOfficeIdList= Lists.newArrayList();
        //判定是否为会计所长 或会计部门主任
        /*if(CommonUtils.haveRoleKjsz() || CommonUtils.haveRoleCwBmzr()){
            //获取当前人管理的部门id
            if(StringUtils.isNotBlank(userDTO.getManageOfficeIds())){
                manageOfficeIdList = Arrays.asList(userDTO.getManageOfficeIds().split(","));
            }else{
                manageOfficeIdList.add(userDTO.getOfficeDTO().getId());
            }
            for (int i = 0; i <manageOfficeIdList.size(); i++){
                officeIds.append("'").append(manageOfficeIdList.get(i)).append("'");
                if(i < manageOfficeIdList.size()-1){
                    officeIds.append(",");
                }
            }
        }*/


        /*//获取当前登录人信息
        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
        //获取当前登录人所属角色
        //若是评估部门主任，则仅展示部门主任信息
        //若是评估员工，则仅展示自己的数据信息
        List<RoleDTO> roleDTOList = userDTO.getRoleDTOList();
        for (RoleDTO roleDTO : roleDTOList) {
            //根据角色id查询角色信息
            RoleDTO roleDTOById = SpringUtil.getBean(IRoleApi.class).getRoleDTOById(roleDTO.getId());
            if("cwyg".equals(roleDTOById.getEnName()) && "兴光会计员工".equals(roleDTOById.getName())){
                queryWrapper.eq("a.create_by_id", userDTO.getId());
                break;
            }else if("cw_bmzr".equals(roleDTOById.getEnName()) && "兴光会计部门主任".equals(roleDTOById.getName())){
                queryWrapper.eq("sumo.user_id", userDTO.getId());
                break;
            }
        }*/


        IPage<RetureListDto> list = infoMapper.findList(page, queryWrapper, officeIds.toString());
        list.getRecords().stream().forEach(item -> {
            if (StringUtils.isNotBlank(item.getSourceType()) && "1".equals(item.getSourceType())) { //项目报销
                if (StringUtils.isNotBlank(item.getProjectId())) {
                    String proName = selectProjectByIds(item.getProjectId());
                    item.setProjectName(proName);
                }
            }
        });
        return list;
    }

    public IPage<ProgramProjectListInfo> projectList(Page<ProgramProjectListInfo> page, ProgramProjectListInfo info, String tabType) throws Exception{

        //获取当前登录人信息
        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());

        QueryWrapper<ProgramProjectListInfo> wrapper = QueryWrapperGenerator.buildQueryCondition(info, ProgramProjectListInfo.class);
        wrapper.eq("a.del_flag", "0");
        wrapper.eq("a.tab_type", tabType);
        wrapper.eq("b.office_id", userDTO.getOfficeDTO().getId());
        if (info.getCreateDates() != null) {
            wrapper.between("a.create_time", info.getCreateDates()[0], info.getCreateDates()[1]);
        }
        IPage<ProgramProjectListInfo> pageList = infoMapper.findProjectList(page, wrapper);
        pageList.getRecords().stream().forEach(item ->{
            String isInvoice = infoMapper.selectInvoiceFlag(item.getId());
            item.setIsInvoice(isInvoice);
        });
        return pageList;
    }

    public CwReimbursementInfo save(SaveInfoDto dto) throws Exception{
        // 获取当前登录人信息
        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
        if (StringUtils.isNotEmpty(dto.getId()) && !dto.getId().equals("false")) {
            return update(dto, userDTO);
        } else {
            return add(dto, userDTO);
        }
    }

    public CwReimbursementInfo add(SaveInfoDto dto, UserDTO userDTO) throws Exception{
        // 生成id
        String id = UUID.randomUUID().toString().replace("-", "");
        // 生成编号
        String no = SpringUtil.getBean ( IWorkAttachmentApi.class ).genSerialNum(userDTO.getCompanyDTO().getId(), dto.BIZ_CODE, TokenProvider.getCurrentToken());
        // 保存基础信息表信息
        CwReimbursementInfo info = new CwReimbursementInfo();
        BeanUtils.copyProperties(dto, info);
        info.setId(id);
        info.setNo(no);
        info.setCreateById(userDTO.getId());
        info.setCreateTime(new Date());
        info.setUpdateById(userDTO.getId());
        info.setUpdateTime(new Date());
        info.setDelFlag(0);
        infoMapper.insert(info);
        // 保存项目详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfos())) {
            for (CwReimbursementDetailInfo detailInfo : dto.getDetailInfos()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(id);
                detailInfoMapper.insert(detailInfo);
            }
        }
        // 保存合同详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoContracts())) {
            for (CwReimbursementDetailInfoContract detailInfo : dto.getDetailInfoContracts()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(id);
                cwReimbursementDetailInfoContractMapper.insert(detailInfo);
            }
        }
        // 保存报告详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoReports())) {
            for (CwReimbursementDetailInfoReport detailInfo : dto.getDetailInfoReports()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(id);
                cwReimbursementDetailInfoReportMapper.insert(detailInfo);
            }
        }
        // 保存其他报销详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoOthers())) {
            for (CwReimbursementDetailInfoOther detailInfo : dto.getDetailInfoOthers()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(id);
                cwReimbursementDetailInfoOtherMapper.insert(detailInfo);
            }
        }
        // 保存采购报销详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoProcured())) {
            for (CwReimbursementDetailInfoProcured detailInfo : dto.getDetailInfoProcured()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(id);
                cwReimbursementDetailInfoProcuredMapper.insert(detailInfo);
            }
        }
        // 保存专用发票列表信息
        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
            for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
                // 生成id
                String amountId = UUID.randomUUID().toString().replace("-", "");
                amountInfo.setId(amountId);
                amountInfo.setCreateById(userDTO.getId());
                amountInfo.setCreateTime(new Date());
                amountInfo.setUpdateById(userDTO.getId());
                amountInfo.setUpdateTime(new Date());
                amountInfo.setDelFlag(0);
                // 保存基础表信息主键值
                amountInfo.setInfoId(id);
                amountInfoMapper.insert(amountInfo);
            }
        }
        // 保存附件列表信息
        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
            infoService.saveFiles(dto.getFiles(), userDTO, id);
        }
        return info;
    }

    public CwReimbursementInfo update(SaveInfoDto dto, UserDTO userDTO) {
        // 修改基础信息
        CwReimbursementInfo info = new CwReimbursementInfo();
        BeanUtils.copyProperties(dto, info);
        info.setUpdateById(userDTO.getId());
        info.setUpdateTime(new Date());
        infoMapper.updateById(info);
        // 修改报销详情列表信息
        // 删除原有数据
        LambdaQueryWrapper<CwReimbursementDetailInfo> detailWrapper = new LambdaQueryWrapper<>();
        detailWrapper.eq(CwReimbursementDetailInfo::getInfoId, dto.getId());
        detailInfoMapper.delete(detailWrapper);
        // 删除合同列表
        LambdaQueryWrapper<CwReimbursementDetailInfoContract> detailWrapperContract = new LambdaQueryWrapper<>();
        detailWrapperContract.eq(CwReimbursementDetailInfoContract::getInfoId, dto.getId());
        cwReimbursementDetailInfoContractMapper.delete(detailWrapperContract);
        // 删除报告列表
        LambdaQueryWrapper<CwReimbursementDetailInfoReport> detailWrapperReport = new LambdaQueryWrapper<>();
        detailWrapperReport.eq(CwReimbursementDetailInfoReport::getInfoId, dto.getId());
        cwReimbursementDetailInfoReportMapper.delete(detailWrapperReport);
        // 删除其他报销表
        LambdaQueryWrapper<CwReimbursementDetailInfoOther> detailWrapperOthers = new LambdaQueryWrapper<>();
        detailWrapperOthers.eq(CwReimbursementDetailInfoOther::getInfoId, dto.getId());
        cwReimbursementDetailInfoOtherMapper.delete(detailWrapperOthers);
        // 删除采购报销表
        LambdaQueryWrapper<CwReimbursementDetailInfoProcured> detailWrapperProcured = new LambdaQueryWrapper<>();
        detailWrapperProcured.eq(CwReimbursementDetailInfoProcured::getInfoId, dto.getId());
        cwReimbursementDetailInfoProcuredMapper.delete(detailWrapperProcured);

        // 保存项目详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfos())) {
            for (CwReimbursementDetailInfo detailInfo : dto.getDetailInfos()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(dto.getId());
                detailInfo.setId("");
                detailInfoMapper.insert(detailInfo);
            }
        }
        // 保存合同详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoContracts())) {
            for (CwReimbursementDetailInfoContract detailInfo : dto.getDetailInfoContracts()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(dto.getId());
                detailInfo.setId("");
                cwReimbursementDetailInfoContractMapper.insert(detailInfo);
            }
        }
        // 保存报告详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoReports())) {
            for (CwReimbursementDetailInfoReport detailInfo : dto.getDetailInfoReports()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(dto.getId());
                detailInfo.setId("");
                cwReimbursementDetailInfoReportMapper.insert(detailInfo);
            }
        }
        // 保存其他报销详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoOthers())) {
            for (CwReimbursementDetailInfoOther detailInfo : dto.getDetailInfoOthers()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(dto.getId());
                detailInfo.setId("");
                cwReimbursementDetailInfoOtherMapper.insert(detailInfo);
            }
        }
        // 保存采购报销详情列表信息
        if (CollectionUtils.isNotEmpty(dto.getDetailInfoProcured())) {
            for (CwReimbursementDetailInfoProcured detailInfo : dto.getDetailInfoProcured()) {
                // 保存基础表信息主键值
                detailInfo.setInfoId(dto.getId());
                detailInfo.setId("");
                cwReimbursementDetailInfoProcuredMapper.insert(detailInfo);
            }
        }
        // 修改专用发票信息列表
        // 删除原有数据
        LambdaQueryWrapper<CwReimbursementAmountInfo> amountWrapper = new LambdaQueryWrapper<>();
        amountWrapper.eq(CwReimbursementAmountInfo::getInfoId, dto.getId());
        amountInfoMapper.delete(amountWrapper);
        if (CollectionUtils.isNotEmpty(dto.getAmountInfos())) {
            for (CwReimbursementAmountInfo amountInfo : dto.getAmountInfos()) {
                // 生成id
                String amountId = UUID.randomUUID().toString().replace("-", "");
                amountInfo.setId(amountId);
                amountInfo.setCreateById(userDTO.getId());
                amountInfo.setCreateTime(new Date());
                amountInfo.setUpdateById(userDTO.getId());
                amountInfo.setUpdateTime(new Date());
                amountInfo.setDelFlag(0);
                // 保存基础表信息主键值
                amountInfo.setInfoId(dto.getId());
                amountInfoMapper.insert(amountInfo);
            }
        }
        // 修改附件信息列表
        if (CollectionUtils.isNotEmpty(dto.getFiles())) {
            infoService.updateFiles(dto.getFiles(), userDTO, dto.getId());
        }
        return info;
    }

    public String remove(String id) {
        // 删除基础信息表
        infoMapper.deleteById(id);
        // 删除详情列表
        LambdaQueryWrapper<CwReimbursementDetailInfo> detailWrapper = new LambdaQueryWrapper<>();
        detailWrapper.eq(CwReimbursementDetailInfo::getInfoId, id);
        detailInfoMapper.delete(detailWrapper);
        // 删除合同列表
        LambdaQueryWrapper<CwReimbursementDetailInfoContract> detailWrapperContract = new LambdaQueryWrapper<>();
        detailWrapperContract.eq(CwReimbursementDetailInfoContract::getInfoId, id);
        cwReimbursementDetailInfoContractMapper.delete(detailWrapperContract);
        // 删除报告列表
        LambdaQueryWrapper<CwReimbursementDetailInfoReport> detailWrapperReport = new LambdaQueryWrapper<>();
        detailWrapperReport.eq(CwReimbursementDetailInfoReport::getInfoId, id);
        cwReimbursementDetailInfoReportMapper.delete(detailWrapperReport);
        // 删除其他报销列表
        LambdaQueryWrapper<CwReimbursementDetailInfoOther> detailWrapperOther = new LambdaQueryWrapper<>();
        detailWrapperOther.eq(CwReimbursementDetailInfoOther::getInfoId, id);
        cwReimbursementDetailInfoOtherMapper.delete(detailWrapperOther);
        // 删除采购报销列表
        LambdaQueryWrapper<CwReimbursementDetailInfoProcured> detailWrapperProcured = new LambdaQueryWrapper<>();
        detailWrapperProcured.eq(CwReimbursementDetailInfoProcured::getInfoId, id);
        cwReimbursementDetailInfoProcuredMapper.delete(detailWrapperProcured);
        // 删除专用发票信息列表
        LambdaQueryWrapper<CwReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
        amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, id);
        amountInfoMapper.delete(amountInfoLambdaQueryWrapper);
        // 删除附件信息
//        LambdaQueryWrapper<WorkAttachmentInfo> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(WorkAttachmentInfo::getAttachmentId, id);
//        ossServiceMapper.delete(wrapper);
        SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteByAttachmentId(id);
        return "操作成功";
    }

    public SaveInfoDto findById(String id) {
        SaveInfoDto dto = new SaveInfoDto();
        // 查询基础信息表
        CwReimbursementInfo info = infoMapper.selectById(id);
        if (ObjectUtil.isNotEmpty(info)){
            BeanUtils.copyProperties(info, dto);
            if(StringUtils.isNotBlank(info.getDepartment())) {
                OfficeDTO byId = SpringUtil.getBean ( IOfficeApi.class ).getOfficeById(info.getDepartment());
                if (ObjectUtil.isNotEmpty(byId)) {
                    dto.setDepartmentName(byId.getName());
                }
            }

            // 查询详情列表
//        LambdaQueryWrapper<CwReimbursementDetailInfo> detailInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        detailInfoLambdaQueryWrapper.eq(CwReimbursementDetailInfo::getInfoId, id);
//        detailInfoLambdaQueryWrapper.orderByAsc(CwReimbursementDetailInfo::getNumber);
//        List<CwReimbursementDetailInfo> detailInfos = detailInfoMapper.selectList(detailInfoLambdaQueryWrapper);
            // 项目报销详情
            List<CwReimbursementDetailInfo> detailList = infoMapper.getDetailList(id);
            detailList.stream().forEach(projectDetail -> {
                if (StringUtils.isNotBlank(projectDetail.getProjectId())) {
                    String proName = selectProjectByIds(projectDetail.getProjectId());
                    projectDetail.setProjectName(proName);
                } else {
                    projectDetail.setProjectName("");
                }
            });
            dto.setDetailInfos(detailList);
            // 合同报销详情
            dto.setDetailInfoContracts(infoMapper.getContractDetailList(id));
            // 报告报销详情
            dto.setDetailInfoReports(infoMapper.getReportDetailList(id));
            // 其他报销
            dto.setDetailInfoOthers(infoMapper.getOtherDetailList(id));
            // 采购报销
            dto.setDetailInfoProcured(infoMapper.getProcuredDetailList(id));
            // 查询专用发票信息列表
            LambdaQueryWrapper<CwReimbursementAmountInfo> amountInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
            amountInfoLambdaQueryWrapper.eq(CwReimbursementAmountInfo::getInfoId, id);
            List<CwReimbursementAmountInfo> amountInfos = amountInfoMapper.selectList(amountInfoLambdaQueryWrapper);
            dto.setAmountInfos(amountInfos);
            // 查询附件信息
            List<WorkAttachmentInfo> files = infoMapper.findFiles(id);
            if (CollectionUtils.isNotEmpty(files)) {
                for (WorkAttachmentInfo i : files) {
                    i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
                }
            }
            dto.setFiles(files);
        }
        return dto;
    }

    /**
     * 根据项目id查询项目名称
     * @param ids 以逗号分隔的多个项目id字符串
     * @return
     */
    public String selectProjectByIds(String ids) {
        String projectName = "";
        String[] split = ids.split(",");
        List<String> idList = Arrays.asList(split);
        List<CwProjectRecords> list = cwProjectRecordsService.getListByIds(idList);
        if (CollectionUtil.isNotEmpty(list)) {
            projectName = list.stream().map(CwProjectRecords::getProjectName).collect(Collectors.joining(","));
        }
        return projectName;
    }

    public Boolean checkNumber(String number) {
        LambdaQueryWrapper<CwReimbursementAmountInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(CwReimbursementAmountInfo::getNumber, number);
        List<CwReimbursementAmountInfo> infos = amountInfoMapper.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(infos)) {
            return true;
        }
        return false;
    }

    public void updateStatusById(RetureListDto dto) {
        infoMapper.updateStatusById(dto.getId(), dto.getType());
    }

    //用户树形
    public List<TreeUserDto> userTree(String name) {
        List<TreeUserDto> list = new ArrayList<>();
        // 查询部门
        List<TreeUserDto> officeList = infoMapper.findOfficeList();
        if (CollectionUtils.isNotEmpty(officeList)) {
            list.addAll(officeList);
        }
        // 查询用户
        List<TreeUserDto> userList = infoMapper.findUserList(name);
        if (CollectionUtils.isNotEmpty(userList)) {
            list.addAll(userList);
        }
        return list;
    }

    /**
     * 下载列表查询
     */
    public List<RetureListDto> exportList(QueryListDto dto) throws Exception{
        QueryWrapper<QueryListDto> queryWrapper = QueryWrapperGenerator.buildQueryCondition(dto, QueryListDto.class);
        /**
         * a表是reimbursementInfo
         * b表是reimbursementDetailInfo
         * c表是sysUser
         */
        queryWrapper.eq("a.del_flag", 0);
        // 报销项目
        if (StringUtils.isNotEmpty(dto.getProject())) {
            queryWrapper.apply("(b.project_id = {0} OR p.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b3.project_id = {0} OR p3.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b4.project_id = {0} OR b4.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");
            queryWrapper.or().apply("(b5.project_id = {0} OR b5.project_name LIKE {1})", dto.getProject(), "%" + dto.getProject() + "%");

        }
        // 报销时间
        if (dto.getDates() != null) {
            queryWrapper.between("a.reim_date", dto.getDates()[0], dto.getDates()[1]);
        }
        // 经办人
        if (StringUtils.isNotEmpty(dto.getHandled())) {
            queryWrapper.apply("(a.create_by_id = {0} OR c.name LIKE {1})", dto.getHandled(), "%" + dto.getHandled() + "%");
        }
        // 报销人
        if (StringUtils.isNotEmpty(dto.getReimBy())) {
            queryWrapper.apply("( b.user_id = {0} OR us.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b2.user_id = {0} OR us2.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b3.user_id = {0} OR us3.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b4.user_id = {0} OR us4.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");
            queryWrapper.or().apply("( b5.user_id = {0} OR us5.name LIKE {1} )", dto.getReimBy(), "%" + dto.getReimBy() + "%");

        }
        // 报销状态
        if (StringUtils.isNotEmpty(dto.getType())) {
            queryWrapper.eq("a.type", dto.getType());
        }
        // 报销部门
        if (StringUtils.isNotEmpty(dto.getDepartment())) {
            queryWrapper.apply("( b.dept_id = {0} OR so.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b2.dept_id = {0} OR so2.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b3.dept_id = {0} OR so3.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b4.dept_id = {0} OR so4.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");
            queryWrapper.or().apply("( b5.dept_id = {0} OR so5.name LIKE {1} )", dto.getDepartment(), "%" + dto.getDepartment() + "%");

        }
        // 报销类别
        if (StringUtils.isNotEmpty(dto.getRemiType())) {
            queryWrapper.apply(" (b.type_id = {0} OR t.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b2.type_id = {0} OR t2.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b3.type_id = {0} OR t3.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b4.type_id = {0} OR t4.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");
            queryWrapper.or().apply(" (b5.type_id = {0} OR t5.name LIKE {1}) ", dto.getRemiType(), "%" + dto.getRemiType() + "%");

        }
        // 报销金额
        if (dto.getAmounts() != null) {
            if (StringUtils.isNotEmpty(dto.getAmounts()[0])) {
                queryWrapper.and(w ->
                        w.ge("b.number", Double.parseDouble(dto.getAmounts()[0]))
                                .or().ge("b2.number", Double.parseDouble(dto.getAmounts()[0]))
                                .or().ge("b3.number", Double.parseDouble(dto.getAmounts()[0]))
                                .or().ge("b4.number", Double.parseDouble(dto.getAmounts()[0]))
                                .or().ge("b5.number", Double.parseDouble(dto.getAmounts()[0]))
                );
            }
            if (StringUtils.isNotEmpty(dto.getAmounts()[1])) {
                queryWrapper.and(w ->
                        w.le("b.number", Double.parseDouble(dto.getAmounts()[1]))
                                .or().le("b2.number", Double.parseDouble(dto.getAmounts()[1]))
                                .or().le("b3.number", Double.parseDouble(dto.getAmounts()[1]))
                                .or().le("b4.number", Double.parseDouble(dto.getAmounts()[1]))
                                .or().le("b5.number", Double.parseDouble(dto.getAmounts()[1]))
                );
            }
        }
        // 报告号
        if (StringUtils.isNotEmpty(dto.getReportNumber())) {
            queryWrapper.like("b.report_number", dto.getReportNumber());
            queryWrapper.or().like("b2.report_number", dto.getReportNumber());
            queryWrapper.or().like("b3.report_number", dto.getReportNumber());
            queryWrapper.or().like("b4.report_number", dto.getReportNumber());
            queryWrapper.or().like("b5.report_number", dto.getReportNumber());
        }
        // 报销类型
        if (StringUtils.isNotBlank(dto.getSourceType())) {
            queryWrapper.eq("a.source_type", dto.getSourceType());
        }
        List<RetureListDto> exportList = infoMapper.findExportList(queryWrapper);
        if (CollectionUtils.isNotEmpty(exportList)) {
            for (RetureListDto retureListDto : exportList) {
                if ("1".equals(retureListDto.getType())) {
                    retureListDto.setType("暂存");
                }
                if ("2".equals(retureListDto.getType())) {
                    retureListDto.setType("审批中");
                }
                if ("3".equals(retureListDto.getType())) {
                    retureListDto.setType("撤回");
                }
                if ("4".equals(retureListDto.getType())) {
                    retureListDto.setType("驳回");
                }
                if ("5".equals(retureListDto.getType())) {
                    retureListDto.setType("已完成");
                }
                if (StringUtils.isNotBlank(retureListDto.getSourceType())) {
                    if ("2".equals(retureListDto.getSourceType())) {
                        retureListDto.setContractName(retureListDto.getProjectName());
                        retureListDto.setProjectName("");
                    }
                    retureListDto.setSourceType(SpringUtil.getBean ( IDictApi.class ).getDictLabel(retureListDto.getSourceType(),"cw_reimbursement_source_type",""));
                }
            }
        }
        return exportList;
    }

    /**
     * 关联报销
     */
    public IPage<RetureListDto> relationReimbursementList(Page<RetureListDto> page, String id) {
        IPage<RetureListDto> iPage = infoMapper.relationReimbursementList(page, id);
        return iPage;
    }

    public List<CwProjectRecords> queryByProIds(String ids) {
        String[] split = ids.split(",");
        List<String> idList = Arrays.asList(split);
        List<CwProjectRecords> list = cwProjectRecordsService.list(new LambdaQueryWrapper<CwProjectRecords>().in(CwProjectRecords::getId, idList));
        return list;
    }

}
