ln %!s(int64=2) %!d(string=hai) anos
pai
achega
74cf61a298

+ 74 - 1
src/api/realtimeDatabaseConfiguration.js

@@ -19,8 +19,81 @@ const deleteDatabase =(data)=>{
       method:"delete",
   })
 }
+
+// 设备厂商
+const manufacturer =(data)=>{
+  return request({
+      url:`/manufacturer/listByPage?name=${encodeURIComponent(data.name)}&pageNum=${data.pageNum}&pageSize=${data.pageSize}`,
+      method:"get"
+  })
+}
+const addManufacturer =(pairs)=>{
+  return request({
+      url:`/manufacturer/save`,
+      method:"post",
+      data: pairs
+  })
+}
+const deleteManufacturer =(data)=>{
+  return request({
+      url:`/manufacturer/remove-manufacturer/${data.id}`,
+      method:"delete",
+  })
+}
+
+// 设备类型
+const modelpower =(data)=>{
+  return request({
+      url:`/modelpower/listByPage?name=${encodeURIComponent(data.name)}&pageNum=${data.pageNum}&pageSize=${data.pageSize}`,
+      method:"get"
+  })
+}
+const addModelpower =(pairs)=>{
+  return request({
+      url:`/modelpower/save`,
+      method:"post",
+      data: pairs
+  })
+}
+const deleteModelpower =(data)=>{
+  return request({
+      url:`/modelpower/remove-modelpower/${data.id}`,
+      method:"delete",
+  })
+}
+
+// 变电所
+const windsubstation =(data)=>{
+  return request({
+      url:`/windsubstation/listByPage?name=${encodeURIComponent(data.name)}&pageNum=${data.pageNum}&pageSize=${data.pageSize}`,
+      method:"get"
+  })
+}
+const addWindsubstation =(pairs)=>{
+  return request({
+      url:`/windsubstation/save`,
+      method:"post",
+      data: pairs
+  })
+}
+const deleteWindsubstation =(data)=>{
+  return request({
+      url:`/windsubstation/remove-windsub/${data.id}`,
+      method:"delete",
+  })
+}
+
 export default {
 	database,
 	addDatabase,
-	deleteDatabase
+	deleteDatabase,
+	addManufacturer,
+	addModelpower,
+	addWindsubstation,
+	manufacturer,
+	modelpower,
+	windsubstation,
+	deleteManufacturer,
+	deleteModelpower,
+	deleteWindsubstation,
 }

+ 22 - 0
src/api/station.js

@@ -163,7 +163,23 @@ const deleteMeterpoint =(data)=>{
       method:"delete",
   })
 }
+<<<<<<< HEAD
 >>>>>>> 143692c9b11945a0b3169f618acc848858072d41
+=======
+
+const getStationPersis =(data)=>{
+  return request({
+		url:`/windpowerstation/getStationPersis?station=${data.station}&startdate=${data.startdate}&enddate=${data.enddate}`,
+		method:"get"
+  })
+}
+const getAdmList =(data)=>{
+  return request({
+		url:`/windpowerstation/getAdmList?companyid=${data.companyid}&regionid=${data.regionid}`,
+		method:"get"
+  })
+}
+>>>>>>> 6c7b043eaee33b02a500d8aec5db233f9c3220a9
 export default {
   companys,
   addCompanys,
@@ -192,6 +208,12 @@ export default {
 	deleteEquipmentmodel,
 	meterpoint,
 	addMeterpoint,
+<<<<<<< HEAD
 	deleteMeterpoint
 >>>>>>> 143692c9b11945a0b3169f618acc848858072d41
+=======
+	deleteMeterpoint,
+	getStationPersis,
+	getAdmList
+>>>>>>> 6c7b043eaee33b02a500d8aec5db233f9c3220a9
 };

+ 30 - 0
src/api/table.js

@@ -45,12 +45,36 @@ const removeIndicators =(data)=>{
       method:"delete",
   })
 }
+<<<<<<< HEAD
 const newtreeTreels=(data)=>{
   return request({ 
       url:`/newtree/treels?tag=${data.tag}`,
       method:"get"
   })
 }
