public static BuildingResult _GetBuildingCarbonProduction(ComputationUnit building)
        {
            BuildingResult result = new BuildingResult();

            if (building.Type == BuildingType.GreenField || building.Type == BuildingType.Unknown)
            {
                return(result);
            }

            double energyUsingRatio      = 1 - building.EnergySavingCoefficient.Value / 100;
            double otherCleanEnergyRatio = Parameter.Base.OtherCleanEnergyRatio / 100;

            BuildingType computeBuildingType = building.Type;

            if (building.Type == BuildingType.Education || building.Type == BuildingType.Industry || building.Type == BuildingType.Other || building.Type == BuildingType.Office)
            {
                computeBuildingType = building.IsHighBuilding() ? BuildingType.HighOffice : BuildingType.HighOffice;
            }
            else if (building.Type == BuildingType.Residencial)
            {
                computeBuildingType = building.IsHighBuilding() ? BuildingType.HighResidencial : BuildingType.MidHighResidencial;
            }

            // 1. 建材准备
            result.Material = building.Floor * GetPrepareConstructionProduction(computeBuildingType, Parameter.Building) * energyUsingRatio;

            // 2. 建造过程
            result.Construction = building.Floor * GetConstructionProduction(computeBuildingType, building.Structure) * energyUsingRatio;

            // 3. 运行维护
            // a. 空调
            result.Maintenance.AirConditioning = building.Floor *
                                                 GetOperationProduction(computeBuildingType, Parameter.Maintenance.AirConditioning) *
                                                 Parameter.Base.ElectricityProductionFactor *
                                                 (1 - otherCleanEnergyRatio) * energyUsingRatio;
            // b. 照明
            result.Maintenance.Lighting = building.Floor *
                                          GetOperationProduction(computeBuildingType, Parameter.Maintenance.Lighting) *
                                          Parameter.Base.ElectricityProductionFactor * (1 - otherCleanEnergyRatio) *
                                          energyUsingRatio;
            // c. 设备
            result.Maintenance.Equipment = building.Floor *
                                           GetOperationProduction(computeBuildingType, Parameter.Maintenance.Equipment) *
                                           Parameter.Base.ElectricityProductionFactor * (1 - otherCleanEnergyRatio) *
                                           energyUsingRatio;
            // d. 供暖
            result.Maintenance.Heating = building.Floor *
                                         GetOperationProduction(computeBuildingType, Parameter.Maintenance.Heating) *
                                         Parameter.Base.GasProductionFactor * (1 - otherCleanEnergyRatio) *
                                         energyUsingRatio;

            // 4. 拆毁回收
            result.Recycle = building.Floor * GetRecycleProduction(computeBuildingType, building.Structure) * energyUsingRatio;

            return(result);
        }
        public static BuildingResult GetBuildingCarbonProduction(ComputationUnit building)
        {
            BuildingResult result = new BuildingResult();

            if (building.Type == BuildingType.Mixed)
            {
                List <BuildingResult> resultList = new List <BuildingResult>();
                if (building.MixEducationPercent != 0.0 || building.MixIndustryPercent != 0.0 ||
                    building.MixOfficePercent != 0.0 || building.MixOtherPercent != 0.0)    // 教育和工业属同一类型:办公
                {
                    ComputationUnit tmp = new ComputationUnit(building);
                    tmp.Area = building.Area * (building.MixEducationPercent + building.MixIndustryPercent + building.MixOfficePercent + building.MixOtherPercent);
                    if (tmp.IsHighBuilding())
                    {
                        tmp.Type = BuildingType.HighOffice;
                    }
                    else
                    {
                        tmp.Type = BuildingType.MidHighOffice;
                    }
                    resultList.Add(_GetBuildingCarbonProduction(tmp));
                }
                if (building.MixGreenFieldPercent != 0.0)
                {
                    ComputationUnit tmp = new ComputationUnit(building);
                    tmp.Area = building.Area * building.MixRetailPercent;
                    tmp.Type = BuildingType.GreenField;
                    resultList.Add(_GetBuildingCarbonProduction(tmp));
                }
                if (building.MixHotelPercent != 0.0)
                {
                    ComputationUnit tmp = new ComputationUnit(building);
                    tmp.Area = building.Area * building.MixHotelPercent;
                    tmp.Type = BuildingType.Hotel;
                    resultList.Add(_GetBuildingCarbonProduction(tmp));
                }
                if (building.MixResidencialPercent != 0.0)
                {
                    ComputationUnit tmp = new ComputationUnit(building);
                    tmp.Area = building.Area * building.MixResidencialPercent;
                    if (tmp.IsHighBuilding())
                    {
                        tmp.Type = BuildingType.HighResidencial;
                    }
                    else
                    {
                        tmp.Type = BuildingType.MidHighResidencial;
                    }
                    resultList.Add(_GetBuildingCarbonProduction(tmp));
                }
                if (building.MixRetailPercent != 0.0)
                {
                    ComputationUnit tmp = new ComputationUnit(building);
                    tmp.Area = building.Area * building.MixRetailPercent;
                    tmp.Type = BuildingType.Retail;
                    resultList.Add(_GetBuildingCarbonProduction(tmp));
                }
                foreach (var r in resultList)
                {
                    result.Material     += r.Material;
                    result.Construction += r.Construction;
                    result.Maintenance.AirConditioning += r.Maintenance.AirConditioning;
                    result.Maintenance.Lighting        += r.Maintenance.Lighting;
                    result.Maintenance.Equipment       += r.Maintenance.Equipment;
                    result.Maintenance.Heating         += r.Maintenance.Heating;
                    result.Recycle += r.Recycle;
                }
                building.CarbonProduction = result;
                return(result);
            }
            else
            {
                result = _GetBuildingCarbonProduction(building);
            }
            building.CarbonProduction = result;
            return(result);
        }