package com.ningdatech.carapi.report.manage;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ningdatech.basic.function.VUtils;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.basic.util.StrPool;
import com.ningdatech.carapi.car.vehicle.contants.VehicleContant;
import com.ningdatech.carapi.common.constant.UserRoleTypeEnum;
import com.ningdatech.carapi.common.contants.DefValConstants;
import com.ningdatech.carapi.report.constant.DataUploadAuditStatusEnum;
import com.ningdatech.carapi.report.constant.DataUploadAuditTypeEnum;
import com.ningdatech.carapi.report.constant.UploadDataTypeEnum;
import com.ningdatech.carapi.report.model.entity.BulkCementDirectReportSystemAuditInfo;
import com.ningdatech.carapi.report.model.entity.BulkCementDirectReportSystemAuditRecord;
import com.ningdatech.carapi.report.model.entity.BulkCementDirectReportSystemDataRelevance;
import com.ningdatech.carapi.report.model.entity.NonProhibitedAreasBulkCementSalesUse;
import com.ningdatech.carapi.report.model.po.ReqDataUploadListPO;
import com.ningdatech.carapi.report.model.po.ReqNonProhibitedAreasDataUploadPO;
import com.ningdatech.carapi.report.model.vo.ResDataUploadListVO;
import com.ningdatech.carapi.report.model.vo.ResNonProhibitedAreasDataUploadDetailVO;
import com.ningdatech.carapi.report.service.IBulkCementDirectReportSystemAuditInfoService;
import com.ningdatech.carapi.report.service.IBulkCementDirectReportSystemAuditRecordService;
import com.ningdatech.carapi.report.service.IBulkCementDirectReportSystemDataRelevanceService;
import com.ningdatech.carapi.report.service.INonProhibitedAreasBulkCementSalesUseService;
import com.ningdatech.carapi.sys.entity.dto.CompanyDTO;
import com.ningdatech.carapi.sys.entity.dto.RegionDTO;
import com.ningdatech.carapi.sys.helper.CompaniesCacheHelper;
import com.ningdatech.carapi.sys.helper.RegionsCacheHelper;
import com.ningdatech.carapi.user.security.auth.model.UserInfoDetails;
import com.ningdatech.carapi.user.util.LoginUserUtil;

