class 投资估算类:
	def __init__(self, 热力系统总设备价格, 热力系统总设备安装费, 数据, 是否有电力接入费 = True):
		self.数据 = 数据
		self.投资估算结果array = []
		# 土建工程
		self.土建工程 = {
			'建筑': 数据.数据索引['土建工程建筑'] ,
			'设备': 0,
			'安装': 0,
			'其他': 0,
		}

		# 热力系统
		self.热力系统 = {
			'建筑': 0,
			'设备': 热力系统总设备价格,
			'安装': 热力系统总设备安装费,
			'其他': 0
		}
		总值 = 0
		for value in self.热力系统.values():
			总值 += value
		self.热力系统['总值'] = 总值

		# 辅助设施
		self.辅助设施 = {
			'建筑': 0,
			'设备': self.热力系统['设备'] * 数据.数据索引['辅助设施设备占工艺系统总投资比例'],
			'其他': 0,
		}
		self.辅助设施['安装'] = self.辅助设施['设备'] * 数据.数据索引['辅助设施安装占辅助设施设备比例']
		总值 = 0
		for value in self.辅助设施.values():
			总值 += value
		self.辅助设施['总值'] = 总值

		# 工艺系统
		self.工艺系统 = {
			'建筑': 0,
			'设备': self.投资估算取值(self.热力系统['设备'] + self.辅助设施['设备'], 数据.数据索引['工艺系统_设备_设定值']),
			'安装': self.投资估算取值(self.热力系统['安装'] + self.辅助设施['安装'], 数据.数据索引['工艺系统_安装_设定值']),
			'其他': 0,
		}

		# 电气系统
		self.电气系统 = {
			'建筑': 0,
			'设备': self.投资估算取值(self.工艺系统['设备'] * 数据.数据索引['电气工程系统设备占工艺系统总投资比例'], 数据.数据索引['电气系统_设备_设定值']),
			'其他': 0,
		}
		self.电气系统['安装'] = self.投资估算取值(self.电气系统['设备'] * 数据.数据索引['电气工程系统安装占电气工程系统设备比例'], 数据.数据索引['电气系统_安装_设定值'])

		# 自控系统
		self.自控系统 = {
			'建筑': 0,
			'设备': self.投资估算取值(self.工艺系统['设备'] * 数据.数据索引['智能控制系统设备占工艺系统总投资比例'], 数据.数据索引['自控系统_设备_设定值']),
			'其他': 0,
		}
		self.自控系统['安装'] = self.投资估算取值(self.自控系统['设备'] * 数据.数据索引['智能控制系统安装占智能控制系统设备比例'], 数据.数据索引['自控系统_安装_设定值'])

		# 室外管网
		self.室外管网 = {
			'建筑': 0,
			'设备': self.投资估算取值(数据.数据索引['管网投资总费用'] * (1 - 数据.数据索引['管网投资安装占管网投资总费用比例']), 数据.数据索引['室外管网_设备_设定值']),
			'安装': self.投资估算取值(数据.数据索引['管网投资总费用'] * 数据.数据索引['管网投资安装占管网投资总费用比例'], 数据.数据索引['室外管网_安装_设定值']),
			'其他': 0,
		}

		# 辅助工程
		self.辅助工程 = {
			'建筑': 0,
			'设备': 数据.数据索引['辅助工程_设备_设定值'],
			'安装': 数据.数据索引['辅助工程_安装_设定值'],
			'其他': 0,
		}

		# 光伏系统
		self.光伏系统 = {
			'建筑': 0,
			'设备': 0,
			'安装': 0,
			'其他': 0
		}

		# 电力接入费
		if 是否有电力接入费 is True:
			电力接入费_安装 = 数据.数据索引['电力接入费']
		else:
			电力接入费_安装 = 0
		self.电力接入费_其他 = 0
		self.电力接入费 = {
			'建筑': 0,
			'设备': 0,
			'安装': 电力接入费_安装,
			'其他': 0
		}

		# 燃气工程费
		self.燃气工程费 = {
			'建筑': 0,
			'设备': 0,
			'安装': 数据.数据索引['燃气工程费'],
			'其他': 0,
		}

		self.工程费用索引 = {
			'土建工程': self.土建工程,
			'工艺系统': self.工艺系统,
			'电气系统': self.电气系统,
			'自控系统': self.自控系统,
			'室外管网': self.室外管网,
			'辅助工程': self.辅助工程,
			'光伏系统': self.光伏系统,
			'电力接入费': self.电力接入费,
			'燃气工程费': self.燃气工程费,
		}

		for I类费用子项 in self.工程费用索引.values():
			总值 = 0
			for value in I类费用子项.values():
				总值 += value
			I类费用子项['总值'] = 总值


		self.工程费用合计 = 0
		self.工程费用_建筑合计 = 0
		self.工程费用_设备合计 = 0
		self.工程费用_安装合计 = 0
		self.工程费用_其他合计 = 0
		for value in self.工程费用索引.values():
			self.工程费用合计 += value['总值']
			self.工程费用_建筑合计 += value['建筑']
			self.工程费用_设备合计 += value['设备']
			self.工程费用_安装合计 += value['安装']
			self.工程费用_其他合计 += value['其他']

		self.工程费用索引['工程费用'] = {
			'建筑': self.工程费用_建筑合计,
			'设备': self.工程费用_设备合计,
			'安装': self.工程费用_安装合计,
			'其他': self.工程费用_其他合计,
			'总值': self.工程费用合计,
		}

		self.工程建设其他费用索引 = {
			'设计费': self.投资估算取值(self.计算设计勘察费(self.工程费用合计), 数据.数据索引['设计费_设定值']),
			'建设单位管理费': self.投资估算取值(self.计算建设单位管理费(self.工程费用合计), 数据.数据索引['设单位管理费_设定值']),
			'联合试运转费': self.投资估算取值((self.工程费用_设备合计 + self.工程费用_安装合计) * 0.015, 数据.数据索引['联合试运转费_设定值']),
			'土地费': 数据.数据索引['土地费'],
			'办公及家具购置费': self.投资估算取值(self.数据.数据索引['人数'] * 2000, 数据.数据索引['办公及家具购置费_设定值']),
			'进场培训费': self.投资估算取值(0, 数据.数据索引['进场培训费_设定值']),
			'前期咨询费用': self.投资估算取值(self.计算前期咨询费用(self.工程费用合计), 数据.数据索引['前期咨询费用_设定值']),
			'监理费': self.投资估算取值(self.计算监理费用(self.工程费用合计, (self.工程费用_设备合计 + self.工程费用_安装合计) * 0.015), 数据.数据索引['监理费_设定值']),
			'工程保险费': self.投资估算取值(self.工程费用合计 * 0.005, 数据.数据索引['工程保险费_设定值']),
			'项目建设服务费': self.投资估算取值(self.工程费用合计 * 0.05, 数据.数据索引['项目建设服务费_设定值']),
			'招投标费用': self.投资估算取值(self.计算招投标费用(self.工程费用合计), 数据.数据索引['招投标费用_设定值']),
			'特种设备安全监督检验费': self.投资估算取值(0, 数据.数据索引['特种设备安全监督检验费_设定值']),
			'勘察费': self.投资估算取值(0, 数据.数据索引['勘察费_设定值']),
			'设备采买费': self.投资估算取值(0, 数据.数据索引['设备采买费_设定值']),
		}
		self.工程建设其他费用合计 = 0
		for value in self.工程建设其他费用索引.values():
			self.工程建设其他费用合计 += value
		self.工程建设其他费用索引['工程建设其他费用合计'] = self.工程建设其他费用合计

		self.一二类总费用 = self.工程费用合计 + self.工程建设其他费用合计
		self.基本预备费 = self.一二类总费用 * 数据.数据索引['基本预备费占一二类总费用比例']
		self.收购费用 = 数据.数据索引['收购费用']
		self.建设投资 = self.一二类总费用 + self.基本预备费 + self.收购费用
		self.生成投资估算结果二维表()


	def 计算设计勘察费(self, 工程费用合计):
		return (0.0301 * 工程费用合计 / 10000 + 8.0392) * 10000

	def 计算建设单位管理费(self, 工程费用合计):
		# 此处工程总投资仅为估算值,有待进一步完善
		工程总投资估算 = 工程费用合计 * 1.17
		listx = [1000, 5000, 10000, 50000, 100000, 200000, 280000]
		listy = [15, 63, 113, 433, 683, 883, 963]
		建设单位管理费 = self.线性插值(listx, listy, (工程总投资估算) / 10000) * 10000
		return 建设单位管理费

	def 计算监理费用(self, 工程费用合计, 联合试运转费):
		listx = [3000, 5000]
		listy = [30, 50]
		监理费用 = self.线性插值(listx, listy, (工程费用合计 + 联合试运转费) / 10000) * 10000
		return 监理费用

	def 计算前期咨询费用(self, 工程费用合计):
		listx = [3000, 5000, 8000]
		listy = [150, 200, 300]
		前期咨询费用 = self.线性插值(listx, listy, 工程费用合计 / 10000) * 10000
		return 前期咨询费用

	def 计算招投标费用(self, 工程费用合计):
		listx = [100, 500, 1000, 5000, 10000, 100000]
		listy = [0.01, 0.007, 0.0055, 0.0035, 0.002, 0.0005]
		招投标费用 = self.线性插值(listx, listy, 工程费用合计 / 10000) * 工程费用合计
		return 招投标费用

	def 线性插值(self, listx, listy, x):
		if x < min(listx):
			x1 = listx[0]
			x2 = listx[1]
			y1 = listy[0]
			y2 = listy[1]
			k = (y2 - y1) / (x2 - x1)
			y = y1 - k * (x1 - x)
		elif x > max(listx):
			x1 = listx[len(listx) - 2]
			x2 = listx[len(listx) - 1]
			y1 = listy[len(listx) - 2]
			y2 = listy[len(listx) - 1]
			k = (y2 - y1)/(x2 - x1)
			y = y2 + k * (x - x2)
		else:
			for index, item in enumerate(listx):
				if item > x:
					x1 = listx[index - 1]
					x2 = listx[index]
					y1 = listy[index - 1]
					y2 = listy[index]
					y = y1 + (y2 - y1) / (x2 - x1) * (x - x1)
					break
		return y

	def 投资估算取值(self, x, y):
		if self.数据.数据索引['采用投资估算设定值赋值'] == '是' and y > 0:
			return y
		else:
			return x

	def 生成投资估算结果二维表(self):
		array = []
		工程费用索引 = self.工程费用索引
		工程建设其他费用索引 = self.工程建设其他费用索引
		# 一类费用
		array.append(['I', '工程费用', '建筑', '设备', '安装', '其他', '总值'])
		i = 1
		工程费用列表 = [
			['土建工程', self.土建工程],
			['工艺系统', self.工艺系统],
			['电气系统', self.电气系统],
			['自控系统', self.自控系统],
			['室外管网', self.室外管网],
			['辅助工程', self.辅助工程],
			['光伏系统', self.光伏系统],
			['电力接入费', self.电力接入费],
			['燃气工程费', self.燃气工程费],
		]
		for 工程费用 in 工程费用列表:
			row = [str(i), 工程费用[0]]
			row.append(工程费用[1]['建筑'])
			row.append(工程费用[1]['设备'])
			row.append(工程费用[1]['安装'])
			row.append(工程费用[1]['其他'])
			row.append(工程费用[1]['总值'])
			array.append(row)
			i = i + 1
		# 二类费用
		array.append(['II', '工程建设其他费用'] + [''] * 5)
		i = 1
		工程建设其他费用列表 = [
			['设计费',self.工程建设其他费用索引['设计费']],
			['建设单位管理费',self.工程建设其他费用索引['建设单位管理费']],
			['联合试运转费',self.工程建设其他费用索引['联合试运转费']],
			['土地费',self.工程建设其他费用索引['土地费']],
			['办公及家具购置费',self.工程建设其他费用索引[ '办公及家具购置费']],
			['进场培训费',self.工程建设其他费用索引['进场培训费']],
			['前期咨询费用',self.工程建设其他费用索引['前期咨询费用']],
			['监理费',self.工程建设其他费用索引['监理费']],
			['工程保险费',self.工程建设其他费用索引['工程保险费']],
			['项目建设服务费',self.工程建设其他费用索引['项目建设服务费']],
			['招投标费用',self.工程建设其他费用索引['招投标费用']],
			['特种设备安全监督检验费',self.工程建设其他费用索引['特种设备安全监督检验费']],
			['勘察费',self.工程建设其他费用索引[ '勘察费']],
			['设备采买费',self.工程建设其他费用索引['设备采买费']],
			['工程建设其他费用合计',self.工程建设其他费用索引['工程建设其他费用合计']],
		]
		for item in 工程建设其他费用列表:
			row = [str(i), item[0]] + [0] * 3 + [item[1]] * 2
			array.append(row)
			i = i + 1

		array.append(['I+II', ''] + [''] * 4 + [self.一二类总费用])
		array.append(['III', '基本预备费'] + [''] * 3 + [self.基本预备费] * 2)
		array.append(['IV', '收购费用'] + [''] + [self.收购费用] + [''] * 2 + [self.收购费用])
		array.append(
			['V', '建设项目总造价']
			+ [self.工程费用_建筑合计,
			   self.工程费用_设备合计 + self.收购费用,
			   self.工程费用_安装合计,
			   self.工程费用_其他合计,
			   self.一二类总费用 + self.基本预备费 + self.收购费用]
		)

		for i, row in enumerate(array):
			for j, value in enumerate(row):
				try:
					array[i][j] = int(value / 10000)
				except TypeError:
					pass

		self.投资估算结果array = array