+=======
+
+// 可研电量
+const projectstudy =(data)=>{
+  return request({
+      url:`/projectstudy/List?name=${encodeURIComponent(data.name)}&pageNum=${data.pageNum}&pageSize=${data.pageSize}`,
+      method:"get"
+  })
+}
+const addProjectstudy =(pairs)=>{
+  return request({
+      url:`/projectstudy/add`,
+      method:"post",
+      data: pairs
+  })
+}
+const deleteProjectstudy =(data)=>{
+  return request({
+      url:`/projectstudy/remove-study/${data.id}`,
+      method:"delete",
+  })
+}
+>>>>>>> 6c7b043eaee33b02a500d8aec5db233f9c3220a9
 export default {
   projectplan,
   addProjectplan,
@@ -59,5 +83,11 @@ export default {
   indicators,
   addIndicators,
   removeIndicators,
+<<<<<<< HEAD
   newtreeTreels
+=======
+	addProjectstudy,
+	projectstudy,
+	deleteProjectstudy
+>>>>>>> 6c7b043eaee33b02a500d8aec5db233f9c3220a9
 };

+ 42 - 0
src/router/index.js

@@ -122,6 +122,48 @@ export const asyncRoutes = [
           import('@/views/stationConfiguration/equipmentmodel/index'),
         meta: { title: '设备型号' },
       },
+			{
+        path: 'manufacturer',
+        name: 'manufacturer',
+        component: () =>
+          import('@/views/stationConfiguration/manufacturer/index'),
+        meta: { title: '设备厂商' },
+      },
+			{
+        path: 'modelpower',
+        name: 'modelpower',
+        component: () =>
+          import('@/views/stationConfiguration/modelpower/index'),
+        meta: { title: '设备类型' },
+      },
+			{
+        path: 'windsubstation',
+        name: 'windsubstation',
+        component: () =>
+          import('@/views/stationConfiguration/windsubstation/index'),
+        meta: { title: '变电所' },
+      },
+			{
+        path: 'projectstudy',
+        name: 'projectstudy',
+        component: () =>
+          import('@/views/stationConfiguration/projectstudy/index'),
+        meta: { title: '可研电量' },
+      },
+			{
+        path: 'admlist',
+        name: 'admlist',
+        component: () =>
+          import('@/views/stationConfiguration/admlist/index'),
+        meta: { title: '装机量管理' },
+      },
+			{
+        path: 'stationpersis',
+        name: 'stationpersis',
+        component: () =>
+          import('@/views/stationConfiguration/stationpersis/index'),
+        meta: { title: '场站功率图表' },
+      },
     ],
   },
   {

+ 234 - 0
src/views/stationConfiguration/admlist/index.vue

@@ -0,0 +1,234 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<div class="title">
+				<div class="left">
+					<!-- <div class="left-item">
+						<div style="width: 70px;">名称:</div>
+						<el-input v-model="fuzzyQuery_name" placeholder="请输入" clearable />
+					</div>
+					<el-button icon="el-icon-search" type="primary" native-type="submit" @click="fetchData">
+						查询
+					</el-button> -->
+				</div>
+				<div class="right">
+					<!-- <el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+						添加
+					</el-button>
+					<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+						删除
+					</el-button> -->
+					<!-- <UploadExcel style="margin-left: 10px;" @getResult="getMyExcelData"></UploadExcel> -->
+					<ExportExcel :exportList="exportExcel" :useType="'export'" partsName="装机量"></ExportExcel>
+					<!-- <ExportExcel :exportList="templateExcel" :useType="'template'" partsName="设备类型模板"></ExportExcel> -->
+				</div>
+			</div>
+			<el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+				:height="height" @selection-change="setSelectRows">
+				<!-- <el-table-column show-overflow-tooltip type="selection" width="40"></el-table-column> -->
+				<el-table-column show-overflow-tooltip label="id" prop="id" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="编号" prop="code" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="名称" prop="name" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="装机容量" prop="capacity" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="装机容量单位" prop="capacityunit" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="装机台数" prop="quantity" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="机型" prop="model" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="厂家" prop="systemmanufact" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="地址" prop="address" align="center" sortable>
+				</el-table-column>
+				<!-- <el-table-column show-overflow-tooltip label="操作" width="100px" fixed="right">
+					<template #default="{ row }">
+						<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+						<el-button type="text" @click="handleDelete(row)">删除</el-button>
+					</template>
+				</el-table-column> -->
+			</el-table>
+		</vab-query-form>
+	</div>
+</template>
+<script>
+import UploadExcel from '@/components/UploadExcel/index'
+import ExportExcel from '@/components/ExportExcel/index'
+import api from '@/api/realtimeDatabaseConfiguration'
+import stationApi from '@/api/station'
+export default {
+	components: {
+		UploadExcel,
+		ExportExcel,
+	},
+	data() {
+		return {
+			fuzzyQuery_name: '',
+			listLoading: true,
+			list: [],
+			options: [],
+			exportExcel: [],
+			templateExcel: [],
+			elementLoadingText: '正在加载...',
+			selectRows: '',
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			exportList: [],
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+			},
+			stationList: [],
+			selectValue: ''
+		};
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		// this.getStation()
+		this.fetchData()
+	},
+	watch: {
+		'$route'() {
+			this.fetchData()
+		}
+	},
+	methods: {
+		getMyExcelData(val) {
+			val.forEach(item => {
+				api.addModelpower(item).then(res => {
+					if (res.code == 200) {
+						this.$message({
+							type: 'success',
+							message: '添加成功!'
+						});
+						this.fetchData()
+					}
+				})
+			})
+		},
+		getStation() {
+			stationApi.windpowerstationList({
+				id: '',
+				name: '',
+				companyid: '',
+				pageNum: 1,
+				pageSize: 1000,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.stationList = res.data.records
+				}
+			})
+		},
+		fetchData() {
+			stationApi.getAdmList({
+				companyid: this.$route.query.companyid || '',
+				regionid: this.$route.query.regionid || '',
+				// name: this.fuzzyQuery_name,
+				// pageNum: this.queryForm.pageNo,
+				// pageSize: this.queryForm.pageSize,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					// this.total = res.data.total
+					this.list = res.data
+					this.templateExcel = [
+						{
+							id: '',
+							code: '',
+							name: '',
+							capacity: '',
+							capacityunit: '',
+							quantity: '',
+							model: '',
+							systemmanufact: '',
+							address: ''
+						}
+					]
+					// 导出
+					let exportExcel = []
+					res.data.forEach(item => {
+						exportExcel.push({
+							id: item.id,
+							code: item.code,
+							name: item.name,
+							capacity: item.capacity,
+							capacityunit: item.capacityunit,
+							quantity: item.quantity,
+							model: item.model,
+							systemmanufact: item.systemmanufact,
+							address: item.address
+						})
+					})
+					this.exportExcel = exportExcel
+				}
+			})
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id || this.selectRows.length > 0) {
+				this.$baseConfirm('你确定要删除吗', null, async () => {
+					let ids = ''
+					if (this.selectRows.length > 0) {
+						ids = this.selectRows.map((item) => item.id).join()
+					}
+					api.deleteModelpower({
+						id: row.id || ids
+					}).then(res => {
+						if (res.data) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				this.$baseMessage('未选中任何行', 'error')
+				return false
+			}
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20px;
+}
+
+.left {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+
+	.left-item {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		margin-right: 10px;
+	}
+}
+</style>

+ 127 - 0
src/views/stationConfiguration/manufacturer/components/TableEdit.vue

@@ -0,0 +1,127 @@
+<template>
+	<el-dialog :title="title" :visible.sync="dialogFormVisible" width="800px" @close="close">
+		<el-form ref="form" :model="form" :rules="rules">
+			<div class="lists">
+				<el-form-item label="id" prop="id">
+					<el-input class="inputs" v-model="form.id" autocomplete="off" :disabled="!idAdd?true:false"></el-input>
+				</el-form-item>
+				<el-form-item label="名称" prop="name">
+					<el-input class="inputs" v-model.trim="form.name" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="国家地区" prop="country">
+					<el-input class="inputs" v-model="form.country" autocomplete="off"></el-input>
+				</el-form-item>
+				<el-form-item label="地址" prop="address">
+					<el-input class="inputs" v-model="form.address" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="电话" prop="telephone">
+					<el-input class="inputs" v-model="form.telephone" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+		</el-form>
+		<div slot="footer" class="dialog-footer">
+			<el-button @click="close">取 消</el-button>
+			<el-button type="primary" @click="save">确 定</el-button>
+		</div>
+	</el-dialog>
+</template>
+
+<script>
+import api from '@/api/realtimeDatabaseConfiguration'
+import dayjs from "dayjs";
+export default {
+	name: 'TableEdit',
+	props: {
+		options: {
+			type: Array,
+			default: []
+		},
+		stationList: {
+			type: Array,
+			default: []
+		},
+	},
+	data() {
+		return {
+			form: {
+				id: '',
+				name: '',
+				country: '',
+				address: '',
+				telephone: ''
+			},
+			rules: {
+				id: [{ required: true, trigger: 'blur', message: '请输入' }],
+				name: [{ required: true, trigger: 'blur', message: '请输入' }],
+				country: [{ required: true, trigger: 'blur', message: '请输入' }],
+				address: [{ required: true, trigger: 'blur', message: '请输入' }],
+				telephone: [{ required: true, trigger: 'blur', message: '请输入' }],
+			},
+			title: '',
+			dialogFormVisible: false,
+			idAdd: true,
+		}
+	},
+	created() { },
+	methods: {
+		showEdit(row) {
+			if (!row) {
+				this.title = '添加'
+				this.idAdd = true
+			} else {
+				this.title = '编辑'
+				this.idAdd = false
+				this.form = Object.assign({}, row)
+			}
+			this.dialogFormVisible = true
+		},
+		close() {
+			this.$refs['form'].resetFields()
+			this.form = this.$options.data().form
+			this.dialogFormVisible = false
+			this.$emit('fetch-data')
+		},
+		save() {
+			this.$refs['form'].validate(async (valid) => {
+				if (valid) {
+					api.addManufacturer(this.form).then(res => {
+						if (res.data) {
+							this.$message({
+								type: 'success',
+								message: '添加成功!'
+							});
+							this.$emit('save-success');
+							this.dialogFormVisible = false
+						}
+					})
+				} else {
+					return false
+				}
+			})
+		},
+		handleChange() {
+		},
+		onBlur(val, param) {
+			if (typeof (this.form[param]) !== 'number') {
+				this.form[param] = val.replace(/[^0-9]/ig, "")
+			}
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.inputs {
+	width: 200px;
+}
+
+.lists {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+}
+</style>

+ 217 - 0
src/views/stationConfiguration/manufacturer/index.vue

@@ -0,0 +1,217 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<div class="title">
+				<div class="left">
+					<div class="left-item">
+						<div style="width: 70px;">名称:</div>
+						<el-input v-model="fuzzyQuery_name" placeholder="请输入" clearable />
+					</div>
+					<el-button icon="el-icon-search" type="primary" native-type="submit" @click="fetchData">
+						查询
+					</el-button>
+				</div>
+				<div class="right">
+					<el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+						添加
+					</el-button>
+					<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+						删除
+					</el-button>
+					<UploadExcel style="margin-left: 10px;" @getResult="getMyExcelData"></UploadExcel>
+					<ExportExcel :exportList="exportExcel" :useType="'export'" partsName="设备厂商"></ExportExcel>
+					<ExportExcel :exportList="templateExcel" :useType="'template'" partsName="设备厂商模板"></ExportExcel>
+				</div>
+			</div>
+			<el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+				:height="height" @selection-change="setSelectRows">
+				<el-table-column show-overflow-tooltip type="selection" width="40"></el-table-column>
+				<el-table-column show-overflow-tooltip label="id" prop="id" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="名称" prop="name" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="国家地区" prop="country" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="地址" prop="address" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="电话" prop="telephone" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="操作" width="100px" fixed="right">
+					<template #default="{ row }">
+						<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+						<el-button type="text" @click="handleDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination :background="background" :current-page="queryForm.pageNo" :layout="layout"
+				:page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange"
+				@size-change="handleSizeChange"></el-pagination>
+			<table-edit ref="edit" :options="options" :stationList="stationList" @save-success="fetchData"></table-edit>
+		</vab-query-form>
+	</div>
+</template>
+<script>
+import UploadExcel from '@/components/UploadExcel/index'
+import ExportExcel from '@/components/ExportExcel/index'
+import api from '@/api/realtimeDatabaseConfiguration'
+import stationApi from '@/api/station'
+import TableEdit from './components/TableEdit'
+export default {
+	components: {
+		UploadExcel,
+		ExportExcel,
+		TableEdit,
+	},
+	data() {
+		return {
+			fuzzyQuery_name: '',
+			listLoading: true,
+			list: [],
+			options: [],
+			exportExcel: [],
+			templateExcel: [],
+			elementLoadingText: '正在加载...',
+			selectRows: '',
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			exportList: [],
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+			},
+			stationList: [],
+			selectValue: ''
+		};
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		// this.getStation()
+		this.fetchData()
+	},
+	methods: {
+		getMyExcelData(val) {
+			val.forEach(item => {
+				api.addManufacturer(item).then(res => {
+					if (res.code == 200) {
+						this.$message({
+							type: 'success',
+							message: '添加成功!'
+						});
+						this.fetchData()
+					}
+				})
+			})
+		},
+		getStation() {
+			stationApi.windpowerstationList({
+				id: '',
+				name: '',
+				companyid: '',
+				pageNum: 1,
+				pageSize: 1000,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.stationList = res.data.records
+				}
+			})
+		},
+		fetchData() {
+			api.manufacturer({
+				name: this.fuzzyQuery_name,
+				pageNum: this.queryForm.pageNo,
+				pageSize: this.queryForm.pageSize,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.total = res.data.total
+					this.list = res.data.records
+					this.templateExcel = [
+						{
+							id: '',
+							name: '',
+							country: '',
+							address: '',
+							telephone: ''
+						}
+					]
+					// 导出
+					let exportExcel = []
+					res.data.records.forEach(item => {
+						exportExcel.push({
+							id: item.id,
+							name: item.name,
+							country: item.country,
+							address: item.address,
+							telephone: item.telephone
+						})
+					})
+					this.exportExcel = exportExcel
+				}
+			})
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id || this.selectRows.length > 0) {
+				this.$baseConfirm('你确定要删除吗', null, async () => {
+					let ids = ''
+					if (this.selectRows.length > 0) {
+						ids = this.selectRows.map((item) => item.id).join()
+					}
+					api.deleteManufacturer({
+						id: row.id || ids
+					}).then(res => {
+						if (res.data) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				this.$baseMessage('未选中任何行', 'error')
+				return false
+			}
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20px;
+}
+
+.left {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+
+	.left-item {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		margin-right: 10px;
+	}
+}
+</style>

+ 128 - 0
src/views/stationConfiguration/modelpower/components/TableEdit.vue

@@ -0,0 +1,128 @@
+<template>
+	<el-dialog :title="title" :visible.sync="dialogFormVisible" width="800px" @close="close">
+		<el-form ref="form" :model="form" :rules="rules">
+			<div class="lists">
+				<el-form-item label="id" prop="id">
+					<el-input class="inputs" v-model="form.id" autocomplete="off" :disabled="!idAdd?true:false"></el-input>
+				</el-form-item>
+				<el-form-item label="型号编号" prop="modelid">
+					<el-input class="inputs" v-model.trim="form.modelid" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="风速/光照度" prop="speed">
+					<el-input class="inputs" v-model="form.speed" autocomplete="off"></el-input>
+				</el-form-item>
+				<el-form-item label="稳态功率相当于理论" prop="theorypower">
+					<el-input class="inputs" v-model="form.theorypower" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="动态功率保证功率" prop="ensurepower">
+					<el-input class="inputs" v-model="form.ensurepower" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+		</el-form>
+		<div slot="footer" class="dialog-footer">
+			<el-button @click="close">取 消</el-button>
+			<el-button type="primary" @click="save">确 定</el-button>
+		</div>
+	</el-dialog>
+</template>
+
+<script>
+import api from '@/api/realtimeDatabaseConfiguration'
+import dayjs from "dayjs";
+export default {
+	name: 'TableEdit',
+	props: {
+		options: {
+			type: Array,
+			default: []
+		},
+		stationList: {
+			type: Array,
+			default: []
+		},
+	},
+	data() {
+		return {
+			form: {
+				id: '',
+				modelid: '',
+				speed: '',
+				theorypower: '',
+				ensurepower: ''
+
+			},
+			rules: {
+				id: [{ required: true, trigger: 'blur', message: '请输入' }],
+				modelid: [{ required: true, trigger: 'blur', message: '请输入' }],
+				speed: [{ required: true, trigger: 'blur', message: '请输入' }],
+				theorypower: [{ required: true, trigger: 'blur', message: '请输入' }],
+				ensurepower: [{ required: true, trigger: 'blur', message: '请输入' }]
+			},
+			title: '',
+			dialogFormVisible: false,
+			idAdd: true,
+		}
+	},
+	created() { },
+	methods: {
+		showEdit(row) {
+			if (!row) {
+				this.title = '添加'
+				this.idAdd = true
+			} else {
+				this.title = '编辑'
+				this.idAdd = false
+				this.form = Object.assign({}, row)
+			}
+			this.dialogFormVisible = true
+		},
+		close() {
+			this.$refs['form'].resetFields()
+			this.form = this.$options.data().form
+			this.dialogFormVisible = false
+			this.$emit('fetch-data')
+		},
+		save() {
+			this.$refs['form'].validate(async (valid) => {
+				if (valid) {
+					api.addModelpower(this.form).then(res => {
+						if (res.data) {
+							this.$message({
+								type: 'success',
+								message: '添加成功!'
+							});
+							this.$emit('save-success');
+							this.dialogFormVisible = false
+						}
+					})
+				} else {
+					return false
+				}
+			})
+		},
+		handleChange() {
+		},
+		onBlur(val, param) {
+			if (typeof (this.form[param]) !== 'number') {
+				this.form[param] = val.replace(/[^0-9]/ig, "")
+			}
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.inputs {
+	width: 200px;
+}
+
+.lists {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+}
+</style>

+ 217 - 0
src/views/stationConfiguration/modelpower/index.vue

@@ -0,0 +1,217 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<div class="title">
+				<div class="left">
+					<div class="left-item">
+						<div style="width: 70px;">名称:</div>
+						<el-input v-model="fuzzyQuery_name" placeholder="请输入" clearable />
+					</div>
+					<el-button icon="el-icon-search" type="primary" native-type="submit" @click="fetchData">
+						查询
+					</el-button>
+				</div>
+				<div class="right">
+					<el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+						添加
+					</el-button>
+					<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+						删除
+					</el-button>
+					<UploadExcel style="margin-left: 10px;" @getResult="getMyExcelData"></UploadExcel>
+					<ExportExcel :exportList="exportExcel" :useType="'export'" partsName="设备类型"></ExportExcel>
+					<ExportExcel :exportList="templateExcel" :useType="'template'" partsName="设备类型模板"></ExportExcel>
+				</div>
+			</div>
+			<el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+				:height="height" @selection-change="setSelectRows">
+				<el-table-column show-overflow-tooltip type="selection" width="40"></el-table-column>
+				<el-table-column show-overflow-tooltip label="id" prop="id" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="型号编号" prop="modelid" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="风速/光照度" prop="speed" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="稳态功率相当于理论" prop="theorypower" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="动态功率保证功率" prop="ensurepower" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="操作" width="100px" fixed="right">
+					<template #default="{ row }">
+						<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+						<el-button type="text" @click="handleDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination :background="background" :current-page="queryForm.pageNo" :layout="layout"
+				:page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange"
+				@size-change="handleSizeChange"></el-pagination>
+			<table-edit ref="edit" :options="options" :stationList="stationList" @save-success="fetchData"></table-edit>
+		</vab-query-form>
+	</div>
+</template>
+<script>
+import UploadExcel from '@/components/UploadExcel/index'
+import ExportExcel from '@/components/ExportExcel/index'
+import api from '@/api/realtimeDatabaseConfiguration'
+import stationApi from '@/api/station'
+import TableEdit from './components/TableEdit'
+export default {
+	components: {
+		UploadExcel,
+		ExportExcel,
+		TableEdit,
+	},
+	data() {
+		return {
+			fuzzyQuery_name: '',
+			listLoading: true,
+			list: [],
+			options: [],
+			exportExcel: [],
+			templateExcel: [],
+			elementLoadingText: '正在加载...',
+			selectRows: '',
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			exportList: [],
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+			},
+			stationList: [],
+			selectValue: ''
+		};
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		// this.getStation()
+		this.fetchData()
+	},
+	methods: {
+		getMyExcelData(val) {
+			val.forEach(item => {
+				api.addModelpower(item).then(res => {
+					if (res.code == 200) {
+						this.$message({
+							type: 'success',
+							message: '添加成功!'
+						});
+						this.fetchData()
+					}
+				})
+			})
+		},
+		getStation() {
+			stationApi.windpowerstationList({
+				id: '',
+				name: '',
+				companyid: '',
+				pageNum: 1,
+				pageSize: 1000,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.stationList = res.data.records
+				}
+			})
+		},
+		fetchData() {
+			api.modelpower({
+				name: this.fuzzyQuery_name,
+				pageNum: this.queryForm.pageNo,
+				pageSize: this.queryForm.pageSize,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.total = res.data.total
+					this.list = res.data.records
+					this.templateExcel = [
+						{
+							id: '',
+							modelid: '',
+							speed: '',
+							theorypower: '',
+							ensurepower: ''
+						}
+					]
+					// 导出
+					let exportExcel = []
+					res.data.records.forEach(item => {
+						exportExcel.push({
+							id: item.id,
+							modelid: item.modelid,
+							speed: item.speed,
+							theorypower: item.theorypower,
+							ensurepower: item.ensurepower
+						})
+					})
+					this.exportExcel = exportExcel
+				}
+			})
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id || this.selectRows.length > 0) {
+				this.$baseConfirm('你确定要删除吗', null, async () => {
+					let ids = ''
+					if (this.selectRows.length > 0) {
+						ids = this.selectRows.map((item) => item.id).join()
+					}
+					api.deleteModelpower({
+						id: row.id || ids
+					}).then(res => {
+						if (res.data) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				this.$baseMessage('未选中任何行', 'error')
+				return false
+			}
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20px;
+}
+
+.left {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+
+	.left-item {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		margin-right: 10px;
+	}
+}
+</style>

+ 116 - 0
src/views/stationConfiguration/projectstudy/components/TableEdit.vue

@@ -0,0 +1,116 @@
+<template>
+	<el-dialog :title="title" :visible.sync="dialogFormVisible" width="800px" @close="close">
+		<el-form ref="form" :model="form" :rules="rules">
+			<el-form-item label="场站" prop="cascaderSel" v-if="idAdd">
+				<el-cascader v-model="form.cascaderSel" :options="options"
+					:props="{ checkStrictly: true, label: 'name', value: 'id' }" clearable>
+				</el-cascader>
+			</el-form-item>
+			<el-form-item label="场站" prop="generatingcapacity" v-if="!idAdd">
+				<el-input class="inputs" v-model="form.windpower" disabled></el-input>
+			</el-form-item>
+			<el-form-item label="期次" prop="generatingcapacity" v-if="!idAdd">
+				<el-input class="inputs" v-model="form.projectid" disabled></el-input>
+			</el-form-item>
+			<el-form-item label="计划发电量" prop="generatingcapacity">
+				<el-input class="inputs" v-model="form.generatingcapacity"></el-input>
+			</el-form-item>
+			<el-form-item label="计划停运小时" prop="outagehours">
+				<el-input class="inputs" v-model="form.outagehours"></el-input>
+			</el-form-item>
+			<el-form-item label="请选择日期" prop="dateValues">
+				<el-date-picker v-model="form.dateValues" type="month" placeholder="选择月" :disabled="!idAdd?true:false">
+				</el-date-picker>
+			</el-form-item>
+		</el-form>
+		<div slot="footer" class="dialog-footer">
+			<el-button @click="close">取 消</el-button>
+			<el-button type="primary" @click="handleSave()">确 定</el-button>
+		</div>
+	</el-dialog>
+</template>
+
+<script>
+import api from '@/api/table'
+export default {
+	name: 'TableEdit',
+	props: {
+		options: {
+			type: Array,
+			default: []
+		},
+	},
+	data() {
+		return {
+			form: {
+				generatingcapacity: '',
+				outagehours: '',
+				cascaderSel: [],
+				dateValues: '',
+			},
+			rules: {
+				generatingcapacity: [{ required: true, trigger: 'blur', message: '请输入发电量' }],
+				outagehours: [{ required: true, trigger: 'blur', message: '请输入停运小时' }],
+				cascaderSel: [{ required: true, trigger: 'blur', message: '请选择场站' }],
+				dateValues: [{ required: true, trigger: 'blur', message: '请选择日期' }],
+			},
+			title: '',
+			dialogFormVisible: false,
+			idAdd: true,
+		}
+	},
+	created() { },
+	methods: {
+		showEdit(row) {
+			if (!row) {
+				this.title = '添加'
+				this.idAdd = true
+			} else {
+				this.title = '编辑'
+				this.idAdd = false
+				this.form = Object.assign({}, row)
+				this.form.dateValues = this.form.year && this.form.month ? new Date(`${this.form.year}-${this.form.month}-01`).getTime() : ''
+			}
+			this.dialogFormVisible = true
+		},
+		close() {
+			this.$refs['form'].resetFields()
+			this.form = this.$options.data().form
+			this.dialogFormVisible = false
+			this.$emit('fetch-data')
+		},
+		handleSave() {
+			this.$refs['form'].validate(async (valid) => {
+				if (valid) {
+					this.form.year = new Date(this.form.dateValues).getFullYear()
+					this.form.month = new Date(this.form.dateValues).getMonth() + 1
+					if (!this.form.projectid) {
+						this.form.projectid = this.form.cascaderSel[2]
+					}
+					if (!this.form.windpower) {
+						this.form.windpower = this.form.cascaderSel[1]
+					}
+
+					api.addProjectstudy(this.form).then(res => {
+						if (res.code == 200) {
+							this.$message({
+								type: 'success',
+								message: '添加成功!'
+							});
+							this.$emit('handleSuccess');
+							this.dialogFormVisible = false
+						}
+					})
+				} else {
+					return false
+				}
+			})
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.inputs {
+	width: 200px;
+}
+</style>

+ 249 - 0
src/views/stationConfiguration/projectstudy/index.vue

@@ -0,0 +1,249 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<vab-query-form-left-panel>
+				<el-form ref="form" :model="queryForm" :inline="true" @submit.native.prevent>
+					<el-form-item>
+						<el-cascader class="cascaders" v-model="cascaderSel" :options="options"
+							:props="{ checkStrictly: true, label: 'name', value: 'id' }" clearable>
+						</el-cascader>
+					</el-form-item>
+					<el-form-item>
+						<el-button icon="el-icon-search" type="primary" native-type="submit" @click="handleQuery">
+							查询
+						</el-button>
+					</el-form-item>
+				</el-form>
+			</vab-query-form-left-panel>
+			<vab-query-form-right-panel>
+				<el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+					添加
+				</el-button>
+				<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+					删除
+				</el-button>
+			</vab-query-form-right-panel>
+		</vab-query-form>
+
+		<el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+			:height="height" @selection-change="setSelectRows" @sort-change="tableSortChange" show-summary
+			:summary-method="getSummaries">
+			<el-table-column show-overflow-tooltip type="selection" width="65"></el-table-column>
+			<el-table-column show-overflow-tooltip label="风场编号" prop="windpower" width="200" align="center" sortable>
+			</el-table-column>
+			<el-table-column show-overflow-tooltip label="工程编号" prop="projectid" align="center" sortable></el-table-column>
+			<el-table-column show-overflow-tooltip label="计划发电量" prop="generatingcapacity" align="center" sortable>
+			</el-table-column>
+			<el-table-column show-overflow-tooltip label="计划停运小时" prop="outagehours" align="center" sortable>
+			</el-table-column>
+			<el-table-column show-overflow-tooltip label="年份" prop="year" align="center" sortable></el-table-column>
+			<el-table-column show-overflow-tooltip label="月份" prop="month" align="center" sortable></el-table-column>
+			<el-table-column show-overflow-tooltip label="操作" width="180px">
+				<template #default="{ row }">
+					<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+					<el-button type="text" @click="handleDelete(row)">删除</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		<el-pagination :background="background" :current-page="queryForm.pageNo" :layout="layout"
+			:page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange"
+			@size-change="handleSizeChange"></el-pagination>
+		<table-edit ref="edit" :options="options" @handleSuccess="fetchData"></table-edit>
+	</div>
+</template>
+
+<script>
+import api from '@/api/table'
+import TableEdit from './components/TableEdit'
+export default {
+	name: 'ComprehensiveTable',
+	components: {
+		TableEdit
+	},
+	filters: {
+		statusFilter(status) {
+			const statusMap = {
+				published: 'success',
+				draft: 'gray',
+				deleted: 'danger',
+			}
+			return statusMap[status]
+		},
+	},
+	data() {
+		return {
+			imgShow: true,
+			list: [],
+			cascaderSel: [],
+			imageList: [],
+			listLoading: true,
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			selectRows: '',
+			elementLoadingText: '正在加载...',
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+				title: '',
+			},
+			options: []
+		}
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		this.getStation()
+		this.fetchData()
+	},
+	beforeDestroy() { },
+	mounted() { },
+	methods: {
+		getStation() {
+			api.wtls().then(res => {
+				if (res.data) {
+					this.options = res.data
+				}
+			})
+		},
+		tableSortChange() {
+			const imageList = []
+			this.$refs.tableSort.tableData.forEach((item, index) => {
+				imageList.push(item.img)
+			})
+			this.imageList = imageList
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id) {
+				this.$baseConfirm('你确定要删除当前项吗', null, async () => {
+					api.deleteProjectstudy({
+						id: row.id
+					}).then(res => {
+						if (res.code == 200) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				if (this.selectRows.length > 0) {
+					const ids = this.selectRows.map((item) => item.id).join()
+					this.$baseConfirm('你确定要删除选中项吗', null, async () => {
+						api.deleteProjectstudy({
+							id: ids
+						}).then(res => {
+							if (res.code == 200) {
+								this.$baseMessage('删除成功', 'success')
+								this.fetchData()
+							}
+						})
+					})
+				} else {
+					this.$baseMessage('未选中任何行', 'error')
+					return false
+				}
+			}
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleQuery() {
+			this.queryForm.pageNo = 1
+			this.fetchData()
+		},
+		async fetchData() {
+			this.listLoading = true
+			api.projectstudy({
+				pagenum: this.queryForm.pageNo,
+				pagesize: this.queryForm.pageSize,
+			}).then(res => {
+				if (res.data) {
+					this.total = res.data.total
+					this.list = res.data.records
+					setTimeout(() => {
+						this.listLoading = false
+					}, 500)
+				}
+			})
+
+		},
+		testMessage() {
+			this.$baseMessage('test1', 'success')
+		},
+		testALert() {
+			this.$baseAlert('11')
+			this.$baseAlert('11', '自定义标题', () => {
+				/* 可以写回调; */
+			})
+			this.$baseAlert('11', null, () => {
+				/* 可以写回调; */
+			})
+		},
+		testConfirm() {
+			this.$baseConfirm(
+				'你确定要执行该操作?',
+				null,
+				() => {
+					/* 可以写回调; */
+				},
+				() => {
+					/* 可以写回调; */
+				}
+			)
+		},
+		testNotify() {
+			this.$baseNotify('测试消息提示', 'test', 'success', 'bottom-right')
+		},
+		getSummaries(param) {
+			console.log(11111);
+			const { columns, data } = param;
+			const sums = [];
+			columns.forEach((column, index) => {
+				if (index === 0) {
+					sums[index] = '总计';
+					return;
+				}
+				else if (index === 3) {
+					let totle = 0
+					data.forEach(item => {
+						totle = totle + Number(item.generatingcapacity)
+					})
+					sums[index] = totle;
+				}
+				else if (index === 4) {
+					let totle = 0
+					data.forEach(item => {
+						totle = totle + Number(item.outagehours)
+					})
+					sums[index] = totle;
+				} else {
+					sums[index] = '--';
+				}
+			});
+			return sums;
+		}
+	},
+}
+</script>
+<style lang="less" scoped>
+.cascaders {
+	width: 300px;
+}
+</style>

+ 341 - 0
src/views/stationConfiguration/stationpersis/index.vue

@@ -0,0 +1,341 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<div class="title">
+				<div class="left">
+					<!-- <div class="left-item">
+						<div style="width: 70px;">名称:</div>
+						<el-input v-model="fuzzyQuery_name" placeholder="请输入" clearable />
+					</div>
+					<el-button icon="el-icon-search" type="primary" native-type="submit" @click="fetchData">
+						查询
+					</el-button> -->
+				</div>
+				<div class="right">
+					<!-- <el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+						添加
+					</el-button>
+					<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+						删除
+					</el-button> -->
+					<!-- <UploadExcel style="margin-left: 10px;" @getResult="getMyExcelData"></UploadExcel> -->
+					<!-- <ExportExcel :exportList="exportExcel" :useType="'export'" partsName="装机量"></ExportExcel> -->
+					<!-- <ExportExcel :exportList="templateExcel" :useType="'template'" partsName="设备类型模板"></ExportExcel> -->
+				</div>
+			</div>
+			<!-- <el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+				:height="height" @selection-change="setSelectRows">
+				<el-table-column show-overflow-tooltip type="selection" width="40"></el-table-column>
+				<el-table-column show-overflow-tooltip label="id" prop="id" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="编号" prop="code" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="名称" prop="name" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="装机容量" prop="capacity" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="装机容量单位" prop="capacityunit" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="装机台数" prop="quantity" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="机型" prop="model" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="厂家" prop="systemmanufact" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="地址" prop="address" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="操作" width="100px" fixed="right">
+					<template #default="{ row }">
+						<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+						<el-button type="text" @click="handleDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
+			</el-table> -->
+			<div :style="{ 'height': height + 'px', width: '100%' }">
+				<v-chart :options="option" style="width: 100%;"></v-chart>
+			</div>
+		</vab-query-form>
+	</div>
+</template>
+<script>
+import UploadExcel from '@/components/UploadExcel/index'
+import ExportExcel from '@/components/ExportExcel/index'
+import api from '@/api/realtimeDatabaseConfiguration'
+import stationApi from '@/api/station'
+import VChart from 'vue-echarts'
+import { use } from 'echarts/core';
+import { CanvasRenderer } from 'echarts/renderers';
+import { LineChart } from 'echarts/charts';
+import {
+	TitleComponent,
+	TooltipComponent,
+	LegendComponent,
+	DataZoomComponent,
+	GridComponent,
+	AxisPointerComponent
+} from 'echarts/components';
+import dayjs from 'dayjs'
+
+use([
+	CanvasRenderer,
+	LineChart,
+	TitleComponent,
+	TooltipComponent,
+	LegendComponent,
+	DataZoomComponent,
+	GridComponent,
+	AxisPointerComponent
+]);
+
+export default {
+	components: {
+		UploadExcel,
+		ExportExcel,
+		VChart,
+	},
+	data() {
+		return {
+			fuzzyQuery_name: '',
+			listLoading: true,
+			list: [],
+			options: [],
+			exportExcel: [],
+			templateExcel: [],
+			elementLoadingText: '正在加载...',
+			selectRows: '',
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			exportList: [],
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+			},
+			stationList: [],
+			selectValue: '',
+			option: {
+				title: {
+					showTitle: true,
+					subtext: "可滚轮缩放、左右拖动查看",
+					x: "center",
+					y: "20",
+				},
+				xAxis: {
+					type: "category",
+					data: [],
+				},
+				yAxis: [
+					{
+						name: '单位 (kw)',
+						type: "value",
+						position: 'left'
+					},
+					{
+						name: '单位 (kw)',
+						type: "value",
+						position: 'right'
+					}
+				],
+				legend: {
+					show: true,
+					x: "center",
+					y: "top",
+					itemWidth: 10,
+					itemHeight: 10,
+					data: ["理论功率", "实际功率"],
+					textStyle: {
+						fontSize: 10, //字体大小
+						color: "#000", //字体颜色
+					},
+				},
+				tooltip: {
+					show: true,
+					trigger: "axis",
+					// formatter(data) {
+					// 	let str = `${data[0].name}: <br />`;
+					// 	data.forEach((ele) => {
+					// 		let circle = `<span style="display:inline-block;margin-right:5px;border-radius:50%;width:10px;height:10px;left:5px;background-color:${ele.color}"></span>`;
+					// 		str += circle + `${ele.seriesName}: ${ele.value}% <br />`;
+					// 	});
+					// 	return str;
+					// },
+				},
+				grid: {
+					show: true,
+					left: "35",
+					// top: "23",
+					right: "30",
+					bottom: "23",
+				},
+				dataZoom: [
+					{
+						id: "dataZoomX",
+						type: "inside",
+						xAxisIndex: [0],
+						filterMode: "none",
+						start: 0,
+						end: 50,
+					},
+				],
+				series: [
+					// {
+					//   name: "部门培训率",
+					//   data: seriesData[0],
+					//   type: "bar",
+					//   itemStyle: {
+					//     color: "rgb(86,114,196)",
+					//   },
+					//   barMaxWidth: "25",
+					// },
+					// {
+					//   name: "部门考试合格率",
+					//   data: seriesData[1],
+					//   type: "bar",
+					//   itemStyle: {
+					//     color: "rgb(149,204,122)",
+					//   },
+					//   barMaxWidth: "25",
+					// },
+				],
+			}
+		};
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		// this.getStation()
+		this.fetchData()
+	},
+	watch: {
+		'$route'() {
+			// this.fetchData()
+		}
+	},
+	methods: {
+		getMyExcelData(val) {
+			val.forEach(item => {
+				api.addModelpower(item).then(res => {
+					if (res.code == 200) {
+						this.$message({
+							type: 'success',
+							message: '添加成功!'
+						});
+						this.fetchData()
+					}
+				})
+			})
+		},
+		getStation() {
+			stationApi.windpowerstationList({
+				id: '',
+				name: '',
+				companyid: '',
+				pageNum: 1,
+				pageSize: 1000,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.stationList = res.data.records
+				}
+			})
+		},
+		fetchData() {
+			const date = new Date()
+			// const pastDate = date.getTime() - 2592000000
+			const pastDate = date.getTime() - 43200000
+			stationApi.getStationPersis({
+				station: this.$route.query.station || '',
+				startdate: dayjs(pastDate).format('YYYY-M-D HH:mm:ss'),
+				enddate: dayjs().format('YYYY-M-D HH:mm:ss')
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					if (res.data && res.data.length) {
+						this.option.xAxis.data = res.data.map(o => dayjs(o.datatime).format('YYYY-M-D HH:mm:ss'))
+						this.option.series = [
+							{
+								name: '理论功率',
+								data: res.data.map(o => o.rpjfs),
+								type: 'line',
+								itemStyle: {
+									color: "rgb(86,114,196)",
+								},
+								yAxisIndex: 0
+							},
+							{
+								name: '实际功率',
+								data: res.data.map(o => o.sszgl),
+								type: 'line',
+								itemStyle: {
+									color: "rgb(149,204,122)",
+								},
+								yAxisIndex: 1
+							}
+						]
+					}
+				}
+			})
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id || this.selectRows.length > 0) {
+				this.$baseConfirm('你确定要删除吗', null, async () => {
+					let ids = ''
+					if (this.selectRows.length > 0) {
+						ids = this.selectRows.map((item) => item.id).join()
+					}
+					api.deleteModelpower({
+						id: row.id || ids
+					}).then(res => {
+						if (res.data) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				this.$baseMessage('未选中任何行', 'error')
+				return false
+			}
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20px;
+}
+
+.left {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+
+	.left-item {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		margin-right: 10px;
+	}
+}
+</style>

+ 136 - 0
src/views/stationConfiguration/windsubstation/components/TableEdit.vue

@@ -0,0 +1,136 @@
+<template>
+	<el-dialog :title="title" :visible.sync="dialogFormVisible" width="800px" @close="close">
+		<el-form ref="form" :model="form" :rules="rules">
+			<div class="lists">
+				<el-form-item label="id" prop="id">
+					<el-input class="inputs" v-model="form.id" autocomplete="off" :disabled="!idAdd?true:false"></el-input>
+				</el-form-item>
+				<el-form-item label="编码" prop="code">
+					<el-input class="inputs" v-model.trim="form.code" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="名称" prop="name">
+					<el-input class="inputs" v-model="form.name" autocomplete="off"></el-input>
+				</el-form-item>
+				<el-form-item label="别名" prop="aname">
+					<el-input class="inputs" v-model="form.aname" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="风场编号" prop="windpowerstationid">
+					<el-select v-model="form.windpowerstationid" placeholder="请选择" clearable>
+						<el-option v-for="item in stationList" :key="item.id" :label="item.name" :value="item.id">
+						</el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item label="顺序" prop="ordernum">
+					<el-input class="inputs" v-model="form.ordernum" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+		</el-form>
+		<div slot="footer" class="dialog-footer">
+			<el-button @click="close">取 消</el-button>
+			<el-button type="primary" @click="save">确 定</el-button>
+		</div>
+	</el-dialog>
+</template>
+
+<script>
+import api from '@/api/realtimeDatabaseConfiguration'
+import dayjs from "dayjs";
+export default {
+	name: 'TableEdit',
+	props: {
+		options: {
+			type: Array,
+			default: []
+		},
+		stationList: {
+			type: Array,
+			default: []
+		},
+	},
+	data() {
+		return {
+			form: {
+				id: '',
+				code: '',
+				name: '',
+				aname: '',
+				windpowerstationid: '',
+				ordernum: ''
+
+			},
+			rules: {
+				id: [{ required: true, trigger: 'blur', message: '请输入' }],
+				code: [{ required: true, trigger: 'blur', message: '请输入' }],
+				name: [{ required: true, trigger: 'blur', message: '请输入' }],
+				aname: [{ required: true, trigger: 'blur', message: '请输入' }],
+				windpowerstationid: [{ required: true, trigger: 'blur', message: '请输入' }],
+				ordernum: [{ required: true, trigger: 'blur', message: '请输入' }]
+			},
+			title: '',
+			dialogFormVisible: false,
+			idAdd: true,
+		}
+	},
+	created() { },
+	methods: {
+		showEdit(row) {
+			if (!row) {
+				this.title = '添加'
+				this.idAdd = true
+			} else {
+				this.title = '编辑'
+				this.idAdd = false
+				this.form = Object.assign({}, row)
+			}
+			this.dialogFormVisible = true
+		},
+		close() {
+			this.$refs['form'].resetFields()
+			this.form = this.$options.data().form
+			this.dialogFormVisible = false
+			this.$emit('fetch-data')
+		},
+		save() {
+			this.$refs['form'].validate(async (valid) => {
+				if (valid) {
+					api.addWindsubstation(this.form).then(res => {
+						if (res.data) {
+							this.$message({
+								type: 'success',
+								message: '添加成功!'
+							});
+							this.$emit('save-success');
+							this.dialogFormVisible = false
+						}
+					})
+				} else {
+					return false
+				}
+			})
+		},
+		handleChange() {
+		},
+		onBlur(val, param) {
+			if (typeof (this.form[param]) !== 'number') {
+				this.form[param] = val.replace(/[^0-9]/ig, "")
+			}
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.inputs {
+	width: 200px;
+}
+
+.lists {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+}
+</style>

+ 220 - 0
src/views/stationConfiguration/windsubstation/index.vue

@@ -0,0 +1,220 @@
+<template>
+	<div class="table-container">
+		<vab-query-form>
+			<div class="title">
+				<div class="left">
+					<div class="left-item">
+						<div style="width: 70px;">名称:</div>
+						<el-input v-model="fuzzyQuery_name" placeholder="请输入" clearable />
+					</div>
+					<el-button icon="el-icon-search" type="primary" native-type="submit" @click="fetchData">
+						查询
+					</el-button>
+				</div>
+				<div class="right">
+					<el-button icon="el-icon-plus" type="primary" @click="handleAdd">
+						添加成功
+					</el-button>
+					<el-button icon="el-icon-delete" type="danger" @click="handleDelete">
+						删除
+					</el-button>
+					<UploadExcel style="margin-left: 10px;" @getResult="getMyExcelData"></UploadExcel>
+					<ExportExcel :exportList="exportExcel" :useType="'export'" partsName="变电所"></ExportExcel>
+					<ExportExcel :exportList="templateExcel" :useType="'template'" partsName="变电所模板"></ExportExcel>
+				</div>
+			</div>
+			<el-table ref="tableSort" v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText"
+				:height="height" @selection-change="setSelectRows">
+				<el-table-column show-overflow-tooltip type="selection" width="40"></el-table-column>
+				<el-table-column show-overflow-tooltip label="id" prop="id" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="编码" prop="code" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="名称" prop="name" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="别名" prop="aname" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="风场编号" prop="windpowerstationid" align="center" sortable>
+				</el-table-column>
+				<el-table-column show-overflow-tooltip label="顺序" prop="ordernum" align="center" sortable></el-table-column>
+				<el-table-column show-overflow-tooltip label="操作" width="100px" fixed="right">
+					<template #default="{ row }">
+						<el-button type="text" @click="handleEdit(row)">编辑</el-button>
+						<el-button type="text" @click="handleDelete(row)">删除</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination :background="background" :current-page="queryForm.pageNo" :layout="layout"
+				:page-size="queryForm.pageSize" :total="total" @current-change="handleCurrentChange"
+				@size-change="handleSizeChange"></el-pagination>
+			<table-edit ref="edit" :options="options" :stationList="stationList" @save-success="fetchData"></table-edit>
+		</vab-query-form>
+	</div>
+</template>
+<script>
+import UploadExcel from '@/components/UploadExcel/index'
+import ExportExcel from '@/components/ExportExcel/index'
+import api from '@/api/realtimeDatabaseConfiguration'
+import stationApi from '@/api/station'
+import TableEdit from './components/TableEdit'
+export default {
+	components: {
+		UploadExcel,
+		ExportExcel,
+		TableEdit,
+	},
+	data() {
+		return {
+			fuzzyQuery_name: '',
+			listLoading: true,
+			list: [],
+			options: [],
+			exportExcel: [],
+			templateExcel: [],
+			elementLoadingText: '正在加载...',
+			selectRows: '',
+			layout: 'total, sizes, prev, pager, next, jumper',
+			total: 0,
+			background: true,
+			exportList: [],
+			queryForm: {
+				pageNo: 1,
+				pageSize: 20,
+			},
+			stationList: [],
+			selectValue: ''
+		};
+	},
+	computed: {
+		height() {
+			return this.$baseTableHeight() + 50
+		},
+	},
+	created() {
+		this.getStation()
+		this.fetchData()
+	},
+	methods: {
+		getMyExcelData(val) {
+			val.forEach(item => {
+				api.addWindsubstation(item).then(res => {
+					if (res.code == 200) {
+						this.$message({
+							type: 'success',
+							message: '添加成功!'
+						});
+						this.fetchData()
+					}
+				})
+			})
+		},
+		getStation() {
+			stationApi.windpowerstationList({
+				id: '',
+				name: '',
+				companyid: '',
+				pageNum: 1,
+				pageSize: 1000,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.stationList = res.data.records
+				}
+			})
+		},
+		fetchData() {
+			api.windsubstation({
+				name: this.fuzzyQuery_name,
+				pageNum: this.queryForm.pageNo,
+				pageSize: this.queryForm.pageSize,
+			}).then(res => {
+				if (res.data) {
+					this.listLoading = false
+					this.total = res.data.total
+					this.list = res.data.records
+					this.templateExcel = [
+						{
+							id: '',
+							code: '',
+							name: '',
+							aname: '',
+							windpowerstationid: '',
+							ordernum: ''
+						}
+					]
+					// 导出
+					let exportExcel = []
+					res.data.records.forEach(item => {
+						exportExcel.push({
+							id: item.id,
+							code: item.code,
+							name: item.name,
+							aname: item.aname,
+							windpowerstationid: item.windpowerstationid,
+							ordernum: item.ordernum
+						})
+					})
+					this.exportExcel = exportExcel
+				}
+			})
+		},
+		handleSizeChange(val) {
+			this.queryForm.pageSize = val
+			this.fetchData()
+		},
+		handleCurrentChange(val) {
+			this.queryForm.pageNo = val
+			this.fetchData()
+		},
+		handleAdd() {
+			this.$refs['edit'].showEdit()
+		},
+		handleEdit(row) {
+			this.$refs['edit'].showEdit(row)
+		},
+		handleDelete(row) {
+			if (row.id || this.selectRows.length > 0) {
+				this.$baseConfirm('你确定要删除吗', null, async () => {
+					let ids = ''
+					if (this.selectRows.length > 0) {
+						ids = this.selectRows.map((item) => item.id).join()
+					}
+					api.deleteWindsubstation({
+						id: row.id || ids
+					}).then(res => {
+						if (res.data) {
+							this.$baseMessage('删除成功', 'success')
+							this.fetchData()
+						}
+					})
+				})
+			} else {
+				this.$baseMessage('未选中任何行', 'error')
+				return false
+			}
+		},
+		setSelectRows(val) {
+			this.selectRows = val
+		},
+	},
+}
+</script>
+<style lang="less" scoped>
+.title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	justify-content: space-between;
+	margin-bottom: 20px;
+}
+
+.left {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+
+	.left-item {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		margin-right: 10px;
+	}
+}
+</style>