import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * @author CMM
 * @since 2023/09/28 11:15
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class NonProhibitedAreasBulkCementSalesUseManage {

    private final IBulkCementDirectReportSystemAuditRecordService auditRecordService;
    private final IBulkCementDirectReportSystemAuditInfoService auditInfoService;
    private final RegionsCacheHelper regionsCacheHelper;
    private final IBulkCementDirectReportSystemDataRelevanceService dataRelevanceService;
    private final INonProhibitedAreasBulkCementSalesUseService nonProhibitedAreasBulkCementSalesUseService;
    private final CompaniesCacheHelper companiesCacheHelper;

    public PageVo<ResDataUploadListVO> dataUploadList(ReqDataUploadListPO req) {
        UserInfoDetails userDetail = LoginUserUtil.loginUserDetail();
        Long regionId = userDetail.getRegionId();
        Page<NonProhibitedAreasBulkCementSalesUse> page = req.page();
        // 根据所属区域查出对应的散装水泥供应量数据上报记录
        LambdaQueryWrapper<NonProhibitedAreasBulkCementSalesUse> wrapper = Wrappers.lambdaQuery(NonProhibitedAreasBulkCementSalesUse.class);
        // 获取入参
        Integer reportStartYear = req.getReportStartYear();
        Integer reportEndYear = req.getReportEndYear();
        Integer auditStatus = req.getAuditStatus();
        wrapper.ge(Objects.nonNull(reportStartYear), NonProhibitedAreasBulkCementSalesUse::getReportYear, reportStartYear)
                .le(Objects.nonNull(reportEndYear), NonProhibitedAreasBulkCementSalesUse::getReportYear, reportEndYear)
                .eq(Objects.nonNull(auditStatus),NonProhibitedAreasBulkCementSalesUse::getAuditStatus,auditStatus)
                .eq(NonProhibitedAreasBulkCementSalesUse::getRegionId,regionId)
                .orderByDesc(NonProhibitedAreasBulkCementSalesUse::getReportYear);
                //.isNotNull(NonProhibitedAreasBulkCementSalesUse::getAuditInfoId);
        nonProhibitedAreasBulkCementSalesUseService.page(page,wrapper);
        List<NonProhibitedAreasBulkCementSalesUse> records = page.getRecords();
        if (CollUtil.isEmpty(records)){
            return PageVo.empty();
        }
        // 获取审核信息
        List<Long> auditInfoIdList = records.stream().map(NonProhibitedAreasBulkCementSalesUse::getAuditInfoId).collect(Collectors.toList());
        Map<Long, BulkCementDirectReportSystemAuditInfo> auditInfoMap = auditInfoService.list(Wrappers.lambdaQuery(BulkCementDirectReportSystemAuditInfo.class).in(BulkCementDirectReportSystemAuditInfo::getId, auditInfoIdList))
                .stream().collect(Collectors.toMap(BulkCementDirectReportSystemAuditInfo::getId, v -> v));
        List<ResDataUploadListVO> resVos = records.stream().map(r -> {
            ResDataUploadListVO vo = new ResDataUploadListVO();
            Integer reportYear = r.getReportYear();
            vo.setRegionId(r.getRegionId());
            vo.setReportYear(reportYear);
            vo.setAuditDataId(r.getId());
            BulkCementDirectReportSystemAuditInfo auditInfo = auditInfoMap.get(r.getAuditInfoId());
            if (Objects.nonNull(auditInfo)) {
                vo.setAuditOpinion(auditInfo.getAuditOpinion());
            }
            vo.setAuditStatus(r.getAuditStatus());
            String desc = DataUploadAuditStatusEnum.getDescByCode(r.getAuditStatus());
            vo.setAuditStatusName(desc);
            vo.setCreateOn(r.getCreateOn());
            return vo;
        }).collect(Collectors.toList());
        return PageVo.of(resVos, page.getTotal());
    }

    @Transactional(rollbackFor = Exception.class)
    public String nonProhibitedAreasDataUpload(ReqNonProhibitedAreasDataUploadPO req) {
        // 获取登录用户信息
        UserInfoDetails userDetail = LoginUserUtil.loginUserDetail();
        Integer reportYear = req.getReportYear();
        Long regionId = userDetail.getRegionId();

        // 如果登录用户为区县散办
        if (UserRoleTypeEnum.REGION_ADMIN_ROLE_ID.getId().equals(userDetail.getRoleId())) {

            VUtils.isTrue(Objects.isNull(reportYear)).throwMessage("请选择上报年份!");

            // 提交市级审核申请
            BulkCementDirectReportSystemAuditInfo cityAuditInfo = new BulkCementDirectReportSystemAuditInfo();
            assemblyAuditInfo(cityAuditInfo, DataUploadAuditStatusEnum.UNDER_AUDIT, userDetail);
            cityAuditInfo.setAuditType(DataUploadAuditTypeEnum.CITY_AUDIT.getCode());
            auditInfoService.save(cityAuditInfo);

            // 保存上报数据信息
            NonProhibitedAreasBulkCementSalesUse nonProAreasBulkCementSalesUse = new NonProhibitedAreasBulkCementSalesUse();
            // 区县的区域ID
            Long countryRegionId = userDetail.getRegionId();
            // 获取所在市的区域ID
            RegionDTO regionDto = regionsCacheHelper.getByRegionId(countryRegionId);
            Long parentId = regionDto.getParentId();
            // 判断上报月份所在市的关联数据不存在
            RegionDTO cityRegionDto = regionsCacheHelper.getByRegionId(parentId);
            BulkCementDirectReportSystemDataRelevance cityData = dataRelevanceService.getOne(Wrappers.lambdaQuery(BulkCementDirectReportSystemDataRelevance.class)
                    .eq(BulkCementDirectReportSystemDataRelevance::getRegionId, parentId)
                    .eq(BulkCementDirectReportSystemDataRelevance::getAuditType,DataUploadAuditTypeEnum.CITY_AUDIT.getCode())
                    .eq(BulkCementDirectReportSystemDataRelevance::getReportYear, reportYear)
                    .eq(BulkCementDirectReportSystemDataRelevance::getAuditDataType, UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode()));
            // 判断当前地区当前上报月份数据是否已经存在,如果已经存在，删除原数据并更新市、省关联数据列表
            checkUploadData(reportYear, regionId, cityData);
            Long dataId = req.getId();
            // 上报数据不为空，说明为重新提交
            if (Objects.nonNull(dataId)) {
                NonProhibitedAreasBulkCementSalesUse oldData = nonProhibitedAreasBulkCementSalesUseService.getById(dataId);
                VUtils.isTrue(Objects.isNull(oldData)).throwMessage("重新提交数据不存在!");
                // 更新市级关联数据
                updateCityData(cityData,oldData);
                // 删除被退回的数据
                nonProhibitedAreasBulkCementSalesUseService.removeById(oldData);
            }

            assemblyData(req, userDetail, nonProAreasBulkCementSalesUse);
            nonProAreasBulkCementSalesUse.setAuditInfoId(cityAuditInfo.getId());
            nonProAreasBulkCementSalesUse.setAuditStatus(DataUploadAuditStatusEnum.UNDER_AUDIT.getCode());
            nonProhibitedAreasBulkCementSalesUseService.saveOrUpdate(nonProAreasBulkCementSalesUse);

            // 补充数据审核表信息
            BulkCementDirectReportSystemAuditRecord auditRecord = new BulkCementDirectReportSystemAuditRecord();
            assemblyAuditRecord(userDetail, nonProAreasBulkCementSalesUse.getId(), cityAuditInfo.getId(), auditRecord);
            auditRecord.setReportYear(reportYear);
            auditRecord.setAuditType(DataUploadAuditTypeEnum.CITY_AUDIT.getCode());
            auditRecordService.save(auditRecord);

            // 补充所在市的关联数据信息
            if (Objects.isNull(cityData)) {
                BulkCementDirectReportSystemDataRelevance cityRelevanceData = new BulkCementDirectReportSystemDataRelevance();
                assemblyRelevanceData(userDetail, nonProAreasBulkCementSalesUse.getId(), reportYear, cityRelevanceData);
                cityRelevanceData.setRegionId(parentId);
                // 获取所在市散装中心所属的管理企业ID
                CompanyDTO companyDto = companiesCacheHelper.getByName(cityRegionDto.getRegionName() + VehicleContant.ADMIN_COMPANY_NAME);
                if (Objects.nonNull(companyDto)) {
                    cityRelevanceData.setCompanyId(companyDto.getId());
                }
                cityRelevanceData.setAuditType(DataUploadAuditTypeEnum.CITY_AUDIT.getCode());
                cityRelevanceData.setAuditDataType(UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode());
                // 有新上报的数据，就更新关联数据状态为未上报
                cityRelevanceData.setAuditStatus(DataUploadAuditStatusEnum.NOT_REPORT.getCode());
                dataRelevanceService.saveOrUpdate(cityRelevanceData);
            }

        }
        // 如果登录用户是市级散办,更新审核状态(未上报、被退回)为审核中，并提交省级审核信息和审核记录
        else if (UserRoleTypeEnum.BULK_CEMENT_ADMIN_ROLE_ID.getId().equals(userDetail.getRoleId())) {

            Long relevanceDataId = req.getId();
            VUtils.isTrue(Objects.isNull(relevanceDataId)).throwMessage("请传入关联数据ID!");

            // 提交省级审核申请
            BulkCementDirectReportSystemAuditInfo provinceAuditInfo = new BulkCementDirectReportSystemAuditInfo();
            assemblyAuditInfo(provinceAuditInfo, DataUploadAuditStatusEnum.UNDER_AUDIT, userDetail);
            provinceAuditInfo.setAuditType(DataUploadAuditTypeEnum.PROVINCE_AUDIT.getCode());
            auditInfoService.save(provinceAuditInfo);
            // 更新市级关联数据审核状态为审核中
            BulkCementDirectReportSystemDataRelevance cityRelevanceData = dataRelevanceService.getById(relevanceDataId);
            VUtils.isTrue(Objects.isNull(cityRelevanceData)).throwMessage("数据不存在!");
            // 关联审核信息ID
            cityRelevanceData.setUnitResponsiblePerson(req.getUnitResponsiblePerson());
            cityRelevanceData.setPreparer(req.getPreparer());
            cityRelevanceData.setReviewer(req.getReviewer());
            cityRelevanceData.setSubmissionDate(req.getSubmissionDate());
            cityRelevanceData.setAuditInfoId(provinceAuditInfo.getId());
            cityRelevanceData.setAuditStatus(DataUploadAuditStatusEnum.UNDER_AUDIT.getCode());
            cityRelevanceData.setUpdateOn(LocalDateTime.now());
            cityRelevanceData.setUpdateBy(userDetail.getUserId());
            cityRelevanceData.setUnitResponsiblePerson(req.getUnitResponsiblePerson());
            cityRelevanceData.setPreparer(req.getPreparer());
            cityRelevanceData.setReviewer(req.getReviewer());
            cityRelevanceData.setSubmissionDate(req.getSubmissionDate());
            dataRelevanceService.updateById(cityRelevanceData);

            // 判断上报月份省关联数据是否存在
            BulkCementDirectReportSystemDataRelevance provinceData = dataRelevanceService.getOne(Wrappers.lambdaQuery(BulkCementDirectReportSystemDataRelevance.class)
                    .eq(BulkCementDirectReportSystemDataRelevance::getRegionId, DefValConstants.ZJREGION_ID)
                    .eq(BulkCementDirectReportSystemDataRelevance::getAuditType,DataUploadAuditTypeEnum.PROVINCE_AUDIT.getCode())
                    .eq(BulkCementDirectReportSystemDataRelevance::getReportYear, reportYear)
                    .eq(BulkCementDirectReportSystemDataRelevance::getAuditDataType, UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode()));

            // 如果上报月份省级关联数据不存在
            // 补充省散办关联数据信息
            if (Objects.isNull(provinceData)) {
                BulkCementDirectReportSystemDataRelevance provinceRelevanceData = new BulkCementDirectReportSystemDataRelevance();
                assemblyRelevanceData(userDetail, relevanceDataId, reportYear, provinceRelevanceData);
                provinceRelevanceData.setAuditInfoId(provinceAuditInfo.getId());
                provinceRelevanceData.setRegionId(DefValConstants.ZJREGION_ID);
                provinceRelevanceData.setAuditType(DataUploadAuditTypeEnum.PROVINCE_AUDIT.getCode());
                // 获取省散装中心所属的管理企业ID
                CompanyDTO companyDto = companiesCacheHelper.getByName(DefValConstants.PROVINCE + VehicleContant.ADMIN_COMPANY_NAME);
                if (Objects.nonNull(companyDto)) {
                    provinceRelevanceData.setCompanyId(companyDto.getId());
                }
                provinceRelevanceData.setAuditDataType(UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode());
                provinceRelevanceData.setAuditStatus(DataUploadAuditStatusEnum.UNDER_AUDIT.getCode());
                dataRelevanceService.save(provinceRelevanceData);
            }

            // 创建省级审核记录
            BulkCementDirectReportSystemAuditRecord provinceAuditRecord = new BulkCementDirectReportSystemAuditRecord();
            assemblyAuditRecord(userDetail, cityRelevanceData.getId(), provinceAuditInfo.getId(), provinceAuditRecord);
            provinceAuditRecord.setReportYear(cityRelevanceData.getReportYear());
            provinceAuditRecord.setAuditType(DataUploadAuditTypeEnum.PROVINCE_AUDIT.getCode());
            auditRecordService.save(provinceAuditRecord);
        }

        return "上报成功!";
    }

    private void assemblyRelevanceData(UserInfoDetails userDetail, Long auditDataId, Integer reportYear, BulkCementDirectReportSystemDataRelevance relevanceData) {
        relevanceData.setReportYear(reportYear);
        relevanceData.setCreateOn(LocalDateTime.now());
        relevanceData.setCreateBy(userDetail.getUserId());
        relevanceData.setUpdateOn(LocalDateTime.now());
        relevanceData.setUpdateBy(userDetail.getUserId());
        relevanceData.setLastUpdateTime(LocalDateTime.now());
    }
    private void assemblyAuditRecord(UserInfoDetails userDetail, Long auditDataId, Long auditInfoId, BulkCementDirectReportSystemAuditRecord auditRecord) {
        auditRecord.setAuditDataId(auditDataId);
        auditRecord.setAuditInfoId(auditInfoId);
        auditRecord.setAuditStatus(DataUploadAuditStatusEnum.UNDER_AUDIT.getCode());
        auditRecord.setAuditDataType(UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode());
        auditRecord.setCompanyId(userDetail.getCompanyId());
        auditRecord.setRegionId(userDetail.getRegionId());
        auditRecord.setCreateOn(LocalDateTime.now());
        auditRecord.setCreateBy(userDetail.getUserId());
        auditRecord.setUpdateOn(LocalDateTime.now());
        auditRecord.setUpdateBy(userDetail.getUserId());
    }

    private void assemblyAuditInfo(BulkCementDirectReportSystemAuditInfo auditInfo, DataUploadAuditStatusEnum underAudit, UserInfoDetails userDetail) {
        auditInfo.setAuditStatus(underAudit.getCode());
        auditInfo.setAuditDataType(UploadDataTypeEnum.NON_PROHIBITED_AREAS_BULK_CEMENT_SALES_USE.getCode());
        auditInfo.setCreateOn(LocalDateTime.now());
        auditInfo.setCreateBy(userDetail.getUserId());
        auditInfo.setUpdateOn(LocalDateTime.now());
        auditInfo.setUpdateBy(userDetail.getUserId());
    }

    private void assemblyData(ReqNonProhibitedAreasDataUploadPO req, UserInfoDetails userDetail, NonProhibitedAreasBulkCementSalesUse nonProhibitedAreasBulkCementSalesUse) {
        RegionDTO regionDto = regionsCacheHelper.getByRegionId(userDetail.getRegionId());
        String regionName = regionDto.getRegionName();
        // 单位名称改成了地区
        nonProhibitedAreasBulkCementSalesUse.setRegionName(regionName);
        nonProhibitedAreasBulkCementSalesUse.setSalePointAccumulativeNum(req.getSalePointAccumulativeNum());
        nonProhibitedAreasBulkCementSalesUse.setCementCompanyBuildPointNum(req.getCementCompanyBuildPointNum());
        nonProhibitedAreasBulkCementSalesUse.setOtherInvestmentBuildPointNum(req.getOtherInvestmentBuildPointNum());
        nonProhibitedAreasBulkCementSalesUse.setSaleVolume(req.getSaleVolume());
        nonProhibitedAreasBulkCementSalesUse.setBulkCementTankNum(req.getBulkCementTankNum());
        nonProhibitedAreasBulkCementSalesUse.setBulkCementTankCapacity(req.getBulkCementTankCapacity());
        nonProhibitedAreasBulkCementSalesUse.setCementUsage(req.getCementUsage());
        nonProhibitedAreasBulkCementSalesUse.setBulkCementUsage(req.getBulkCementUsage());
        nonProhibitedAreasBulkCementSalesUse.setReadyMixedConcreteBulkCementUsage(req.getReadyMixedConcreteBulkCementUsage());
        nonProhibitedAreasBulkCementSalesUse.setCementProductsBulkCementUsage(req.getCementProductsBulkCementUsage());
        nonProhibitedAreasBulkCementSalesUse.setBulkCementUsageRate(req.getBulkCementUsageRate());
        nonProhibitedAreasBulkCementSalesUse.setReadyMixedConcreteOutput(req.getReadyMixedConcreteOutput());
        nonProhibitedAreasBulkCementSalesUse.setReportYear(req.getReportYear());
        nonProhibitedAreasBulkCementSalesUse.setRemark(req.getRemark());
        nonProhibitedAreasBulkCementSalesUse.setCompanyId(userDetail.getCompanyId());
        nonProhibitedAreasBulkCementSalesUse.setUnitResponsiblePerson(req.getUnitResponsiblePerson());
        nonProhibitedAreasBulkCementSalesUse.setPreparer(req.getPreparer());
        nonProhibitedAreasBulkCementSalesUse.setReviewer(req.getReviewer());
        nonProhibitedAreasBulkCementSalesUse.setSubmissionDate(req.getSubmissionDate());
        nonProhibitedAreasBulkCementSalesUse.setRegionId(userDetail.getRegionId());
        nonProhibitedAreasBulkCementSalesUse.setCreateOn(LocalDateTime.now());
        nonProhibitedAreasBulkCementSalesUse.setCreateBy(userDetail.getUserId());
        nonProhibitedAreasBulkCementSalesUse.setUpdateOn(LocalDateTime.now());
        nonProhibitedAreasBulkCementSalesUse.setUpdateBy(userDetail.getUserId());
    }

    private void checkUploadData(Integer reportYear, Long regionId, BulkCementDirectReportSystemDataRelevance cityData) {
        NonProhibitedAreasBulkCementSalesUse nonProhibitedAreasBulkCementSalesUse = nonProhibitedAreasBulkCementSalesUseService.getOne(Wrappers.lambdaQuery(NonProhibitedAreasBulkCementSalesUse.class)
                .eq(NonProhibitedAreasBulkCementSalesUse::getRegionId, regionId)
                .eq(NonProhibitedAreasBulkCementSalesUse::getReportYear, reportYear));
        // 判断审核状态，如果审核通过，更新审核通过的数据
        if (Objects.nonNull(nonProhibitedAreasBulkCementSalesUse) &&
                DataUploadAuditStatusEnum.AUDIT_PASS.getCode().equals(nonProhibitedAreasBulkCementSalesUse.getAuditStatus())){
            updateCityData(cityData,nonProhibitedAreasBulkCementSalesUse);
            nonProhibitedAreasBulkCementSalesUseService.removeById(nonProhibitedAreasBulkCementSalesUse);
        }
    }

    private void updateCityData(BulkCementDirectReportSystemDataRelevance cityData, NonProhibitedAreasBulkCementSalesUse nonProhibitedAreasBulkCementSalesUse) {
        if (Objects.nonNull(cityData)) {
            String auditDataIdList = cityData.getAuditDataIdList();
            if (StringUtils.isNotBlank(auditDataIdList)){
                List<Long> idList = Arrays.stream(auditDataIdList.split(StrPool.COMMA)).map(Long::valueOf).collect(Collectors.toList());
                // 将已经存在的该地区该上报月份的数据数据从关联表中删除
                idList.remove(nonProhibitedAreasBulkCementSalesUse.getId());
            }
        }
    }

    public ResNonProhibitedAreasDataUploadDetailVO getNonProhibitedAreasUploadData(ReqNonProhibitedAreasDataUploadPO req) {

        // 获取登录用户信息
        UserInfoDetails userDetail = LoginUserUtil.loginUserDetail();
        // 获取填报的数据
        Integer cementCompanyBuildPointNum = req.getCementCompanyBuildPointNum();
        Integer otherInvestmentBuildPointNum = req.getOtherInvestmentBuildPointNum();
        BigDecimal saleVolume = req.getSaleVolume();
        Integer bulkCementTankNum = req.getBulkCementTankNum();
        BigDecimal bulkCementTankCapacity = req.getBulkCementTankCapacity();
        BigDecimal cementUsage = req.getCementUsage();
        BigDecimal readyMixedConcreteBulkCementUsage = req.getReadyMixedConcreteBulkCementUsage();
        BigDecimal cementProductsBulkCementUsage = req.getCementProductsBulkCementUsage();
        BigDecimal readyMixedConcreteOutput = req.getReadyMixedConcreteOutput();
        String remark = req.getRemark();
        Integer reportYear = req.getReportYear();

        ResNonProhibitedAreasDataUploadDetailVO vo = new ResNonProhibitedAreasDataUploadDetailVO();
        vo.setSaleVolume(saleVolume);
        vo.setBulkCementTankNum(bulkCementTankNum);
        vo.setBulkCementTankCapacity(bulkCementTankCapacity);
        vo.setCementUsage(cementUsage);
        vo.setReadyMixedConcreteBulkCementUsage(readyMixedConcreteBulkCementUsage);
        vo.setCementProductsBulkCementUsage(cementProductsBulkCementUsage);
        vo.setReadyMixedConcreteOutput(readyMixedConcreteOutput);
        vo.setReportYear(reportYear);
        vo.setRemark(remark);

        // 计算各数据
        // 非禁现区散装水泥销售点合计数量: 水泥企业建点数量 + 其它投资建点数量
        if (Objects.nonNull(cementCompanyBuildPointNum) && Objects.nonNull(otherInvestmentBuildPointNum)){
            int salePointAccumulativeNum = cementCompanyBuildPointNum + otherInvestmentBuildPointNum;
            vo.setSalePointAccumulativeNum(salePointAccumulativeNum);
        }
        // 非禁现区散装水泥使用量: 生产预拌混凝土使用散装水泥量 + 生产水泥制品使用散装水泥量
        if (Objects.nonNull(readyMixedConcreteBulkCementUsage) && Objects.nonNull(cementProductsBulkCementUsage)){
            BigDecimal bulkCementUsage = readyMixedConcreteBulkCementUsage.add(cementProductsBulkCementUsage);
            vo.setBulkCementUsage(bulkCementUsage);
            // 非禁现区域散装水泥使用率：散装水泥使用量 / 水泥使用量 * 100
            if (Objects.nonNull(cementUsage)){
                BigDecimal bulkCementUsageRate = bulkCementUsage.divide(cementUsage, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100L));
                vo.setBulkCementUsageRate(bulkCementUsageRate);
            }
        }
        return vo;
    }
}
