Browse Source

2022-10-25 update

1. 增加设备厂商、设备类型、变电所、可研电量等页面
2. 联调上述接口
moccus 2 years ago
parent
commit
a3c1f57694

+ 97 - 1
src/api/realtimeDatabaseConfiguration.js

@@ -19,8 +19,104 @@ 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",
+  })
+}
+
+// 可研电量
+const projectstudy =(data)=>{
+  return request({
+      url:`/projectstudy/listByPage?name=${encodeURIComponent(data.name)}&pageNum=${data.pageNum}&pageSize=${data.pageSize}`,
+      method:"get"
+  })
+}
+const addProjectstudy =(pairs)=>{
+  return request({
+      url:`/projectstudy/save`,
+      method:"post",
+      data: pairs
+  })
+}
+const deleteProjectstudy =(data)=>{
+  return request({
+      url:`/projectstudy/remove-study/${data.id}`,
+      method:"delete",
+  })
+}
 export default {
 	database,
 	addDatabase,
-	deleteDatabase
+	deleteDatabase,
+	addManufacturer,
+	addModelpower,
+	addWindsubstation,
+	manufacturer,
+	modelpower,
+	windsubstation,
+	deleteManufacturer,
+	deleteModelpower,
+	deleteWindsubstation,
+	addProjectstudy,
+	projectstudy,
+	deleteProjectstudy
 }

+ 28 - 0
src/router/index.js

@@ -122,6 +122,34 @@ 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: '可研电量' },
+      },
     ],
   },
 	{

+ 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>

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

@@ -0,0 +1,140 @@
+<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="projectid">
+					<el-input class="inputs" v-model.trim="form.projectid" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="计划发电量" prop="generatingcapacity">
+					<el-input class="inputs" v-model="form.generatingcapacity" autocomplete="off"></el-input>
+				</el-form-item>
+				<el-form-item label="计划停运小时" prop="outagehours">
+					<el-input class="inputs" v-model="form.outagehours" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="年" prop="year">
+					<el-input class="inputs" v-model="form.year" autocomplete="off"></el-input>
+				</el-form-item>
+				<el-form-item label="月" prop="month">
+					<el-input class="inputs" v-model="form.month" autocomplete="off"></el-input>
+				</el-form-item>
+			</div>
+			<div class="lists">
+				<el-form-item label="场站编号冗余" prop="windpowerid">
+					<el-input class="inputs" v-model="form.windpowerid" 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: '',
+				projectid: '',
+				generatingcapacity: '',
+				outagehours: '',
+				year: '',
+				month: '',
+				windpowerid: ''
+
+			},
+			rules: {
+				id: [{ required: true, trigger: 'blur', message: '请输入' }],
+				projectid: [{ required: true, trigger: 'blur', message: '请输入' }],
+				generatingcapacity: [{ required: true, trigger: 'blur', message: '请输入' }],
+				outagehours: [{ required: true, trigger: 'blur', message: '请输入' }],
+				year: [{ required: true, trigger: 'blur', message: '请输入' }],
+				month: [{ required: true, trigger: 'blur', message: '请输入' }],
+				windpowerid: [{ 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.addProjectstudy(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>

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

@@ -0,0 +1,226 @@
+<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="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="场站编号冗余" prop="windpowerid" 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.addProjectstudy(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.projectstudy({
+				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: '',
+							projectid: '',
+							generatingcapacity: '',
+							outagehours: '',
+							year: '',
+							month: '',
+							windpowerid: ''
+						}
+					]
+					// 导出
+					let exportExcel = []
+					res.data.records.forEach(item => {
+						exportExcel.push({
+							id: item.id,
+							projectid: item.projectid,
+							generatingcapacity: item.generatingcapacity,
+							outagehours: item.outagehours,
+							year: item.year,
+							month: item.month,
+							windpowerid: item.windpowerid
+						})
+					})
+					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.deleteProjectstudy({
+						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>